2.1 进程
现代计算机会在同一时间做许多事,需要一些方法控制这些并发的事情。在某一瞬间,CPU只能运行一个进程,但是在较短时间内可以运行多个进程,被称为伪并行。而多处理器系统能够实现真正的硬件并行。
一个进程就是一个正在执行的程序的实例,包括程序计数器、寄存器和变量的当前值。实际只有一个物理程序计数器,但每个进程都有自己的逻辑进程计数器。
主要导致进程创建的事件:
- 系统初始化
- 正在运行的进程调用进程创建系统调用
- 用户请求创建
- 批处理作业的初始化
主要终止条件:
- 正常退出
- 出错退出
- 严重错误
- 被其他进程杀死
进程的状态
- 运行态(实际占用CPU)
- 就绪态(可运行,但有其他进程正在运行)
- 阻塞态(等待某种外部事件发生)
三种状态间有四种可能地转换关系。
2.1.1 进程的实现
操作系统维护着一张进程表,每个进程占用一个表项,包括寄存器、程序计数器、堆栈指针、内存分配状况、所打开的文件状态、账号、调度信息、有运行态装换到就绪态或阻塞态所必须的信息(这些信息保证该进程随后能再次启动,并像从未被中断过一样)等。
多道程序设计的CPU利用率技术
2.2 线程
线程中有程序计数器(记录接着要执行哪一条指令)、寄存器(保存当前的工作变量)、堆栈(记录执行历史,已调用还没有返回的过程)
进程用于把资源集中到一起,而线程则是在CPU中被调度执行的实体。所有线程都有完全一样的地址空间,共享同样的全局变量,读写甚至清除另一个线程的堆栈。每个线程自己的内容:程序计数器、寄存器、堆栈、状态。
2.2.1 线程的实现
1.用户空间
把线程包放在用户空间中,内核对线程包一无所知。这种方法的好处:可以在不支持线程的操作系统上实现;线程切换速度比内核实现要快;允许每个进程有自己的线程调度算法。
在用户空间管理线程时,每个经常需要有专用的线程表用来跟踪该进程中的线程,类似进程表,不过仅记录线程的程序计数器、堆栈指针、寄存器和状态等。
缺点:阻塞系统难以实现;页面故障问题;线程永久运行问题(一个单独的进程内部没有时钟中断)
2.内核
内核中有用来记录系统中所有线程的线程表(进程表仍然存在),系统调用通过对线程表的更新完成创建或撤销线程的工作。内核线程不需要任何新的、非阻塞系统调用,也可以解决页面故障问题。
3.混合实现
内核只识别内核级线程,并对其进行调用。其中一些内核级线程会被多个用户级线程多路复用。