进程发展定义组成PCB组织特征状态状态之间的切换控制实现会用到的原语相关原语创建原语引起进程创建的事件通信共享存储消息传递直接通信方式间接通信方式管道通信线程属性实现方式用户级线程内核级线程多线程模型多对一模型一对一模型多对多模型
进程
定义
程序:就是一个指令序列
发展
单道程序
早期的计算机只支持单道程序,简而言之就是所有硬件只为一个进程服务
这个指令序列存放在内存的程序段内,程序运行过程中处理的数据放在数据段内(如变量)
多道程序(进程诞生)
在此引入了进程、进程实体(进程映像)的概念,是为了方便操作系统的管理,完成程序之间的并发执行,
所以系统为每个运行的程序配置一个数据结构,称谓进程控制块(PCB),用来描述进程的各种信息(比如程序代码存放位置)
定义
程序段、数据段、PCB三部分组成了进程实体,一般情况下,我们把进程实体简称为进程。
如:创建进程,实际上是创建进程中的PCB,撤销进程是撤销进程实体中的PCB
PCB是进程存在的唯一标志!
进程有不同的定义,比较传统的定义有:
进程是程序的一次执行过程
进程是一个程序及其数据在处理机上顺序执行时所发生的活动
进程是具有独立功能的程序在数据集合上运动的过程,它是系统进行资源分配和调度的一个独立单位
进程具有动态性
在有进程实体的概念下,进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
注:严格来说,进程实体和进程并不一样,进程实体是静态多的,而进程则是动态的
组成
程序段、数据段、PCB三部分组成了进程(进程实体)
pcb
程序段
数据段
与进程管理相关的信息都放在PCB中
PCB
进程描述信息
进程标识符PID
当进程被创建时,操作系统为该进程分配的一个唯一的,不重复的id,用于区分不同进程
用户标识符UID
标识进程所属的用户
进程控制和管理信息
进程当前状态
进程优先级
资源分配清单
程序段指针
数据段指针
键盘
鼠标
处理机相关信息
各种寄存器值
当进程切换是需要把进程当前的运行情况记录下来保存到PCB中,简单来说就是上下文?方便下次执行
另外的分类方式:
进程标识符
处理机状态
进程调度信息
进程控制信息
组织
多个进程之间的组织方式
链接方式(指向的是队列)
按照进程状态将PCB分为多个队列
操作系统持有指向各个队列的指针
有执行指针(当前运行状态的进程),就绪队列指针(会把优先级高的放在队头),阻塞队列指针
索引方式(指向的是索引表)
根据进程状态的不同,建立几张索引表
操作系统持有指向各个索引表的指针
跟链接方式的东西一样,zhibuguo存储方式不一样
特征
动态性(进程是程序的一次执行过程,是动态地产生、变化和消亡的)
并发性(内存中有多个进程实体,各进程可并发执行)
独立性(进程是能独立运行、独立获得资源、独立接收调度的基本单位)
异步性(各进程是各自独立的,不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题)
异步性会导致并发程序执行结果的不确定性
结构性(每个进程都会配置PCB,结构上由程序段,数据段PCB组成)
状态
运行状态
就绪状态(具备运行条件,但是没有空闲cpu)
阻塞状态(因等待某一事件而暂时不能运行)
以上三个状态是基本状态
创建状态
终止状态
状态之间的切换
就绪态→运行态
运行态→就绪态
运行态→阻塞态(主动行为)
阻塞态→就绪态(被动行为)
创建到就绪
运行到终止
不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态
控制
进程控制的主要功能是对系统中的所有进程实施有效地管理里,它具有crud进程好的进程状态转换等功能。
重点是进程状态转换
实现
用原语实现的进程控制
采用“关中断”,“开中断”两个指令实现
这两个指令只允许在核心态下运行
会用到的原语
更新PCB
修改进程状态标志(进程状态切换一定会改变其标志),将运行环境保存到PCB(剥夺当前运行进程的cpu使用权就会保存)、从PCB恢复运行环境
将PCB插入合适的对别
分配/回收资源
相关原语
创建原语
申请空白PCB
为新进程分配所需资源
初始化PCB
将PCB插入就绪队列
引起进程创建的事件
用户登录
分时系统中,用户登录成功,系统会建立一个新进程
作业调度
多道批处理系统中,有新的作业放到内存时会建立一个新进程
提供服务
用户向操作系统提出某些请求时,会创建一个进程去处理该请求
应用请求
由用户进程主动请求创建一个子进程
终止原语
阻塞原语和唤醒原语(成对出现)
进程的切换
创建进程
通信
进程通信就是指进程之间的信息交换
各进程之间的内存地址空间相互独立
一个进程不能直接访问另一个进程的地址空间
共享存储
两个进程对共享空间的访问必须是互斥的
互斥由操作系统工具实现
基于数据结构的共享
限制较多,是一种低级的通信方式,
基于存储区的共享
在内存中有一块专门的共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。速度更快,是一种高级通信方式
消息传递
进程之间数据会以格式化(结构化)的消息来传递,进程之间通过系统提供的" 发送消息/接收消息 "两个原语进行数据交换
一个格式化的消息会分为消息头和消息体组成,消息头包括:发送进程id、接收进程id、消息类型、消息长度等格式化信息,计算机网络中发送的“报文”也是一种格式化的消息
直接通信方式
消息直接挂到接收进程的消息缓冲队列上
间接通信方式
消息需要先发送到中间实体(信箱)中,因此也称“信箱通信方式”,比如:电子邮件系统
管道通信
“管道”是指用于连接读写进程的一个共享文件,名为pipe文件,其实就是在内存中开辟一个大小固定的缓冲区
Linux中一个管道的内存为4kb
注意:
管道只能采用半双工通信,某一段时间内只能实现一个方向的传输,要实现双向同时通信,则需要两个管道
各进程要互斥的访问管道
数据以流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走,当读完管道中的数据之后,读进程多read()将被阻塞
如果没有写满,就不允许读,如果没读空,就不允许写
数据一旦被读出,就会被管道抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
线程
有的进程需要“同时”做很多事,而进程只能串行地执行一系列程序,所以,引入“线程”来增加并发度。
传统的进程是程序执行流的最小单位(进程是cpu的服务单位)
在引入线程后,线程就成为了程序执行流的最小单位(线程是cpu的服务单位)
轻量级的进程
进程中各线程也可以并发,提升了系统的并发度
引入线程之后,进程只作为除CPU之外的系统资源分配单元(如打印机、内存地址空间等都是分配给进程的)
进程并发,需要切换进程的运行环境,所以开销很大
线程并发,如果是在同一进程内的线程切换,则不需要切换进程环境,系统开销小
引入线程后,并发所带来的系统开销减小
属性
线程是处理机调度的最小单位
多CPU计算机中,各个线程可占用不同的cpu
每个线程都有一个线程ID,线程控制块(TCB)
线程也有就绪、阻塞、运行三种基本状态
线程几乎不拥有系统资源
同一进程的不同线程间共享进程的资源
由于共享内存地址空间同一进程中的线程间通信甚至无需系统干预
同一进程的线程切换,不会引起进程切换
不同进程的线程切换,会引起进程切换
切换同进程内的线程,系统开销很小
切换进程,系统开销大
实现方式
用户级线程
应用程序通过线程库来实现的,所有线程的管理工作都由应用程序负责,包括线程切换,所以无需系统干预,不用切换核心态
且这个线程对于操作系统来讲,并不会意识到线程的存在,对操作系统是透明的,但是用户就能看到这些线程,就是一种在用户级能看到的线程
内核级线程
内核级的线程的管理工作由操作系统内核完成。系统调度、切换等工作都由内核负责,必然会切换到核心态,这种线程可以理解为:从操作系统内核视角能看到的线程
注意:操作系统只能“看见”内核级线程,因此只有内核级线程才是处理机分配的单位
在同时支持用户级线程和内核级线程的系统中,可采用二者结合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)
多线程模型
由几个用户级线程映射到几个内核级线程的问题引出了“多线程模型”的问题
多对一模型
多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统 开销小,效率高
缺点:当一个用户级线程被阻塞后,整个斤都会被阻塞,并发度不高。多个线程不可在多核处理器上并发运行
一对一模型
一个用户级线程对应一个内核级线程,两者一一对应,数量一致
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上执行
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,线程管理的成本高,开销大
多对多模型
n个用户级线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程
优化了多对以模型并发问题,也优化了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。