不直一文网

2.1进程与线程【操作系统】【王道听课笔记与复述】

2.1进程与线程【操作系统】【王道听课笔记与复述】

进程与线程听课笔记,进程很多用自己的线程系统话写的,有大白话和场景化有助于理解的操作例子,有讲解有配图,王道比较通俗易懂和全面。听课学操作系统的笔记小伙伴可一起来学习呀
1 进程状态的转换
当进程创建态完成后,就有了上cpu运行条件,复述此时进程就进去了就绪态
处于就绪态的进程进程其实已经具备运行条件,但唯一就差处理机(没有空闲的线程系统cpu)其他都有了,就暂时不能运行
若处于就绪态的操作进程被操作系统调度,那么这个进程则可以上处理机运行,王道当在处理机上运行时就是听课运行进程的运行态;处于运行态的进程拥有处理机的资源,其他资源也有
而有时正在运行的笔记进程可能会请求等待某些事件的发生,在这个事件发生前,复述进程无法继续执行,进程这时进程不能占着处理机资源,此时进程被剥夺处理机资源,变为阻塞态。处于阻塞态的进程既没有处理机资源,也没有其他资源,处于阻塞态的进程在等待某种事件发生,若它等待的事件发生了,进程就可由阻塞态回到就绪态
在这里插入图片描述

2 运行态→阻塞态是进程自身做出的主动行为;阻塞态→就绪态不是进程自身能控制的是一种被动行为

3 (一)进程的三种基本状态
(1)运行态:占有cpu,在cpu上运行
(2)就绪态:具备运行条件,但由于没有空闲cpu,而暂时不能运行
(3)阻塞态(等待态):因等待某一事件而暂时不能运行
(二)进程的另外两种状态
(1)创建态(新建态):进程正在被创建,os为进程分配资源,初始化pcb
(2)终止态(结束态):进程正在从系统中撤销,os会回收进程拥有的资源,撤销pcb

4 【等待态≠就绪态】 名称别混
阻塞态又叫等待态≠就绪态

5 进程控制就是要实现进程状态的转换,那么怎么实现进程控制呢?
要通过原语实现,而原语的执行具有“原子性”,要一气呵成不能中断,故进程控制(状态转换)的过程也要“一气呵成”。那么为什么要一气呵成呢?
情景eg:假设pcb中的变量state表示进程当前所处状态,如1表示就绪态,2表示阻塞态
[若一个进程处于就绪态,state=1,该进程的pcb要挂在就绪队列里;而若进程的state=2,则该进程的pcb要挂在阻塞队列里]
处于阻塞队列的这些进程是在等待某些事件的发生。假设此时进程2(记作pcb2)等待的事件已经发生了,那么该进程要从阻塞态转换为就绪态,操作系统中的程序(即[负责进程控制的内核程序])要将该进程的状态转换(阻塞态→就绪态),在进程转换的这个过程中os中负责进程控制的内核程序至少要做这样2件事:①将pcb2的state(即state2)设为1 ②将pcb2从阻塞队列放到就绪队列中。
假如上述①完成后(即state1设为1后)收到中断信号,不能执行②,这时pcb2的state已变成了1(表示变成了就绪态),但由于中断没执行②,pcb2仍位于阻塞队列中.这样导致了pcb中的状态信息与pcb所处队列对应不起来(即:os中某些关键数据结构信息不统一),这会影响os进行别的管理工作
在这里插入图片描述

故进程控制过程(即进程的状态转换)的过程要一气呵成不能中断[依托于原语实现不能中断]

6 如何实现原语的“原子性”
【问】 那么为什么原语这种特殊的内核程序具有一气呵成不被中断的性质(原子性)呢?
【答】可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性
讲解如下文字和图片.
我们从第一章可知,cpu每执行完一条指令,都会检查是否有中断信号需要处理,若某条指令执行完检查到了有中断信号,则cpu会暂停执行当前程序转而执行处理中断的程序,等中断程序完成后才会返回执行被中断的程序。
【问】那么如果【执行关中断指令】会怎样?
【答】CPU执行了关中断指令后,就不再照常每个指令完检查中断信号,直到执行开中断指令之后才会恢复检查
在这里插入图片描述

