进程与线程
进程
进程的概念
进程包括:
- 程序代码,也叫文本段
- 数据段全局变量
- 程序计数器,处理机寄存器
- 栈:局部变量,函数参数,返回地址
- 堆:动态分配的内存
进程是资源分配的基本单位,
不同的进程虽然可能执行同一段程序代码,但它们拥有各自独立的地址空间和资源。
程序是静态的,进程是动态的。
程序是被动的,而进程是主动的。
一个程序可以对应多个进程。
进程的状态
进程的状态包括:
- 新建态:进程正在创建
- 就绪态:进程已分配到必要的资源,等待CPU时间片
- 运行态:进程正在使用CPU
- 阻塞态:进程等待某个事件发生(如I/O完成)
- 终止态:进程执行完毕或被强制终止

进程时间片用完后进入就绪态
进程等待I/O等事件进入阻塞态
缺页会进入阻塞态
进程控制块 PCB
内核中用于操作系统管理进程的数据结构
包含:
- 进程标识符 PID
- 进程状态
- 程序计数器
- CPU寄存器
- CPU调度信息:进程优先级,调度队列的指针等
- 内存管理信息
- I/O状态信息:I/O设备列表,打开文件列表
- 记账信息:用户CPU时间,系统CPU时间,内存使用情况等
进程调度
长期调度程序:决定哪些进程进入就绪队列,从磁盘的缓冲区中选择进程装入内存,低频
中期调度程序:将进程从内存调出到磁盘,并在合适时机选择一些进程重新装入内存,从中断处继续执行
短期调度程序:决定哪个进程获得CPU时间片,高频
上下文切换
进程的上下文用进程的PCB表示
将CPU从一个进程切换到另一个进程时,保存和恢复进程状态的过程 context switch
内核在进程间进行上下文切换时,首先需要将当前进行的状态保存在对应的PCB中,包括CPU寄存器中的内容,堆,用户栈,内存管理信息,数据,文本,然后需要将下一个进程中的PCB中的内容取出来设置到相应的寄存器中
进程操作
进程创建
fork()系统调用创建子进程
exec()系统调用用新程序替换进程的内存空间
wait()系统调用等待子进程终止
父进程的返回值>0,即子进程的进程标志符,子进程=0
进程终止
exit()系统调用终止进程
进程通信
共享内存
无限缓冲 unbounded buffer
有限缓冲 bounded buffer
消息传递
直接通信
间接通信:通过邮箱
同步 阻塞
异步 非阻塞
线程
线程的概念
线程是进程的一个实体,是CPU调度和分派的基本单位
线程包括:
- 线程ID
- 程序计数器
- 寄存器
- 栈
与同一进程的其他线程共享:
- 代码段
- 数据段
- 其他操作系统资源
多线程模型
多对一模型:用户级线程映射到单个内核线程
多个线程的管理是由线程库在用户空间完成的,一个线程阻塞了系统调用,整个进程都会阻塞

一对一模型:每个用户级线程对应一个内核线程
有更好的并发性,但创建和管理线程的开销更大 
多对多模型:多个用户级线程映射到多个内核线程
允许程序创建任意数量的用户级线程,同时也允许多个线程并发运行在多个处理器上

线程库
线程库提供创建和管理线程的API
