操作系统(二)—— 进程管理(进程和线程)

二、进程管理

知识框架
在这里插入图片描述

2.1 进程和线程
2.1.1 进程的概念和特征
1、进程的概念

在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入进程的概念,以更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特征)
为了使参与并发执行的程序(包含数据)能独立运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block)。由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)。
创建和撤销进程就是创建和撤销进程的PCB,值得注意的是,进程映像是静态的,进程则是动态的
PCB是进程存在的唯一标志!!!
从不同的角度,进程可以有不同的定义:
1)进程是程序执行一次的过程;
2)进程是一个程序机器数据在处理机上顺序执行时所发生的活动;
3)进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个单位。
传统操作系统中的进程定义:**进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。**此处的资源是指处理机、存储器和其他设备服务于某进程的“时间”。这就决定了进程一定是一个动态的、过程性的概念。

2、进程的特征

动态性;并发性;独立性;异步性;结构性。

2.1.2 进程的状态和转换

通常进程有五种状态,前三种是基本状态:运行状态;就绪状态(进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行);阻塞状态(等待状态,进程正在等待某一事件而暂停运行,如等待某资源为可用或等待输入/输出完成);创建状态(系统正在被创建,尚未转到就绪状态);结束状态(进程需要结束运行之前,必须置该进程为结束状态,然后再进一步释放和回收资源)。
三种基本状态之间的转换:
就绪状态->运行状态:处于就绪状态的进程获得处理机资源(分派处理机时间片),转为运行状态;
运行状态->就绪状态:处于运行状态的进程在时间片用完后,让出处理机,进程转为就绪状态;
运行状态->阻塞状态:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,就从运行状态转为阻塞状态;
阻塞状态->就绪状态:当等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞状态转换为就绪状态;
一个进程由运行状态变成阻塞状态是一个主动的行为,而从阻塞状态变到就绪状态是一个被动的行为,需要其他相关进程的协助。

2.1.3 进程控制

进程控制主要是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
1、进程的创建
父进程创建子进程,子进程可以继承父进程所拥有的资源,子进程被撤销时,应将资源归还给父进程。撤销父进程时也必须撤销其所有的子进程。
在操作系统中,终端用户登陆系统、作业调度、系统提供服务、用户程序的应用请求都会引起进程的创建。创建一个新进程的过程如下(创建原语):
1)为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。
2)为进程分配资源,为新进程的程序和数据,以及用户栈分配必要的内存空间(在PCB中体现)。这里资源分配不足(比如内存空间),并不是创建失败,而是处于“等待状态”,或成为“阻塞状态”,等待的是内存这个资源。
3)初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
4)如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列中,等待被调度运行。
2、进程的终止
引起进程终止的事件主要有:正常结束;异常结束(进程运行时发生了某种异常事件,使程序无法继续运行,如存储越界、保护错、非法指令、特权指令错、I/O故障等);外界干预(进程应外界的请求而终止运行,如操作员干预、父进程请求和父进程终止)。
操作系统终止进程的过程如下(撤销原语):
1)根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
3)若该进程还有子进程,则应将其所有子进程终止。
4)将该进程所拥有的全部资源,或归还给其父进程或归还给操作系统。
5)将该PCB从所在队列(链表)中删除。
3、进程的阻塞和唤醒
**只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。**阻塞原语的执行过程:
1)找到将要被阻塞进程的标识号对应的PCB。
2)若该进程为运行态,则保护其现场,将其状态转为阻塞状态,停止运行。
3)把该PCB插入到相应事件的等待队列中去。
被阻塞的进程所期待的事件出现时,则由有关进程调用唤醒原语,唤醒原语的执行过程:
1)在该时间的等待队列中找到相应进程的PCB。
2)将其从等待队列中移出,并置其状态为就绪状态。
3)把该PCB插入就绪队列中,等待调度程序调度。
进程的阻塞是由被阻塞进程自我调用实现的,而唤醒是由一个与被唤醒进程相合作或被其他相关的进程调用实现的。
4、进程切换
对于通常的进程,其创建、撤销以及要求由系统设备完成的I/O操作都是利用系统调用而进入内核,再由内核中相应处理程序予以完成的。进程切换同样是在内核的支持下完成的。任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
进程切换过程如下:
1)保存处理机上下文,包括程序计数器和其他寄存器。
2)更新PCB信息。
3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等其他队列。
4)选择另一个进程执行,并跟新其PCB。
5)更新内存管理的数据结构。
6)恢复处理机上下文。
进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。如果进程因中断或异常进入核心态运行,执行完成后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时候所保存的CPU现场,无需改变当前进程的环境信息。但若要切换进程,当前运行的进程改变了,则当前进程的环境信息也需要改变。
“调度”和“切换”的区别:调度指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。

