六大点:
- 进程(process)描述(静态表示)
- 进程状态(state)(动态表示)
- 线程(thread)
- 进程间通信(inter-process communication)
- 进程互斥与同步
- 死锁(deadlock)
1. 进程描述(静态部分)
- 1.1 进程的定义
- 定义:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程(这整个动态过程被称为进程)
- 1.2 进程的组成
- 一个进程应该包括
- 程序的代码
- 程序处理的数据
- 程序计数器(寄存器)中的值,指示下一条将运行的指令的位置
- 一组通用的寄存器的当前值,堆,栈
- 一组系统资源(如打开的文件,网络资源)
- 总之,进程包含了正在运行的一个程序的所有状态信息
- 进程与程序的联系(进程是动态执行的过程,程序是静态的代码)
- 程序是产生进程的基础
- 程序的每次运行构成不同的进程
- 进程是程序功能的体现
- 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包含多个程序
- 进程和程序的区别
- 进程是动态的,程序是静态的:程序是有序代码的集合,进程是程序的执行,进程有核心态和用户态之分
- 进程是暂时的,程序是永久的:进程是一个动态变化的过程,程序可长久保存
- 进程和程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)
- 进程和程序的举例
- 一个进程应该包括
- 1.3 进程的特点
- 动态性:可动态地创建、结束进程
- 并发性:进程可以被独立调度,并占用处理机运行
- 独立性:不同进程的工作不相互影响(不同进程具有不同的页表,不同的内存空间地址)
- 制约性:因访问共享数据/资源,或进程间同步而产生制约
-
- 1.4 进程控制结构
- 进程控制块
- 程序 = 算法 + 数据结构
- 描述进程的数据结构:程序控制块(Process Control Block, PCB)
- 操作系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息
- 进程控制块:操作系统管理控制进程运行所用的信息集合
- 操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志
- 程序 = 算法 + 数据结构
- 使用进程控制块
- 进程的创建:为该进程创建一个PCB
- 进程的终止:回收它的PCB
- 进程的组织管理:通过对PCB的组织管理来实现对进程的组织管理
- PCB含有以下3大类信息:
- (一)进程标识信息。
- 如本进程的标识(ID号),进程的父进程标识(创建该进程的进程);用户标识(该进程属于哪个用户)
- (二)处理机(处理器,即CPU)状态信息保存区。保存进程的运行现场信息
- 用户可见寄存器。用户程序可以使用的数据、地址等寄存器
- 控制和状态寄存器。如状态计数器(PC),程序状态字(PSW)
- 栈指针。程序调用/系统调用/中断处理和返回时需要用到它
- (三)进程控制信息
- 调度和状态信息
- 进程间通信信息
- 存储管理信息
- 进程所用资源
- 有关数据结构连接信息
- (一)进程标识信息。
- PCB的组织方式
- 链表:同一状态的进程其PCB组成一个链表,多个状态对应多个不同的链表(就绪链表,阻塞链表)
- 索引表(类似数组):同一状态的进程其PCB组成一个Iindex表(由Index指向PCB),多个状态对应多个不同的index表(就绪索引表,阻塞索引表)
- 最常用的是链表,应为进程是动态的,链表插入和删除操作方便
- 进程控制块
2. 进程状态(动态部分)
- 三部分内容
- 进程的生命期管理
- 进程状态变换模型
- 进程挂起模型
- 1.5 进程的生命期管理
- 进程的生命期管理
- 进程创建
- 进程运行
- 进程等待(阻塞)。进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生
- 进程唤醒。进程只能被别的进程或操作系统唤醒
- 进程结束
- 进程的生命期管理
- 1.6 进程状态变换模型
- 进程的3中基本状态(进程在生命结束前处于且仅处于3种基本状态之一,不同系统设置的进程状态数目不同)
- 运行状态(Running):进程正在处理器上运行时
- 就绪状态(Ready):一个进程获得了除处理器之外的一切所需资源,一旦得到处理器即可运行
- 等待状态(又称阻塞状态Blocked):一个进程正在等待某一事件而暂停运行时,如等待某资源,等待输入/输出完成
- 进程其他的基本状态
- 创建状态(New)
- 结束状态(Exit)
- 进程的3中基本状态(进程在生命结束前处于且仅处于3种基本状态之一,不同系统设置的进程状态数目不同)
- 进程挂起
- 挂起(suspend):把一个进程从内存转到外存(即磁盘/硬盘)。进程在挂起状态时,意味着进程没有占用内存空间。处在挂起状态的进程映像在磁盘上
- why? 合理且充分地利用系统资源
- 两种挂起状态
- 阻塞挂起状态(Blocked-suspend):进程在外存,并等待某事件的出现
- 就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存即可运行
- 与挂起有关的状态转化
- 阻塞到阻塞挂起
- 就绪到就绪挂起
- 运行到就绪挂起
- 在外存时的状态转化
- 阻塞挂起到就绪挂起
- 解挂/激活(activat ):把一个进程从外存转到内存。可能有以下几种情况
- 就绪挂起到就绪
- 阻塞挂起到阻塞
- 状态队列
- 由操作系统来维护一组队列,分别表示系统当中所有进程的当前状态
- 不同的状态分别用不同的队列来表示(如就绪队列,各种类型的阻塞队列)
- 每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另外一个状态队列
3. 线程管理
- 四大内容
- 为什么使用线程
- 什么是线程
- 线程的实现
- 多线程编程接口举例
- 1为什么使用线程
- 多进程存在的问题
- 进程之间不能共享数据,进程间通信还需要经过CPU
- 维护进程的系统开销较大:创建进程时,分配资源、建立PCB;撤销进程时,回收资源、撤销PCB;进程切换时,需要保存当前进程的状态信息。
- 多进程存在的问题
- 2什么是线程
- 线程(thread):进程当中的一条执行流程
- 有了线程的概念后,可从两个方面来重新理解进程
- 从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段、数据段)、打开的文件、访问的网络等各种资源(进程就是用来管理资源的)
- 从运行的角度:代码在这个资源平台上的一条执行流程(线程)
- 即,进程由两部分组成:资源管理+线程
- 线程 = 进程 - 共享资源
- 线程的优点
- 一个进程中可以同时存在多个线程
- 各个线程之间可以并发地执行
- 各个线程之间可以共享地址空间和文件等资源(共享代码、数据和文件)
- 线程的缺点
- 一个线程崩溃,会导致其所属进程的所有线程都崩溃
- 线程和进程的比较
- 进程是资源分配单元,线程是CPU调度单位
- 进程拥有一个完整的资源平台,而线程只独享必不可少的资源(寄存器和栈)
- 线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系
- 线程能减少并发执行的时间和空间开销:
- 线程的创建时间和终止时间比进程短
- 同一进程内的线程切换时间比进程短(因为不需要切换内存管理所需要的页表)
- 由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信(线程之间的数据传递不需要通过内核,直接通过内存地址就可以访问到)
- 3.线程的实现
- 主要有3种线程的实现方式:
- 用户线程(user thread):在用户空间实现,操作系统看不见,由用户态的应用程序库(线程库函数)管理的线程(操作系统能看见进程,但看不见进程中的线程)
- 内核线程(kernel thread):在内核中实现,由操作系统管理的线程(Windows,linux, solaris)
- 轻量级线程(Lightweught ):在内核中实现,支持用户线程(solaris)
- 用户线程和内核线程的对应关系
- 多对一
- 一对一
- 多对多
- 用户线程
- 主要有3种线程的实现方式:
- 内核线程
4 进程控制
- 上下文切换
- 定义:CPU在不同进程之间的切换被称为上下文切换(context switch)