·关中断指令和开中断指令不能用户使用,只能内核程序使用

7 创建原语让一个程序从创建态→就绪态,将其放入了就绪队列中

8 进程控制块PCB
(1)pcb是进程存在的唯一标志,当进程被创建时,os为其创建pcb,当进程结束时,会回收其pcb
(2)os对进程进行管理工作所需的信息都存在于pcb中
(3)pcb中包括了进程描述信息(进程标识符PID,用户标识符UID),进程控制和管理信息(CPU 磁盘 网络流量的使用情况统计,进程当前状态),资源分配清单(正在使用哪些文件,正在使用哪些内存区域,正在使用哪些IO设备),处理机相关信息(如PSW PC等各种寄存器的值(用于实现进程切换))
(4)进程的管理者(操作系统)所需的数据都在PCB中

9 进程的组成 [严格说是:进程实体(进程映像)的组成]+进程的概念
进程是动态的,进程实体(进程映像)是静态的;进程实体是不断变化的;进程实体反映了进程在某一时刻的状态(如x++后,x=2)
当引入进程实体的概念后,可以把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
(其实一般题目没特殊说明,也不用太过在意进程与进程实体的区别)
(1)PCB
(2)程序段:程序的代码(指令序列)
(3)数据段:运行过程中产生的各种数据(如:程序中定义的变量)
·PCB是给操作系统用的,程序段和数据段是给进程自己用的

10 程序是如何运行的
(1)程序在运行前需要编译成二进制的机器指令,程序执行的过程其实就是CPU执行一条条的被编译器编译好的二进制机器指令的过程(一条高级语言的代码翻译过来可能对应多条机器指令) 下面细化一下程序的运行过程
平时程序存在硬盘中的是可执行文件(**.exe)(其实就是一条条指令序列),程序运行前,要将程序从硬盘放入内存中,并且os会为其建立一个与其对应的进程(即创相应的PCB) 内存中除了创建相应的PCB外,上面说的一系列指令序列也要读到内存中(这些指令序列的集合就叫程序段) 程序运行的过程就是CPU从内存中取出存放的一条条指令执行的过程。而程序运行中可能产生其他数据,这些数据被存在内存中,就是数据段(如定义了哪些变量的信息就是放在数据段里的)
在这里插入图片描述

(2)进一步的细节
程序运行中会需要一些数据,CPU中会设置很多寄存器,来存放程序(一条条指令)运行过程中所需的某些数据(如PSW:程序状态字寄存器,PC:程序计数器,存放下一条指令的地址,IR:指令寄存器存放当前正在执行的指令,通用寄存器:存放其他重要信息)(注意上面括号中的寄存器不是一个进程独属的,若CPU中有多个进程运行,那么前面扩号中的寄存器也会被其他进程使用)[指令顺序执行的过程中,很多中间结果是放在各种寄存器中的]

11 进程的特征(理解不用死记硬背)
进程是动态的,程序是静态的,相比与程序,进程有以下特征
(1)动态性【进程最基本的特征】:进程是程序的一次执行过程,是动态产生,变化和消亡的
(2)并发性:内存中有多个进程实体,各进程可并发执行
(3)独立性:进程是能独立运行,独立获得资源,独立接受调度的基本单位(在引入了线程后,进程就不再是接受调度的基本单位了,但依然是获得资源的基本单位)
(4)异步性:各进程按各自独立的,不可预知的速度向前推进,os要提供“进程同步机制”来解决异步问题(异步性会导致并发程序执行结果的不确定性,后面“进程同步”一节会讲到)
(5)结构性:每个进程都会配置一个PCB.从结构上看,进程由程序段,数据段,PCB组成

