在linux内核中管理进程的方式,是创建了一个双向循环链表,然后这个链接上每一个成员就是一个task_struct结构体,每一个结构体就是一个进程,这玩意,太大了,这里我的精神不允许我叭叭那么多,所以我就调几个成员说,主要就是描述这个进程中的状态标志啊,pid号啊,优先级啊,他爹是谁(父进程),打开的文件,进程地址空间,挂起的信号,进程的状态等等。要知道一个task_struct占用大概1.8kb大小呢,感觉还是挺大的,但是他管理的是一个系统的一个进程,相对来说,也不大。

但是在内核中分配进程描述符并不是乱分配的,它使用的是一个叫slab算法来分配的(这里可以自行百度slab算法)

在linux系统每一个进程都是独一无二的,所以说必须有一个变量代表他,以便于linux调度,每一个进程都有一个pid,这个pid是一个int型变量,这个东西是可以配置的,当然他有一个默认值,默认值就是int型最大值,内核把他放到这个描述符中,就是那个task_struct结构体,在普遍产品中这个值是够的,但是这个值对于我们做产品来说  还是小一点好,这样子在内核进行轮训的时候 才会变快,进程数越小就越快嘛,但是有的应用场景就不行了要是弄一个大型服务器可能就不够了,所以我们可以修改这个值:

查看最大值的方式:cat /proc/sys/kernel/pid_max设置这个最大值的方式: echo 1234567 > /proc/sys/kernel/pid_max

如果我们在内核中需要需要到当前运行的进程的中的变量的话,那么请使用宏 current 这个宏就是当前内核中运行的进程的描述符。

在进程描述符中有一个成员是state,他表示当前进程的状态,在内核运行期间,每个进程必然是有一个自己的运行状态,分别如下:运行 :正在执行,等待执行的进程

可中断:正在休眠,被阻塞住的,等待信号唤醒的进程。

不可中断:必须等待特定的信号才会被唤醒的进程,ps的时候里面带D的,你会发现你kill不掉他,就是这玩意。

停止:没有投入运行,也不能投入运行的进程,一般都是被信号暂停的进程。

a

内核在调度进程的过程中需要设置进程的状态使用的函数是set_task_state(task.state);

对于一个进程来说,除了init进程其余的都是有爸爸的,只是看他爸爸后台硬不硬而已,而且在父进程注销掉后,它旗下的所有子进程内核会重新给他安排个爸爸,是不是很奇怪,干爹就是这么来的。

但是所有的进程的父进程都是pid为1的init进程,这个init进程是读取系统的初始化脚本,并且执行相关程序,最终完成整个系统的启动。

在每个进程描述符中都一个parent的指针和一个children的指针,所以这就代表着不同的进程可以有一个爹。因为有这个指针我们就可以遍历这个链表找到这个进程树下的任何一个进程描述符。

进程的创建方式在用户空间实际上就一种方式就是fork,只不过他有很多变种函数,最终执行的都是一个clone函数,这个fork函数就是写时拷贝的体现,他并不是把父进程的所有地址空间都拷贝,而是让父子进程共用一个拷贝,而且只有在需要写入的时候,数据才会被复制,在这之前实际上只是资源只读共享,如果需要使用的时候才会复制,然后改写。

fork执行步骤:

这里提一下linux线程,实际上线程就是进程,在linux里面没有线程的说法,创建线程的方法最后同样也是调用clone函数,只是他会将当前进程得资源进行共享,所以传递的参数与进程有一些不一样而已,clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);参数标志含义

CLONE_FILES父子进程共享打开的文件

CLONE_FS父子进程共享文件系统信息

CLONE_IDLETASK将pid设置为0

CLONE_NEWNE为子进程创建新的命令空间

CLONE_PARENT制定子进程与父进程拥有同一个父进程

CLONE_PTRACE继续调试子进程

CLONE_SETTID将TID会写到用户空间

CLONE_SETTLS为子进程创建新的TLS

CLONE_SIGHAND父子进程共享信号处理函数以及被阻断的信号

CLONE_SYSVSEM父子进程共享SYstem v SEM_UNDO定义

CLONE_THREAD父子进程进入相同的线程组

CLONE_VFORK调用vfork,所以父进程准备睡眠等待子进程将它唤醒

CLONE_UNTRACED防止跟踪进程在子进程上强制执行CLONE_PTRACE

CLONE_STOP以TASK_STOPPED状态开始进程

CLONE_SETTLS为子进程创建新的TLS

CLONE_CHILE_CLEARTID清除子进程的TID

CLONE_CHILE_SETTID设置子进程的TID

CLONE_PARENT_SETTID设置父进程的TID

CLONE_VM父子进程共享地址空间

内核线程实际上跟用户空间的进程唯一的差别就是没有独立的地址空间,对于用户层空间的一个进程来说他认为自己占用4G的虚拟内存空间,但是内核线程没有,在内核中创建线程的函数如下:

struct task_struct *kthread_create(int (*threadfn)(void *data),void *data , const char namefmt[],...);

