目录
- 进程的定义
- 进程的组成
- PCB
- 程序段
- 数据段
- 进程的组织
- 链接方式
- 索引方式
- 进程的特征
- 进程的状态
- 三种基本状态
- 另外两种状态
- 进程控制
- 实现进程控制
- 进程通信
- 共享存储
- 管道通信
- 消息传递
- 线程-轻量级进程
- 线程的实现方式
- 多线程模型
进程的定义
进程一般也称为进程实体(进程映像),由数据段,程序段,PCB(程序控制块)三部分组成
创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上也是是撤销PCB
注意:PCB是进程存在的唯一标志!
进程是进程实体的运行过程(动态性),是系统进行资源分配和调度的最小单位
严格来说:进程实体和进程不一样,进程实体是静态的,进程是动态的
进程的组成
PCB
PCB:操作系统通过PCB来管理进程,因此PCB中应该包含操作系统对其进行管理所需的各种信息
程序段
程序代码
数据段
程序运行时使用,产生的运算数据,如变量,宏定义常量等
进程的组织
进程的组织讨论的是多个进程之间的组织方式问题
链接方式
按照进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针
索引方式
根据进程状态的不同,建立几张索引表,操作系统持有指向各个索引表的指针
进程的特征
动态性(最基本特征):进程是程序的一次执行过程,是动态地产生、变化和消亡的
并发性:内存中有多个进程实体,各进程并发进行
独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
异步性:各进程独立的、不可预知的速度向前推进。OS要提供“进程同步机制”来解决异步问题
结构性:每个进程都配置一个PCB。结构上看,进程由程序段,数据段、PCB组成
进程的状态
三种基本状态
运行态:占用CPU,并在CPU上运行
就绪态:已经具备运行条件,但没有空闲CPU,暂时不能运行
阻塞态(等待态):因等待某一事件,而未能运行
另外两种状态
创建态:进程正在被创建,操作系统为进程分配资源,初始化PCB
终止态:进程从系统中撤销,操作系统回收进程资源,撤销PCB
进程控制
进程控制简单来说就是进程状态的转换
创建进程:需要初始化PCB,分配系统资源
创建态->就绪态:修改PCB内容和相应队列
就绪态->运行态:恢复进程运行环境、修改PCB内容和相应队列
运行态->阻塞态:保存进程运行环境,修改PCB内容和相应队列
运行态->终止态:回收进程拥有的资源,回收PCB
运行态->就绪态:保存进程运行的环境,修改PCB内容和相应队列
阻塞态->就绪态:修改PCB内存和相应队列。如果等待的是资源,则还需为进程分配系统资源
实现进程控制
用原语实现进程控制,原语的特点是执行期间不允许中断,有原子操作性
原语使用”关中断指令“和”开中断指令“
开/关中断指令的权限非常大,是只允许在核心态下执行的特权指令
每个原语是三类事情:
1.更新PCB信息
2.将PCB插入合适的队列
3.分配/回收资源
进程通信
进程通信就是进程之间的信息交换
进程是分配系统资源的单位(包括内存地址空间),因此各进程内存空间独立
为了保证安全,一个进程不能直接访问另一个进程的地址空间
但是进程之间的信息交换又必须实现。为了保证安全,操作系统提高一些通信方法
共享存储
在内存中开辟一块共享空间,两个进程对共享空间的访问必须是互斥的
基于数据结构的共享:速度慢,限制多,低级通信
基于存储区的共享:数据形式、存放位置由进程控制,而不是操作系统,更快,高级通信
管道通信
- 一个管道只能半双工通信,所以要实现双向实时通信,则需要设置两个管道
- 数据以字符流形势写入管道,当管道写满时,写进程的write系统调用将被阻塞,等待都进程将数据取走。当读进程全部取走数据后,管道变空,此时读进程的read()将被阻塞
- 如果没写满,就不允许读。如果没读空,就不允许写
- 数据一旦读出,就被管道抛弃,意味着读进程最多只有一个
消息传递
进程间的数据交换以格式化信息(Message)为单位。
进程通过OS提供的“发送消息/接收消息”两个原语进行数据交换
直接通信方式:进程1通过发送原语将信息挂在进程2的消息缓冲队列尾,进程2通过接收原语接收
间接通信方式:消息先要发送到中间实体(信箱)中。因此也称“信箱通信方式”
线程-轻量级进程
一个进程可能需要“同时”做很多事情,而传统进程只能串行,故引入线程,增加并发度
线程是一个基本的CPU执行单元,也是程序执行流的最小单位
引入线程后,进程只作为除CPU之外的系统资源的分配单元
--如内存地址空间等都是分配给进程的
进程 | 线程 | |
资源分配、调度 | 资源分配的最小单位 | cpu调度的基本单位 |
并发性 | 低 | 高 |
系统开销 | 进程切换开销大 | 线程切换开销小 |
线程的实现方式
用户级线程 | 内核级线程 |
用户级线程应该由应用程序通过线程库实现 | 内核级线程的管理工作由操作系统内核完成 |
用户级线程中,线程切换可以在用户态下完成,无需OS干预 | 线程调度、切换工作由内核负责,内核级线程的切换必需在核心态下完成 |
所有的线程管理工作都有应用程序负责(包括线程切换) | 内核级线程才是处理机分配的单位 |
多线程模型
多对一模型:一个内核级线程,多个用户级线程
优点:用户级线程切换在用户态完成,不需要核心态,线程管理系统开销小,效率高
缺点:一个用户级线程阻塞后,整个进程都被阻塞,并发度不高
一对一模型:一个内核级线程对应一个用户级线程
优点:一个线程阻塞后,彼得线程还可以执行,并发能力强。多线程可以在多核机器上并行执行
缺点:一个用户进程占用多个内核级线程,线程切换由OS完成,需要切换核心态,开销大
多对多模型:n用户线程映射到m个内核级线程(n>m)
克服了多对一模型并发度不高的问题,又克服一对一模型中一个用户进程占用太多内核级线程问题