深入理解linux内核第三版(二)进程
进程是程序的执行的一个实例。从内核的角度看,进程的目的就是担当分配系统资源(CPU时间片和内存)的实体。
1 普通线程和轻量级进程
普通线程,指的是,在一个应用中,有多个线程在执行。但是CPU对该应用的调度是以进程为单位进行调度的,这个进程中的多个线程不能够并发的执行。
轻量级进程实现多线程,情况则不一样,在CPU分配时间片时,各个轻量级进程和其他进程一样,都有相同的机会获得CPU时间片。这样一个进程中的多个线程才能够真正实现并发执行。
Linux使用轻量级进程对多线程应用提供支持。每一个线程(轻量级进程)都可以由内核独立调度。
2 内核线程和用户线程
内核线程:线程切换由内核控制。线程参与CPU时间片的分配,windows系统就是内核线程。
用户线程:线程切换由进程自己控制,不需要内核的参与,内核感知不到多线程的存在,只能感知到进程,所以CPU时间片切换是按照进程来切换的。一个线程的阻塞将导致整个进程的阻塞。
用户线程运行在一个中间系统上,也就是说运行在一个进程上。比如python中的线程就是用户级线程,它运行在python进程中,操作系统只能感知到python进程的存在,感知不到线程的存在,所以python线程不能充分利用多核cpu的优势。而java则不一样,java天然支持多线程,因为java创建线程的时候,实际上是调用内核clone()函数,传递特定参数使其创建的是轻量级进程,因此,java多线程直接参与CPU时间片的分配,且能充分利用多核CPU的优势
3 进程描述符
为了描述和控制进程的运行,我们引入PCB(进程控制块)。它是进程管理和控制最重要的数据结构。每一个进程均有一个PCB,在创建进程时,创建PCB,并伴随着进程的整个生命周期。在Linux中我们用结构体task_struct来表示PCB,也叫进程描述符。进程描述符包含了进程所有相关信息,所以它相当复杂,见下图
3.1 进程状态state
进程描述符的state字段描述了进程当前所处的状态。
可运行状态:进程要么在CPU上运行,要么等待获取CPU执行
可中断等待状态:进程被挂起,等待某个条件为真
不可中断等待状态:与可中断等待状态类似,但是有一个例外,把信号传递到睡眠进程不能改变它的状态。
暂停状态:进程的执行被暂停
跟踪状态:比如进程受到debugger进程的监控,则处于跟踪状态
僵死状态:进程的执行被终止,但是还要等父进程返回一些信息
死亡状态:僵死状态中,父进程处理完,进程被标记为EXIT_DEAD状态。
待补充