目录
进程与线程:
进程与线程的基本概念:
进程是进程实体的运行过程,是系统资源分配和调度的一个独立单位。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。可以理解为轻量级进程。
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度。
引入线程之后,进程是资源分配的基本单位,线程是调度的基本单位。
进程与线程的状态与转换:
进程的状态:
- 运行状态:拥有CPU和其他所需的资源。
- 就绪状态:不拥有CPU,但是拥有其他所需的资源。
- 阻塞状态:不拥有CPU和其他所需的资源。
- 创建状态:操作系统为新进程分配资源创建PCB。
- 终止状态:操作系统回收进程的资源,撤销PCB。
进程状态的转化:
- 就绪态--运行态:进程被调度。
- 运行态--就绪态:时间片到,或CPU被其他高优先级的进程抢占。
- 运行态--阻塞态:等待系统分配,或等待某事发生。(主动行为)
- 阻塞态--就绪态:资源分配到位,等待的事情发生。(被动行为)
- 创建态--就绪态:系统完成创建进程的任务。
- 运行态--终止态:进程运行结束,或运行过程中遇到不可修复的错误。
进程的大部分时间都是处于:运行态,就绪态,阻塞态。
单核CPU的情况下,同一时刻只会有一个进程处于运行态,多核CPU的情况下,可能会有多个进程处于运行状态。
需要注意的是,不可能直接从阻塞态转化为运行态,也不可能直接由就绪态转化为阻塞态。显然,进入阻塞态是系统主动请求的,只能通过在运行态的时候实现。
线程的状态与转化与进程类似,但是只考虑就绪,运行,阻塞这三种情况。
线程的实现,内核支持的线程,线程库支持的线程:
线程的实现方式包括:
- 用户级线程:从用户视角能看到的线程,由线程库实现。
- 内核级线程:从操作系统视角看到的线程,由操作系统实现(内核级线程才是处理机分配的单位)。
- 组合方式:上述两种方式的综合。
用户级线程,也就是线程库支持的线程,由应用程序通过线程库实现,所有线程的管理工作都有应用程序负责,包括线程的切换。线程切换可以在用户态下完成,不需要操作系统的干涉。
内核级线程又称为内核支持的线程,内核级线程的管理工作由操作系统内核完成。内核级线程的切换必须在核心态下进行。
进程和线程的组织与控制:
进程的组织方式:
链接模式:按照进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针。
索引方式:根据进程状态的不同,建立几张索引表,操作系统持有指向各个索引表的指针。
进程控制就是要实现进程状态的转化:
进程控制用原语来实现,原语用开/关中断来实现,是一种特殊的程序,执行是一气呵成不可中断。
相关原语包括:
- 进程的创建。
- 进程的终止。
- 进程的阻塞。
- 进程的唤醒。
- 进程的切换。
进程间通信,共享内存,消息传递,管道:
进程是分配资源的基本单位,因此各进程拥有的内存地址空间相互独立。
共享存储包括:基于数据结构的共享和基于存储区的共享。基于数据结构的共享是比较低级的通信方式,基于存储区的共享是比较高级的通信方式。
消息传递:进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
消息传递有两种方式,分别是:直接通信方式,和间接通信方式,间接通信方式以“信箱”作为中间实体进行消息传递。
管道通信:管道是一个特殊的共享文件,又名pipe文件,其实就是在内存中开辟出来一个大小固定的内存缓冲区。
- 管道只能采用半双工通信,某一段时间内,只能实现单向传输,如果要实现双向传输,需要设置两个通道。
- 各个进