操作系统内核实现操作系统的三大管理功能:进程管理、内存管理、文件系统。
在操作系统原理中,通过进程控制块PCB描述进程。在Linux内核中通过一个数据结构struct task_struct来描述进程,称其为进程描述符。
在操作系统原理中,进程有就绪态、运行态和阻塞态3种基本状态。
Linux内核状态转换图:
在Linux内核中,当时用fork()系统调用来创建一个进程时,新进程的状态是TASK_RUNNING(就绪态但没有运行)。就绪态和运行态在Linux内核中都是TASK_RUNNING状态,此状态下进程是可运行的,也就是就绪态,是否在运行取决于它有没有获得CPU的控制权,即这个进程有没有在CPU中实际执行。如果在CPU中实际执行了,进程状态就是运行态;如果被内核调度出去了,在等待队列里就是就绪态。
对于一个正在运行的进程,调用用户态库函数exit()会陷入内核执行该内核函数do_exit(),进程会进入TASK_ZOMBIE状态,即进程的终止状态。TASK_ZOMBIE状态的进程一般叫做僵尸进程,Linux内核会在适当的时候把僵尸进程处理掉,然后释放进程描述符。
一个正在运行的进程在等待特定事件或资源时会进入阻塞态,阻塞态分为两种:
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE。
前者可以被信号和wake_up()唤醒,后者只能被wake_up()唤醒。
pid ,tgid用来标识进程。
用数据结构struct task_struct 来描述进程
SMP条件编译,on_rq运行队列。
所有进程通过双向循环链表链起来。
进程描述符的结构示意图
程序创建的进程具有父子关系。