在前面讲过,内核为多个进程分配时间片去执行达到一种“多任务”的错觉。
进程优先级
硬实时进程:有严格的时间限制,某些任务必须在限定的时间内完成。换言之就是,系统必须保证绝不会超过某一个时间范围就能执行完。Linux不只是硬实时处理,一些修改版本如RTLinux支持该特性。
软实时进程:是硬实时进程的一种弱化形式。依然希望能在时间内得到结果,稍微晚一点也没有关系。
大多进程是没有特定时间约束的普通进程,但是亦可以为其分配优先级。
进程的生命周期
进程不是一创建救能执行的。有时候必须等待外部信号源、某些事件。
进程会有如下几个状态:
- 运行:进程正在执行
- 等待:能够开始执行,但是没被分配到处理机或时间片,需要等待调度器下一次选择该进程。
- 睡眠:在等待一个外部世界,如等待输入,在外部输入事件产生之前,调度器下次也不能选择该进程。
进程的表示结构
task_struct包含如下内容:
- 状态和执行信息
- 已分配的虚拟内存信息
- 进程的凭据:如PID、GID、权限等
- 待执行的二进制文件代码
- 运行时间数据
- 信号处理程序
- 进程间通信信息
进程的类型
由exec/fork产生的,参考第一篇文章
进程管理的系统调用
进程复制
- fork:重量级调用,建立父进程的完整副本然后作为子进程执行。
- vfork:与fork类似,但不创建副本,而是与父进程共享数据。
- clone:产生线程,除必要资源复制外,其他与进程共享,可以在父子进程间进行精确控制。
写时复制
防止在fork进程创建时就将数据完整的复制一份到子进程,也是按需复制,避免使用了大量内存和耗费大量时间。
执行系统调用
fork、vfork、clone的系统实现分别为sys_fork、sys_vfork、sys_clone函数
复制进程
在do_fork时,大多数工作都由copy_process函数完成。
内核线程
内核线程时直接由内核本身启动的进程(init),通常称为内核守护进程。它们用于执行下列任务:
- 周期行的对内存页和块设备同步
- 将较少使用的内存小写入交换区
- 管理延时动作
- 实现文件系统的事务日志
将内核线程分为两种类型:
- 线程启动后一直等待,直到内核请求线程执行某一特定操作。
- 周期性的间隔运行,用于检测资源等。
启动新程序
通过execve系统调用,可以启用新的程序
解析二进制格式:每种二进制格式必须提供下面3个函数:
- load_binary 用于加载普通程序
- load_shlib 用于加载动态库
- core_dump 在程序错误时输出内存转储
进程的退出
进程使用exit函数来终止进程,内核会进程资源的释放。