1.进程、用户线程、内核线程的区别和联系
进程 | 用户线程(轻量级进程) | 内核线程 | |
---|---|---|---|
代码段 | 有 | 有 | 有 |
数据段 | 有 | 有 | 有 |
描述符task_struct | 有 | 有 | 有 |
用户空间堆栈 | 有 | 一个线程组共享一个用户空间 | 完全没有 |
内核空间堆栈 | 有 | 有 | 有 |
PID | 独一无二的 | 一组线程共享一个 | 有 |
这里的有是指拥有独立的
2.内核线程:
由内核创建、调度,用于执行一些重要的、周期性的过程。
只运行在内核态、只使用3G以后的系统空间。
比如用于回收物理页面的kswapd线程
3.进程的状态
(1)就绪或运行
(2)可中断的等待
(3)不可中断的等待
(4)暂停
(5)跟踪
(6)僵死(见Linux2.6进程的创建与删除)
(7)僵死撤消
4.进程描述符与进程之间是严格的一一对应
5.内核态的进程堆栈和线程描述符被紧凑地放在两个连续的页框中
目的:在内核态运行时,能够方便地得到线程描述符的地址
6.由于内核堆栈较小,不能有太深的嵌套,或使用太多太大的局部变量(用指针)
刚从用户态切换到内核态时,内核栈总是空的。
7.记录进程之间关系的数据结构
(1)进程链表:不带头的双向链表,包含所有进程描述符。0进程的描述符是链表头
(2)运行状态链表
(3)宗族关系树
(4)使用链表散列法的Hash表:用于通过PID快速找到描述符
(5)等待队列:双向链表
8.进程的创建:Linux2.6进程的创建与删除
9.为了叙述严谨,进程切换是指两个进程切换的过程,进程调度是如何选择下一个运行进程的算法
Linux0.12由于比较简单,两个过程合并到了一起
Linux2.6进程切换见Linux2.6进程切换
Linux2.6进程调度见Linux2.6进程调度