2.1.4 进程的组织

1、进程控制块
PCB是进程实体的一部分,是进程存在的唯一标志。操作系统利用PCB表来管理和控制进程。
在一个系统中,为了方便进程的调度和管理,需要将进程的PCB用适当的方法组织起来。常用的组织方法有链接方式和索引方式两种。
链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可以把处于阻塞状态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。
索引方式是将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。
2、程序段
能被进程调度程序调度到CPU执行的程序代码段。程序可以被多个进程共享,也就是说多个进程可以运行同一个程序。
3、数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。

2.1.5 进程的通信

进程的通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信主要有已下三个类:
1、共享存储
通信的进程之间存在一块可直接访问的共享空间。在对共享空间进行读写操作时,需要使用同步互斥工具(如P操作,V操作)控制共享空间的读/写。共享存储分为两类:低级方式的共享是基于数据结构的共享;高级方式则是基于存储区的共享。操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读/写指令完成。
2、消息传递
消息传递系统中,进程利用操作系统提供的消息传递方法(发送原语,接收原语)进行数据交换。
1)直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接受进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。
2)间接通信方式:发送进程把消息发送到某个中间实体中,接受进程从中间实体中取得信息。这种中间实体一般称为信箱,这种通信方式又称为信箱通信方式。(例如电子邮件系统)
3、管道通信
管道,是指连接一个读进程和写进程以实现它们之间通信的一个共享文件,又名pipe文件。
为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥、同步和确定对方的存在。
在Linux中,管道是一种使用非常频繁的通信机制,管道通信可以克服使用文件进行通信的两个问题:
1)限制管道的大小。实际上,管道是一个固定大小的缓冲区。Linux中,该缓冲区的大小为4KB。当管道被写满时,对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
2)读进程也可能比写进程快。当所有当前进程数据已被读取时,管道变空。这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
管道只能采取半双工通信,即某一时刻只能单向传输。要实现父子进程双方互动通信,需要定义两个管道。

2.1.6 线程概念和多线程模型