12 进程控制原语要做的事情
进程控制会导致进程状态的转换,无论哪个进程控制原语,要做的无非就3类事情
(1)更新PCB中的信息
a.所有进程控制原语一定都会修改进程状态标志
b.剥夺当前运行进程的CPU使用权必然要保存其运行环境
c.某进程开始运行前必然要恢复其运行环境
(2)将PCB插入合适的队列
(3)分配/回收资源
【更新信息;插入队列;分配/回收资源】

13 进程通信
(一)什么是进程通信
顾名思义,进程通信就是指进程间的信息交换。
进程是分配资源。的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为保证安全,一个进程不能直接访问另一个进程的地址空间。但进程之间的信息交换又是必须要实现的,为了保证进程间的安全通信,os提供了一些进程通信的方法:共享存储,消息传递,管道通信。
(二)进程通信的三种实现方式
(1)共享存储:基于数据结构的共享,基于存储区的共享
·两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现),os只负责提供共享空间和同步互斥工具(如P V操作)
·基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
·基于存储区的共享:在内存中划出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
在这里插入图片描述

(2)管道通信
“管道”是指用于连接读写进程的一个共享文件,又名pipe文件.其实就是在内存中开辟一个大小固定的缓冲区。
1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
2.各进程对管道的访问要互斥进行(互斥这点与进程访问共享空间一样)
如当进程1往管道内写数据时,进程2是不能访问管道的;只有进程1释放管道后,进程2才能从管道里读数据。那么管道中的数据通信是如何实现的呢?
3.管道中数据通信的实现:进程1的数据以字符流的形式不断写入管道,当管道写满时,写进程的write()系统调用将被阻塞(进程1不能再向管道内写数据),等待读进程将数据全部取走后才能继续向管道里写数据。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
[注意]①如果没写满,就不允许读。如果没读空,就不允许写
②管道中的数据一旦被读出,就会从管道中被抛弃(找不回来了),这就意味着一个管道的读进程最多只能有一个,否则可能读错数据

在这里插入图片描述

(3)消息传递:直接通信和间接通信
1.进程间的数据交换以格式化消息为单位,通过os提供的“发送消息/接收消息”两个原语实现。一个格式化的消息分为消息头和消息体。消息头包括:发送进程ID、接受进程ID、消息类型、消息长度等格式化的信息(计算机网络中发送的“报文”其实就是一种格式化的消息)
在这里插入图片描述

2.直接通信方式过程:直接通信方式中,消息直接挂在接受进程的消息缓冲队列上。每个进程都有个消息缓冲队列,若有另一个进程想给其发送消息时(假如进程1想给进程2发送消息) 进程1先创建好格式化的消息,该消息会通过发送原语发送给进程2,依次挂入进程2的消息缓冲队列,然后进程2会通过接受原语将队列中的消息依次取走处理
在这里插入图片描述
3. 间接通信方式过程与直接类似,但消息要先发送到中间实体(信箱)中(故又称“信箱通信方式”) eg:计网中的电子邮件系统
在这里插入图片描述

14 线程
(1)引入线程后,线程成为了程序执行流的最小单位
引入线程前,一个程序只对应一份代码,这些指令只能顺次往下执行;引入线程后,每个进程可以有多个线程,这些线程可以有各自不同的代码,也可以不同的线程运行同一份代码,不管哪样这些可以被PCU并发处理
(2)线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
(3)引入线程后,进程不再是CPU调度的基本单位,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。线程则作为处理机的分配单元。
(可将线程理解为“轻量级进程”)
(4)引入线程机制后的变化
①资源分配,调度方面:传统进程机制中,进程是资源分配、调度的基本单位;引入线程后,进程是资源分配的基本单位,线城是调度的基本单位
②并发性:传统进程机制中,只能进程间并发;引入线程后,各线程间也能并发,提升了并发量
③系统开销:传统进程机制中,需要切换进程的运行环境,系统开销很;引入线程后,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销减小
(5)线程的属性
①线程是处理机调度的基本单位
②多CPU计算机中,各个线程可占用不同的CPU
③每个线程都有一个线程ID,线程控制块(TCB)(有点类似PCB)
④线程也有就绪,阻塞,运行三种基本状态
⑤线程几乎不拥有系统资源(因为引入线程后,线程只是处理机调度的基本单位,而系统资源分配是分配给进程的)
⑥同一进程的不同线程间共享进程的资源(上一条说线程几乎不拥有系统资源,那它需要的话资源从哪来呢,就是同一进程的不同线程间共 享进程的资源)
⑦由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预(通过共享的内存就能线程间通信)
⑧同一进程中的线程切换,不会引起进程切换;不同进程中的线程切换,会引起进程切换
⑨切换同进程内的线程,系统开销很小;切换进程,系统开销较大

