Linux进程管理
- 什么是进程
- 进程是在处理器中执行的实例,内核调度各类资源来满足进程的需求。
- 运行在Linux操作系统的进程都被task_struct这个结构体管理,task_struct也被称为进程描述符。
- 进程的生命周期
- 一个进程创建一个线程,创建进程的进程使用名为fork()的系统调用,fork()被调用的时候,会为新创建的子进程获得一个进程描述符,并且设置新的进程ID。
- 由于共享同样的地址空间,写入新进程的数据会引发页错误的异常。此时,内核给子进程分配新的物理页。这个延迟的操作叫做Copy On Write。
- 当程序执行完成,子进程使用exit()系统调用终止。exit()会释放进程的大部分数据结构,并且把这个终止的消息通知给父进程。这时候,子进程被称为zombie process(僵尸进程)。
- 线程
- 线程是单个进程中生成的执行单元。多个线程在同一个进程中并发运行。共享内存,地址空间,打开文件等。
- 从性能的角度看,创建线程比创建进程更加低消耗。
- 进程优先级和nice级别
- 进程优先级由动态优先级和静态优先级决定,它是决定进程在CPU中执行顺序的数字。优先级越高的进程被处理器执行的机会越大。
- Linux支持的nice级别从19(最低优先级)到-20(最高优先级),默认只是0。只有root身份的用户才能把进程的nice级别调整为负数(让其具备较高优先级)。
- 切换上下文
- 在进程执行过程中,进程的信息存放在处理器的寄存器和缓存中。这部分执行中进程存放在寄存器中的数据就叫做context。进程切换就叫做上下文切换(context switching)。
- 中断处理
- 中断处理是最高优先级别的任务之一。中断通常由I/O设备产生。
- Linux中有两类中断,硬中断是由设备产生的需要做出响应的中断,软中断用于任务处理。
- 进程状态
- TASK_RUNNING:进程在CPU执行或者在运行队列中等待运行
- TASK_STOPPED:进程处于挂起状态
- TASK_INTERRUPTIBLE:进程挂起并且等待一个特定条件
- TASK_UNINTERRUPTIBLE:常表示进程等待磁盘I/O操作
- TASK_ZOMBIE:进程等待父进程收到通知并释放所有的数据结构
- 僵尸进程:进程收到信号终止时,通常有一些时间来完成所有的任务,这个进程叫做僵尸
- 进程内存段
进程内存区域包含:- 文本:存储可执行代码的区域
- 数据:数据段由如下三个区域构成
- Data:存储初始化数据,比如静态变量
- BSS:存储初始化0数据,数据初始化为0
- Heap(堆):根据需要使用malloc()分配动态内存。堆向高地址空间增长。
- 栈
该区域存储局部变量、函数参数和函数的返回地址。栈向低地址空间增长。
- Linux的CPU调度
- Linux内核使用O(1)而不是O(n)来实现CPU调度。O(1)就是静态算法,意味着处理器选择和调用进程开始执行的时间是一个常数。