1、线程的基本概念
引入进程的目的,是为了更好地使多道程序并发执行,以提高资源利用率和系统吞吐量,增加并发程度;而引入线程,则是为了减小程序在并发执行时所付出的时空开销。提高操作系统的并发性能。
线程最直接的理解就是**“轻量级进程”,它是一个CPU执行单元**,也是程序执行流的最小单元,由程序ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个尸体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性,线程也有就绪、阻塞和运行三种基本状态。
**进程只作为除CPU以外系统资源的分配单元,线程则作为处理机的分配单元。**由于一个进程有多个线程,如果线程的切换发生在同一个进程内部,则只需要很少的时空开销。
2、线程和进程的比较
1)调度。拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程的切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
2)拥有资源。进程是拥有资源的基本单位,而线程不拥有系统资源。
3)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且多个线程之间也可以并发执行,从而使操作系统具有更好的并发性,提高了系统的吞吐量。
3)系统开销。创建或撤销进程的时候,系统付出的开销远大于创建或撤销进程的开销。线程之间的同步和通信非常容易实现,甚至无需操作系统的干预。
5)地址空间和其他资源(如打开的文件):进程的地址空间之间相互独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
6)通信方面。进程间通信(IPC)需要进程同步和互斥手段的辅助,以保证数据的一致性,而线程之间可以直接读/写进程数据段(如全局变量)来进行通信。
3、线程的属性
1)线程是一个轻量型实体,它不用有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态。
2)不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统为它们创建不同的线程。
3)同一进程中的各个线程共享该进程所拥有的资源。
4)线程是处理机的独立调度单位,多个线程是可以并发执行的。
5)一个线程在被创建后便开始了它的生命周期,直至终止,线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化。
4、线程的实现方式
线程的实现可以分为两类:用户级线程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)。内核级线程又称为内核支持的线程。
在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在,应用程序可以通过使用线程库设计成多线程程序。
在内核级线程中,线程管理的所有工作由其内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也是在内核基于线程架构的基础上完成。
在一些系统上,使用组合方式的多线程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。
5、多线程模型
1)多对一模型。将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成,此模式中,用户级线程对操作系统不可见(即透明)。
优点:线程管理是在用户空间进行的,因而效率比较高。
缺点:当一个线程在使用内核服务时被阻塞,那么整个进程都会被阻塞;多个线程不能并行地运行在多处理机上。
2)一对一模型。将每个用户级线程映射到一个内核级线程。
优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。
缺点:每创建一个用户级线程都需要创建一个内核级线程与之对应,这样创建线程的开销比较大,会影响到应用程序的性能。
3)多对多模型。将n个用户级线程映射到m个内核级线程上,要求m小于等于n。
特点:克服了多对一模型的并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程,开销太大的缺点。又拥有多对一模型和一对一模型各自的优点。

知识架构图
在这里插入图片描述

考察知识点

1、并发进程失去封闭性,是指并发进程共享变量,其执行结果与速度有关。
2、在多对一的线程模型中,当一个多线程进程中的某个线程 被阻塞后,整个进程都将被阻塞。
在多对一的线程模型中,用户级线程的“多”对操作系统透明,即操作系统并不知道用户有多少线程。故该进程的一个线程被阻塞后,该进程就被阻塞了,进程的其他线程当让也都被阻塞了。
3、若一个进程实体由PCB、共享正文段、数据堆段和数据栈段组成,请指出下列C语言程序中的内容及相关数据结构各位于哪一段中:
全局赋值变量(栈段)、未赋值的局部变量(正文段)、函数调用实参传递值(正文段)、用malloc()要求动态分配的存储区(堆段)、常量值(正文段)、进程的优先级(PCB)。
4、用户登录成功以及启动程序执行都会创建进程。
5、进程中的线程共享进程内的全部资源,但进程中的某线程栈指针,对其他线程是透明的,不能与其他线程共享。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的进程线程有以下几个区别: 1. 数据结构:在Linux中,线程是通过进程模拟出来的,没有真正意义上的线程数据结构。而在Windows中,操作系统线程创建了thread_struct数据结构,因此有真正意义上的线程。 2. 执行流:在Linux中,每个线程实体对应着操作系统下的一条执行流,通过PCB(task_struct)来模拟。而用户态下创建的线程是通过线程库(pthread_struct)来进行管理。 3. 标识作用:在Linux中,轻量级进程ID(tid)对不同的线程起标识作用,操作系统在进行调度时使用tid。而进程ID(pid)对不同的进程起标识作用。在只有一个线程进程中,tid的值等于pid的值。 4. 线程私有部分:线程私有部分包括运行时栈、一组寄存器/硬件上下文/任务状态等。 5. 多线程提高效率:多线程能够提高效率的原因是多核和单核环境下的不同。在多核环境下,多线程可以将庞大的任务分成若干份,并交给不同的线程进行处理,同时执行不同步骤的代码,从而提高效率。而在单核环境下,多线程并发执行,使用线程切换来提高整体代码的运行效率。 6. 进程线程的区别:进程是程序运行的实例,是系统分配资源的基本单位,拥有独立的地址空间;线程进程中的一条执行流,是CPU调度的基本单位,共享同一地址空间。创建和撤销进程的开销大于线程,不同进程间不会互相影响,而一个线程挂掉可以将整个进程挂掉。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值