进程的概念和特征
1.进程的概念
进程的引入是为了更好的描述和控制程序的并发执行,实现操作系统的并发性和共享性。为了使参与并发执行的程序能独立运行,必须为之配置一个专门的数据结构,称为进程控制块(PCB)。系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。由程序段、相关数据段和PCB三部分构成进程映像。所谓创建进程实质上就是创建PCB;撤销进程就是撤销进程的PCB。注意,进程映像是静态的,进程则是动态的。
进程的典型定义如下:
- 进程是程序的一次执行过程
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配的独立单位
进程是一个动态的过程性的概念
2.进程的特征
- 动态性:进程是程序的一次执行过程,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态的产生、变化和消亡的
- 并发性:多个进程实体同时存在于内存中,能在一段时间内同时运行,引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
- 独立性:进程实体是一个能独立运行,独立获得资源和独立接受调度的基本单位。凡是未建立PCB的程序都不能作为一个独立的单位参与运行
- 异步性:由于进程之间相互制约,使得进程具有执行的间断性,即进程按各自独立不可预知的速度向前推进。异步性导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制
- 结构性:每个进程都配置一个PCB对其进行描述。从结构上来看进程实体是由程序段、数据段、进程控制块三部分组成。
进程的状态切换
进程一共有五种状态
- 创建态:进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:首先申请一个空白的PCB,向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所需得资源;最后进入就绪态
- 就绪态:进程获得了除处理机外的一切资源,一旦得到处理机,便可立即执行。系统维持一个就绪队列,存放正在等待处理机的进程。
- 运行态:进程正在处理机上运行,在单处理机环境下,每个时刻最多只有一个进程处于运行态
- 阻塞态:进程正在等待某一事件而暂停运行,如等待某资源为可用或等待输入/输出完成。即使处理机空闲,该进程也不能继续运行
- 结束态:进程正在从系统中消失,可能是进程正常结束或其他原因中断退出运行。进程需要结束运行时,系统首先必须置该进程为结束态,然后进一步释放资源
注意:一个进程从运行态变为阻塞态是主动行为,而从阻塞态变为就绪态是被动行为需要其他进行协助
进程控制
进程控制的主要功能是对系统中所有进程实施管理,在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
1.进程的创建
允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的所有资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外撤销父进程时必须同时撤销其所有子进程。
在操作系统中,终端用户登录系统,作业调度,系统提供服务,用户程序的应用请求等都会引起进程的创建。操作系统创建一个新进程的过程如下:
- 为新进程分配一个唯一的进程号,并申请一个空白的PCB(PCB有限),若申请失败则创建失败。
- 为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间(在PCB中体现),若资源分配失败,则处于阻塞态等待内存资源
- 初始化PCB,主要包括初始化标志信息,初始化处理机状态信息和初始化处理机控制信息,设置进程的优先级等
- 若进程就绪队列能够接纳新进程,则将新进程插入就绪队列等待被调度执行
2.进程的终止
引起进程终止的操作有:正常结束、异常结束、外界干预。
操作系统终止进程的过程如下:
- 根据被终止的进程标识符检索PCB,从中读取进程的状态
- 若被终止的进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程
- 若该进程还有子孙进程,则应将子孙进程终止
- 将该进程所拥有的的全部资源归还给父进程或操作系统
- 将PCB从队列中删除
3.进程的阻塞和唤醒
进程阻塞是一种主动的行为只有处于运行态的进程才能阻塞,系统自动执行阻塞原语使自己变为阻塞态,其过程如下
- 找到被阻塞进程的标识号对应的PCB
- 若该进程为运行态,则保护现场,将其状态转为阻塞态,停止运行
- 把该PCB插入相应的等待队列,将处理机资源调度给其他就绪进程
当被阻塞的进程所期待的事或资源发生,就会调用唤醒原语,将等待事件唤醒,原语执行过程如下
- 在该事件的等待队列中找到相应进程的PCB
- 将其从等待队列中移出,设置为就绪态
- 把PCB插入就绪队列,等待调度程序调度
4.进程切换
进程切换是在内核的支持下完成的,任何进程都是在操作系统内核支持下运行的,进程切换是指处理机从一个进程的运行转到另一个进程上的运行,在这个过程中,进程的运行环境发生了变化具体步骤如下:
- 保存处理机上下文,包括程序计数器和其他寄存器
- 更新PCB
- 把进程的PCB移到相应的队列,如就绪或阻塞队列等
- 选择另一个进程,并更新PCB
- 更新内存管理的数据结构
- 恢复处理机上下文
注意:进程切换与处理机切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,而无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。
进程的组织
进程是一个独立的运行单位,也是操作系统进行资源分配和调度的基本单位,由进程控制块PCB、程序段、数据段组成。
1.进程控制块
进程创建时,操作系统为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。
进程执行时,系统通知其PCB了解进程的现行状态信息,以便对其进行控制和管理;进程结束时,系统回收PCB,进程随之消亡。操作系统通过PCB表来管理和控制进程。
在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。为了方便进程的调度和管理需要将各进程的PCB用适当的方法组织起来,目前常用的组织方式有链接方式和索引方式两种。链接方式将同一状态的PCB连接成一个队列,不同状态的PCB分布在不同的队列,也可能会把阻塞原因不同的队列分布在不同的队列。索引方式将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表、阻塞索引表等
2.程序段
程序段就是能被进程调度程序调度到CPU执行的程序代码段,程序可被多个进程共享,即多个进程共享同一代码段。
3.数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果
进程的通信
进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指比较高的效率传输大量数据的通信方式主要有三类:共享存储、消息传递、管道通信
1.共享存储
在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间的读、写操作实现进程间的信息交换。再对共享空间进行读、写时,需要使用同步互斥工具(如PV操作)对共享空间进行控制。共享存储分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享是基于存储区的共享。操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己通过读写完成。
2.消息传递
在消息传递系统中,进程间的数据交换是以格式化的消息为单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接受消息两个原语进行数据交换。
- 直接通信方式:发送进程直接把消息发送给接受进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列上获取消息。
- 间接通信方式:发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱,这种通信方式又称为信箱通信方式。该通信方式广泛应用于计算机网络中,如电子邮件系统。
3.管道通信
管道通信是消息传递的一种特殊方式。所谓管道,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道提供输入的发送进程(写进程),以字符流形式将大量的数据写入管道;而接受管道输出接收进程(读进程)则从管道中接收数据。为了协调双方的通信,管道机制必须提供一下三方面的协调能力:互斥、同步和确认对方存在。
管道就是一种特殊的文件,在Linux中限制其大小为4KB,管道为空时读进程会阻塞,管道满时写进程阻塞。
**注意:**从管道读数据是一次性操作,数据一旦被读取,它就从管道中抛弃,释放空间。管道只能半双工通信,即某一时刻只能单向传输。要实现父子进程双方互动通信,需要定义两个管道。
线程的概念和多线程模型
1.线程的基本概念
引入进程可以更好的使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的是为了减少程序并发执行的所付出的时空开销,提高操作系统的并发性能。
线程可以理解为轻量级进程,它是一个基本的CPU执行单元,也是程序执行的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但它可以与同属于一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现间断性。线程也有就绪、阻塞、运行三种基本状态。
引入线程后,进程只作为除CPU外的系统资源的分配单元,线程则是处理机的分配单元。一个进程内的线程间的切换开销很小。
2.线程和进程的区别
- 进程是分配资源的基本单位,线程是独立调度的基本单位。
- 进程是拥有资源的基本单位,线程不拥有系统资源,线程可以访问隶属进程的资源
- 进程与进程之间可以并发进行,线程与线程之间也可以并发进行。
- 不同进程之间的切换开销较大,而同一进程内线程的切换开销较少。
- 进程之间的地址空间相互独立,同一进程内线程可以共享进程资源。
- 进程间的通信需要同步互斥手段,线程间的通信可以直接借助全局变量进行。
3.线程的属性
多线程操作系统把线程作为独立调度的基本单位,其主要属性如下所示
- 线程是一个轻型实体,他不拥有资源但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态。
- 不同的线程可以执行相同的程序
- 同一进程内的各个线程共享该进程的资源
- 线程是处理机调度的基本单位
线程可以提高并发性可以这么来理解:线程间切换开销变小了,因此能让更多线程参与执行,并发性不就增加了。
4.多线程模型
用户线程和内核线程
- 多对一模型
- 一对一模型
- 多对多模型
一些问题的总结
1.为什么引入进程
在多道程序同时运行的背景下,进程之间需要共享系统资源,会导致程序执行过程中出现相互制约的关系,程序的执行会表现出间断性的特征、这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的状况,也无法看出和其他程序间的关系。为了描述程序动态执行过程的性质乃至更好的支持和管理多道程序的并发执行,人们引入了进程的概念。
2。什么是进程
进程是一个具有独立功能程序在某一数据集上的执行过程,它可以申请系统资源是一个动态的概念,一个进程由程序段,数据段,PCB三部分组成。其中PCB是一个进程唯一的标识