在前面讲过,内核为多个进程分配时间片去执行达到一种“多任务”的错觉。

进程优先级

硬实时进程:有严格的时间限制,某些任务必须在限定的时间内完成。换言之就是,系统必须保证绝不会超过某一个时间范围就能执行完。Linux不只是硬实时处理,一些修改版本如RTLinux支持该特性。
软实时进程:是硬实时进程的一种弱化形式。依然希望能在时间内得到结果,稍微晚一点也没有关系。
大多进程是没有特定时间约束的普通进程,但是亦可以为其分配优先级。

进程的生命周期

进程不是一创建救能执行的。有时候必须等待外部信号源、某些事件。
进程会有如下几个状态:

  • 运行:进程正在执行
  • 等待:能够开始执行,但是没被分配到处理机或时间片,需要等待调度器下一次选择该进程。
  • 睡眠:在等待一个外部世界,如等待输入,在外部输入事件产生之前,调度器下次也不能选择该进程。

进程的表示结构

task_struct包含如下内容:

  • 状态和执行信息
  • 已分配的虚拟内存信息
  • 进程的凭据:如PID、GID、权限等
  • 待执行的二进制文件代码
  • 运行时间数据
  • 信号处理程序
  • 进程间通信信息

进程的类型

由exec/fork产生的,参考第一篇文章

进程管理的系统调用

进程复制

  1. fork:重量级调用,建立父进程的完整副本然后作为子进程执行。
  2. vfork:与fork类似,但不创建副本,而是与父进程共享数据。
  3. clone:产生线程,除必要资源复制外,其他与进程共享,可以在父子进程间进行精确控制。

写时复制

防止在fork进程创建时就将数据完整的复制一份到子进程,也是按需复制,避免使用了大量内存和耗费大量时间。

执行系统调用

fork、vfork、clone的系统实现分别为sys_fork、sys_vfork、sys_clone函数

复制进程

在do_fork时,大多数工作都由copy_process函数完成。
3333.png

内核线程

内核线程时直接由内核本身启动的进程(init),通常称为内核守护进程。它们用于执行下列任务:

  1. 周期行的对内存页和块设备同步
  2. 将较少使用的内存小写入交换区
  3. 管理延时动作
  4. 实现文件系统的事务日志

将内核线程分为两种类型:

  1. 线程启动后一直等待,直到内核请求线程执行某一特定操作。
  2. 周期性的间隔运行,用于检测资源等。

启动新程序

通过execve系统调用,可以启用新的程序
4444.png
解析二进制格式:每种二进制格式必须提供下面3个函数:

  1. load_binary 用于加载普通程序
  2. load_shlib 用于加载动态库
  3. core_dump 在程序错误时输出内存转储

进程的退出

进程使用exit函数来终止进程,内核会进程资源的释放。

Last modification:July 8, 2022
If you think my article is useful to you, please feel free to appreciate