一、引入进程的原因
为了使程序能并发执行,并能对并发的程序加以描述和控制(解决程序并发的不可再现性)
二、什么是进程?
- 进程是执行中的程序
- 进程是动态概念,有声明周期
- 它是操作系统进行资源分配和调度的基本单位
进程分类:
- 系统进程:执行操作系统核心代码的进程(独占资源,最高优先级运行;直接执行 I/O 操作;内核态下活动)
- 用户进程:执行用户程序的进程(通过系统调用竞争资源;不直接执行 I/O 操作;用户态下活动)
进程组成:
- 一段可执行的程序
- 程序所需要的相关数据(变量,工作空间,缓冲区)
- 进程控制块(PCB 里面有程序的一些控制信息)
进程的状态:
- 就绪态:获得除 CPU 外的所有必要资源
- 运行态:获得 CPU 控制权,运行
- 阻塞态:因为等待某事件而暂停执行(如 I/O 等待)
三、进程的创建、终止与切换
进程的创建:
- 申请空白 PCB(进程有唯一数字标识)
- 为新进程分配资源(为程序、数据和用户栈分配内存)
- 初始化 PCB (初始化标识信息;初始化处理机状态信息;初始化处理机控制信息)
- 将新进程插入就绪队列
进程的终止:
- 根据被终止进程的标识符,从 PCB 集合中检索出该进程的 PCB,从中读出该进程状态
- 若被终止的进程处于执行状态,应立即终止该进程的执行。
- 若该进程还有子孙进程,终止其所有子孙进程
- 将被终止进程的所有资源归还给父进程或系统
- 将被终止进程的 PCB 从所在队列或链表中移出,等待其它程序来收集信息
进程切换:
何时切换进程?
中断:
- 时钟中断:时间片轮转,运行态 -> 就绪态
- I/O 中断:运行态 -> 阻塞态
- 内存失效:访问缺页/段,运行态 -> 阻塞态
陷阱:
- 致命错误:运行态 -> 终止态
- 不致命错误:系统试图恢复和告知用户
系统调用:
- 运行态 -> 阻塞态
线程
四、为什么引入线程?
线程:程序中单一的顺序控制流程
目的:为了提高操作系统并发度
并发与并行:
并发:当都多个线程在操作时,如果系统只有一个 CPU,则它根本不可能真正同时进行一个以上的线程,它只能把 CPU 运行时间划分为若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态(挂起等效于不在内存中),这种方式我们称之为并发。
并行:当系统有两个或多个 CPU 时,一个 CPU 执行一个线程的同时另一个 CPU 执行另一个线程,两个线程不抢占 CPU 资源,可以同时进行,这种方式我们称之为并行。
进程并发执行的好处:资源共享;提高速度;模块化
进程:是分配资源的单位
线程:系统调度的单位
线程的优点:
- 响应度高:增加了对用户的响应程度
- 资源共享:线程默认共享他们所属进程的内存和资源
- 经济:终止一个线程比终止一个进程话费时间少;同一进程内切线程切换比进程间切换时间少
- 多处理器体系结构的利用:单线程进程只能运行在一个 CPU 上;在多个 CPU 机器上使用多线程增加了并发功能