进程终结,就意味着他要释放掉他占用的资源并且把这个消息告诉他爸爸,但是实际上进程的析构(学过面向对象的都知道就是了结了自己要做的操作,类似于close)都是资深引起的,他发生在自己调用exit()时,最后都是调用到内核层的do_exit()函数,他的流程如下,上图!

总结:这里主要讲解的是进程在内核中从开始到结束的一系列过程,进程是怎么通过clone函数创建的,父进程是怎么回去子进程的属性的,进程是怎么消亡的,以及线程和进程之间的关系。

linux如何管理进程,在嵌入式linux中进程是怎么管理的相关推荐

  1. 尚观linux视频配套教程,尚观最新嵌入式Linux基础视频教程 98集嵌入式Linux巨制视频教程 新手必备...

    尚观最新嵌入式Linux基础视频教程 98集嵌入式Linux巨制视频教程 新手必备 5.jpg (67.09 KB, 下载次数: 0) 2018-4-16 09:34 上传 1.jpg (44.17 ...

  2. linux卸载cf卡命令,嵌入式Linux 中CF卡的驱动和管理技术研究

    在嵌入式Linux系统中,为了在没有PCMCIA控制器的情况下仍然要利用CompactFlash存储卡(简称CF卡)作为存储设备,作者从CF卡的硬件特性入手,在系统层基于CF卡的memory寻址访问方 ...

  3. linux QT 结束当前进程_嵌入式linux编程开发必备知识

    嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...

  4. linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]

    转发请注明出处: 最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识.为了备忘和理清思路现整理成文,以便日后查阅. 移动设备由于自身的限制有一个硬伤就是电量的消耗问题.由于电池的电量有限,所 ...

  5. pc安装linux内核,PC/104平台嵌入式Linux系统核心定制方法

    摘 要:基于PC/104平台的嵌入式Linux技术在海洋自动观测系统中具有广泛的应用前景,Linux核心定制方法的研究是嵌入式Linux系统研制的关键工作.本文结合PC/104平台嵌入式Linux系统 ...

  6. 嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

    嵌入式linux项目开发(一)--BOA移植 项目目标:使用BOA.CGIC.SQLite搭建嵌入式web服务器 一.嵌入式web服务器BOA简介 在嵌入式设备的管理与交互中,基于Web方式的应用成为 ...

  7. linux裁剪内核和移植,嵌入式Linux内核裁剪及移植的研究与实现

    摘要: 嵌入式操作系统是嵌入式系统的软件核心,它管理系统中所有的软件和硬件资源,并且满足嵌入式系统的专用性和可裁剪性.嵌入式Linux以其开源,可裁剪以及模块化设计等特点,吸引了国内外众多研发人员的青 ...

  8. linux 按键驱动中断 rockchip_嵌入式linux快速入门(转载)

    从上图可以知道: ① 组成:嵌入式Linux系统 = bootloader + linux内核 + 根文件系统(里面含有APP). ② bootloader:它的目的是启动内核,去哪读内核?读到哪里? ...

  9. linux开组态软件,基于嵌入式Linux的组态软件实时数据库的设计

    1 引言 实时数据库(real-TIme database, RTDB)作为组态软件设计与实现的核心内容解决了其所 应对的现代工业生产现场环境中生产数据与控制数据类型复杂多样,数据处理与事件调度时 间 ...

最新文章

  1. ShareEntryActivity java.lang.ClassNotFoundException | Android类找不到问题
  2. linux命令行之find详解
  3. python 数据分析学什么-数据分析培训学习多久?都学什么?
  4. mysqldumper
  5. linux中有fd set函数吗,LINUX下FD_SET介绍
  6. 【需求工程】需求应用域理解
  7. saltstack的简单安装和配置
  8. 如何查看电脑上是否安装有IIS服务
  9. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
  10. 老外写的关于协程的性能文章-主打http协议
  11. c#解析json字符串数组_在C#中解析Json字符串
  12. 用html页面制作开关,自己做了几个可以直接套用的 HTML5 小开关
  13. 【Zotero】使用坚果云同步PC端和IOS端
  14. 微信公众号花式排版技巧分享
  15. ffmpeg学习 函数分析swr_convert
  16. HTML简易奥运五环
  17. 文档在线化管理系统Confluce使用
  18. raspberry pi_许多Raspberry Pi项目-您怎么不爱小型计算机?
  19. 短路的原因与危害有哪些
  20. r语言 matlab 函数定义,R语言-编写自定义函数 ZZ

热门文章

  1. 我是吴恩达:人在美国,刚上知乎,先答个「如何系统学习机器学习」
  2. 交流中交易:金融业的专业社交
  3. oracle的几个服务含义,oracle 的几个服务
  4. Leetcode刷题 ——— (1)仅仅反转字母
  5. Extjs 3.0.0 问题总结
  6. c++使用ODBC读取EXCEL表格
  7. 最大公约数与最小公倍数的C语言实现
  8. arcsinx,arctanx反函数求导
  9. 日程安排html模板,一款基于日历的日程安排应用模板
  10. 征服 JavaScript 面试:什么是闭包?| Eric Elliott