15 线程的实现方式
线程的实现方式有2种:用户级线程和内核级线程
(1)用户级线程(早期os)
①线程的管理工作由谁来完成?用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)
②线程切换是否需要CPU变态?用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预(不需请求操作系统的服务)
③os能否意识到用户级线程的存在?在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程”
④优缺点
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统
开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可
在多核处理机上并行运行。
在这里插入图片描述

(2)内核级线程(现在用)
大多现代os都实现了内核级线程(Windows,Linux)
①线程的管理工作由谁来完成?内核级线程的管理工作由操作系统内核完成。
②线程切换是否需要CPU变态?线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要CPU在核心态(CPU要变态:用户态→内核态/核心态(注意用完CPU还要切换回用户态))下才能完成。
③os能否意识到用户级线程的存在?操作系统会为每个内核级线程建立相应的TCB(ThreadControlBlock,线程控制块),通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”
④优缺点
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
在这里插入图片描述

16 多线程模型
上面提到的2种线程实现方式(用户级线程,内核级线程)各有优缺点,能不能想着把两者的优点结合起来呢?可以,引入多线程模型。在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型
(1)一对一模型:一个用户级线程映射到一个内核级线程,每个用户进程有与用户级线程同数量的内核级线程。
①优点:当一个线程被阻塞后,别的线程还可以继续执行(因为内核级线程是处理机分配的基本单位),并发能力强。多线程可在多核处理机上并行执行。
②缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
在这里插入图片描述

(2)多对一模型:多个用户级线程映射到一个内核级线程,且一个进程只被分配一个内核级线程(其实这样就退化到了上面15中提到过的纯粹的用户级线程的实现方式)
[考试中若提到多对一的多线程模型,默认就是一个进程只被分到了一个内核级线程]
①优点:用户级线程的切换在用户空间就能完成,不需要CPU从用户态切换到核心态,线程管理的系统开销小,效率高
②缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并发运行(因为只有内核级线程才是处理机分配的单位,而这些用户级线程都映射到了一个内核级线程中去了)
在这里插入图片描述

【重点VIP】操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。

(3)多对多模型:n用户及线程映射到m个内核级线程(n>=m),每个用户进程对应,个内核级线程。
客服了多对一模型并发度不高(一个阻塞全体阻塞)的缺点(如下图因为有2个内核级线程,故若一个内核级线程被阻塞,另一个内核级线程可以继续运行下去),又克服了一对一模型中一个用户进程占太多内核级线程,开销太大的缺点(集二者之长)
[注]再来理解下用户级线程和内核级线程的区别
a.用户级线程:从用户视角能看到的线程,由线程库实现。用户级线程可理解为“代码逻辑”的载体(如下图中的用户级线程从左到右分别承载的是视频聊天,文字聊天,文件传输的代码逻辑)
b.内核级线程:从os视角看到的线程,由os实现(内核级线程才是处理机分配的单位)。内核级线程可理解为“运行机会”的载体,因为os在分配处理机CPU资源时,是以内核级线程为单位进行分配的(还是牢记那句话:内核级线程才是处理机分配的单位)
·一段“代码逻辑”只有获得了“运行机会”才能被CPU执行。内核级线程中可以运行任意一个有映射关系的用户级线程代码,如下图当2个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞(即:一个进程可能对应多个内核级线程,而只有所有的内核级进程都被阻塞时,才说此进程进入了阻塞态)
在这里插入图片描述

未经允许不得转载:不直一文网 » 2.1进程与线程【操作系统】【王道听课笔记与复述】