【王道操作系统笔记】第二章 进程线程

本文介绍了操作系统中进程的概念、组成和特征,包括状态转换、进程控制原语以及进程间的通信方式。线程作为执行的最小单位,降低了资源切换的开销。讨论了调度的基本概念,如高级调度、低级调度和中级调度,以及各种调度算法,如FCFS、SJF、时间片轮转等。还涉及进程同步和互斥的实现,如信号量机制和互斥锁,以及生产者消费者问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.1.1进程的概念、组成、特征

 

1.进程的概念:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

2.如何区分进程:操作系统为进程分配一个PID,相当于人的身份证号。PID分配每次+1

3.像PID,UID,进程分配了哪些资源,运行情况等信息都被保存在一个数据结构PCB中,即进程控制块。(PCB是进程存在的唯一标志)

4.PCB是给操作系统用的;程序段(包含程序指令)、数据段(包含运行过程中产生的各种数据)是给进程自己用的。

5.进程的特征:动态性(最基本的特征)、并发性、独立性、异步性、结构性

2.1.2进程间状态的转换

 

 

1.进程的状态:创建态、就绪态、运行态、阻塞态、终止态。

(1)进程被创建时,是创建态,在这个状态操作系统会为其分配资源,初始化PCB;

(2)进程创建完成后进入就绪态,已经具备运行条件,但由于没有空闲CPU所以暂时不能运行;

(3)如果一个进程此时在CPU上运行就处于运行态。

(4)在进程运行过程中,进程可能会需要某些资源条件,在没有资源条件的时候就不能继续运行,这个时候CPU会让进程下CPU进入阻塞态。

(5)一个进程可以执行exit系统调用,请求操作系统终止该进程,此时进程进入终止态,操作系统会让进程下CPU,并回收资源和PCB。

2.单CPU同一时刻只能有一个运行态的进程。多核CPU可有多个进程处于运行态。

3.进程的组织:链式方式、索引方式。链式方式用指针,执行指针指向处于运行态的进程,一个进程又有指针指向下一个进程;索引方式用索引,就绪表指针指向就绪索引表,索引表的不同索引是不同进程。

2.1.3进程控制

  1. 什么是进程控制:实现进程状态的转换。
  2. 如何实现进程控制:用原语。原语是一种特殊程序,执行必须一次执行完,不能中断。为什么不能中断?如果中断就可能导致操作系统某些关键数据结构信息不统一,会影响操作系统进行别的管理工作。
  3. 如何实现原语:用开中断和关中断两个特权指令实现。CPU执行了关中断指令之后就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。
  4. 进程控制相关的原语:进程的创建(创建原语)、进程的终止(撤销原语)、进程的阻塞和唤醒(阻塞原语,唤醒原语)、进程的切换(切换原语)
  5. 进程间的关系是树形结构。父进程,子进程。
  6. 进程控制原语做的事:更新PCB的信息。将PCB插入合适的队列(就绪态队列,运行态队列)。分配回收资源。

2.1.4进程通信

1.进程间通信IPC:进程间进行数据交互。微博文章分享到微信。

2.为什么进程的通信需要操作系统?各进程拥有的内存地址空间相互独立,不能访问其他进程的地址,为了安全考虑。

3.进程间的通信方式:共享存储、消息传递、管道通信

共享存储:通过系统调用开一片共享内存区,然后映射到自己的地址空间,也就是自己可以访问。这样,两个进程就有一个公共的地址空间了。但要保证各个进程对共享区的访问是互斥的,防止写冲突之类的问题。 (基于存储区的共享速度快,是一种高级通信方式;基于数据结构的共享则是低级通信方式,比如只有长度为10的数组)

消息传递:进程间的数据交换以格式化的消息为单位。进程通过“发送、接收消息”两个原语进行数据交换。(消息头:谁发送的,发送给谁、消息体:要传送的消息)(直接通信:指定对方进程的PID、间接通信:通过信箱中间实体)

管道通信:数据流动是单向的(管道只能采用半双工通信),一个进程写数据经过管道到了另一个进程。管道是一个特殊的共享文件,pipe文件。其实就是在内存中开辟一块大小固定的内存缓冲区(循环队列)。如果需要双向同时通信(全双工通信)就需要两个管道。操作系统实现各进程互斥的访问管道。当管道写满,写进程将阻塞;当管道读空,读进程将阻塞。

管道中的数据一旦被读出就会彻底消失。因此,当多个进程读同一个管道可能会出错。两种解决①一个管道允许多个写进程一个读进程(某年408答案,以此说法为准)②允许有多个写进程多个读进程,但系统会让各个进程轮流读数据。(Linux系统)

4.只要管道不为空,读进程就可以读取数据;只要管道没满,写进程就可以写数据

2.1.5线程的概念

 

 

1.什么是线程?进程实现了QQ和音乐软件两个软件同时运行。线程实现了QQ里的聊天,视频等功能同时运行。引入了线程之后,线程成了执行的最小单位。

2.同一进程内的线程切换,不需要切换进程环境,系统开销小。

2.1.6线程的实现方式和多线程模型

1.线程的实现方式

用户级线程:线程的切换在用户态就可以完成,并不需要操作系统的干涉。操作系统看不到线程的存在,只能看到进程。

优点:系统开销小,效率高。缺点:如果其中一个线程被阻塞,整个进程都被阻塞,并发性不高、多个线程不可在多核处理及上运行。

内核级线程:由操作系统支持的线程,操作系统也可意识到线程存在。线程由操作系统管理,线程的切换需要CPU状态的转换。

优点:一个线程被阻塞后,别的线程还可继续执行,并发性高、多线程可在多核处理机上运行。缺点:线程切换需要CPU的状态的转换,开销大。

2.多线程模型

一对一模型:一个用户级线程对应一个内核级线程。并发性高,但开销大。

多对一模型:多个用户级线程对应一个内核级线程。开销小,并发性不高。

多对多模型:n个用户级线程映射到m个内核级线程上(n>=m)。克服了多对一模型并发度不高的缺点,同时开销相对较小。

3.用户级线程是“代码逻辑”的载体;内核级线程是“运行机会”的载体。

4.内核级线程才是处理机分配的单位。

2.1.7线程的状态与转换

1.线程也有运行态、阻塞态、就绪态。

2.2.1调度的概念层次

1.调度的基本概念:有一堆任务要处理,但资源有限没法同时处理,就要确定某种规则来决定处理顺序。这就是调度研究的问题。

2.三种挂起方式

高级调度(作业调度):作业是一个具体的任务(用户向系统提交一个作业≈用户让操作系统启动一个程序)。按一定原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时建立PCB调出时撤销PCB。

低级调度(进程调度/处理机调度):按某种策略从就绪队列中挑选一个进程,将处理机分配给他。进程调度是操作系统最基本的一种调度,频率很高。

中级调度:内存不够时,先把某些不太紧急的调出到外存,等内存空闲再调入回来。调到外存的状态为挂起状态,被挂起的进程PCB会放到挂起队列里。中级调度就是按某种策略决定将那个处于挂起的进程重新调入内存。中级调度频率比高级调度高。

2.2.2进程调度的时机、切换、过程、方式

1.进程调度(低级调度)的时机:当前运行的进程主动放弃处理机(比如进程正常终止)、当前运行的进程被迫的放弃处理机(比如分给进程的时间片用完)

不能进行进程调度与切换的情况:在处理中断的过程中、进程在操作系统内核程序临界区中、在原子操作的过程中

2.进程在操作系统内核程序临界区中不能进行调度与切换(对)

进程处于临界区时不能进行处理机调度(错)【普通临界区】

临界资源:一个时间段内只允许一个进程使用的资源,各进程需要互斥的访问。

临界区:访问临界资源的那段代码。

比如内核程序临界区访问进程的就绪队列,访问的时候,就绪队列会上锁(别的不能访问),如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。

普通临界区访问的临界资源不会直接影响操作系统内核的管理工作,因此在访问普通临界区时可以进行调度与切换。

3.进程调度的方式

非剥夺调度方式 (非抢占方式):只允许进程主动放弃处理机。适合早期的批处理系统。

剥夺调度方式(抢占方式):如果有更紧急的进程,允许被迫放弃处理机。适合分时操作系统、实时操作系统。

4.狭义的进程调度:从就绪队列中选一个要运行的进程。

进程切换:一个进程让出处理机,由另一个进程占用处理机的过程。

广义的进程调度:包含了选择一个进程和进程切换两个步骤。

5.进程切换的过程主要完成了:对原来运行进程各种数据的保存(将信息写入PCB)、对新的进程各种数据的恢复(从PCB拿数据)

6.进程切换是有代价的,频繁的进行进程切换必然导致系统效率的降低。

2.2.3调度器和闲逛进程

1.不支持内核级线程的操作系统,调度程序的处理对象是进程。

支持内核级线程的操作系统,调度程序的处理对象是内核线程。

2.如果没有其他就绪进程时,运行闲逛进程。

闲逛进程(idle)特点:优先级最低、可以是0地址指令,占一个完整的指令周期、能耗低

 2.2.4调度算法的评价指标

1.CPU利用率:CPU处于忙碌的时间占总时间的比例。

考多道程序并发执行:利用甘特图辅助计算

2.系统吞吐量:单位时间完成作业数量

系统吞吐量=总共完成的作业数量/总共花了多少时间

3.周转时间:从作业被提交给系统开始,到作业完成为止的这段时间间隔。

周转时间=作业完成时间-作业提交时间

平均周转时间=各作业周转时间之和/作业数

带权周转时间=作业周转时间/作业实际运行时间>=1(带权周转时间越小越好)

平均带权周转时间=各作业带权周转时间之和/作业数

比如上厕所等10分钟上1分钟,周转时间11分钟。带权周转时间11/1

4.等待时间:指进程处于等待处理机状态时间之和,等待时间越长用户满意度越低。

对于进程来说,等待时间就是指进程建立后等待被服务的时间之和。在等待IO完成的期间其实进程也在被服务,所以不计入等待时间。

对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

5.相应时间:指从用户提交请求到首次产生相应所用的时间。

2.2.5调度算法1

1.饥饿:一个进程或作业长期得不到服务。

2.先来先服务算法(FCFS)

和现实中排队买东西类似。按照作业/进程到达的先后顺序进行服务。

用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列。

先来先服务算法是非抢占式算法。

优点:公平、算法实现简单

缺点:对于排队时间长执行时间短的进程来说,带权周转时间很大,用户体验不好。即对长作业有利,对短作业不利。

不会导致饥饿。

3.短作业优先(SJF)

追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间。最短的作业/进程优先得到服务。

即可用于作业调度也可用于进程调度,用于进程调度叫短进程优先算法(SPF)

是否可抢占:

默认非抢占式的,但也有抢占式的版本---最短剩余时间优先算法(SRTN)

每次调度会选择当前已经到达的运行时间最短的作业/进程。

最短剩余时间优先算法:每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。

SJF调度算法的平均等待时间, 平均周转时间最少。不严谨,最短剩余时间优先算法更少,“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少”、或者说“在所有进程都几乎同时到达时,采用SJF。。。”、或者直接说抢占式的最短作业优先调度算法时间最少。

优点:“最短的”平均等待时间,平均周转时间

缺点:不公平。对短作业有利,对长作业不利。

可能产生饥饿现象。

4.即考虑到等待时间,又兼顾运行时间---高响应比优先算法

算法规则:在每次调度的时候先计算各个作业/进程的响应比,选择响应比高的服务。

响应比=(等待时间+要求服务时间)/ 要求服务时间>=1

即可用于作业调度,也可用于进程调度。

非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度才需要计算响应比。

优点;综合考虑了等待时间和运行时间。

不会发生饥饿。

2.2.6调度算法2

1.时间片轮转调度算法(RR)

公平的、轮流的为各个进程服务,让每个进程在一定时间间隔内都可得到响应。

按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程在一个时间片内未执行完,则剥夺处理机将进程重新放到就绪队列队尾重新排队。

只用于进程调度。抢占式算法。

优点:对各个进程公平,响应快,适用于分时操作系统

缺点;高频进程切换,有一定的开销;不区分任务的紧急程度

这个算法不会导致饥饿。

注意:

如果时间片太大,每个进程都可以在一个时间片内完成,则时间片轮转算法就会退化为先来先服务算法,会增大进程响应时间,因此时间片不能太大。

如果时间片太小,会导致频繁切换,而切换是有代价的,所以时间片也不能太小。

2.优先级调度算法

为每一个作业/进程设置一个优先级,调度时选择优先级最高的作业/进程。

既可以用于作业调度,也可用于进程调度。

该算法抢占式、非抢占式的都有。

优点:可以区分紧急程度,适用于实时操作系统。

缺点:如果有源源不断的高优先级进程到来,可能导致饥饿。

静态优先级:创建进程确定之后就不变了

动态优先级:创建进程时有一个初始值,之后会根据情况调整优先级

通常:

系统进程优先级高于用户进程

前台进程优先级高于后台进程

操作系统会更偏好IO型进程

如果采用动态优先级怎么调整?

如果某进程在就绪队列等了很长时间,可以适当提高优先级

如果某进程占用处理机运行了很长时间,可适当降低优先级

如果某进程频繁的进行IO操作,可适当提高优先级

3.多级反馈队列调度算法

对其他调度算法的折中权衡。

算法规则:设置多级就绪队列,各级队列优先级从高到低,时间片从小到大、新进程到达时先进入第一级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾、只有第k级队列为空时,才会从k+1级队头的进程分配时间片

用于进程调度,是抢占式的算法。

优点:对各类型进程相对公平,每个新到达的进程都可以很快得到响应,短进程只用较少的时间就可以完成,不必实现估计进程的运行时间(避免用户作假),可以灵活的调整偏好程度

可能会导致饥饿。

2.2.7调度算法3

多级队列调度算法

2.3.1进程同步进程互斥

1.同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源自他们之间的相互合作。

2.进程的并发需要共享的支持,各个并发执行的进程不可避免的需要共享一些系统资源。有互斥共享方式(一个时间段只允许一个进程访问)和同时共享方式(允许一个时间段内由多个进程“同时”对他们进行访问)。

3.临界资源:一个时间段只允许一个进程使用。对临界资源的访问就需要互斥的进行。

对临界资源的互斥访问,可以在逻辑上分为如下四个部分:进入区、临界区、退出区、剩余区。

4.为了实现对临界资源的互斥访问,同时保证系统整体性能,须遵循的原则:

1)空闲让进。临界区空闲,可以允许一个请求进入临界区的进程立即进入临界区。

2)忙则等待。当已有进程进入临界区,其他试图进入临界区的进程必须等待。

3)有限等待。对请求访问的进程,应保证能在有限时间内进入临界区。(保证不会饥饿)

4)让权等待。当进程不能进入临界区,应立即释放处理机,防止进程忙等待。

2.3.2进程互斥的软件实现方法

如果两个打印机并发执行,且没有互斥访问,就会出错,A和B的打印内容混在一起。

1.单标志法

两个进程在访问完临界区后会把临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。turn变量表示“谦让”。在p0进程内把turn设置为1,就是p0进程把使用权谦让给了p1。(我用一次,你用一次,如此反复)

2.双标志先检查

设置一个bool型数组flag,数组中各个元素用来标记各进程想进入临界区的意愿,比如flag[0]=true,意味着0号进程p0现在想进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,就把自身对应标志flag[i]设为true,之后开始访问临界区。(先检查对方用不用,对方用自己就等待,对方不用就自己用)

存在违反忙则等待的问题。

3.双标志后检查

前一个先检查后上锁,这一个先上锁后检查。(我先表达要用,看你想不想用,你不想用我就用)

解决了忙则等待,但存在违背空闲让进和有限等待原则。会产生饥饿。

4.Peterson算法

结合双标志发和单标志法的思想。如果双方都争着进临界区,那可以让进程尝试谦让。

(主动争取,主动谦让,检查对方是否也想使用,且最后一次是不是自己说了客气话)谁最后说了客气话谁就失去了行动的主动权。

未遵循让权等待的原则。

【flag数组表示意愿,turn变量表示谦让】

2.3.3进程互斥的硬件实现方法

1.中断屏蔽方法

优点:简单、高效

缺点:不适用于多处理机,只使用于操作系统内核进程,不适用于用户进程

2.TestAndSet(简称TS指令或TSL指令)

优点:实现简单,无需想软件实现方法那样严格检查是否会有逻辑漏洞,适用多处理机环境

缺点:不满足让权等待,暂时无法进入临界区的进程会占用cpu并循环执行TSL指令,从而导致”忙等“

3.Swap指令

优缺点和TSL一样。

2.3.4互斥锁

锁:简单理解为bool型变量,只有true和false。

互斥锁主要缺点:忙等。进不了临界区就会while循环,通常称为自旋锁(如TSL,swap指令,单标值法)。

2.3.5信号量机制

1.整形信号量、记录型信号量

2.信号量其实就是一个变量,可以用一个信号量来表示系统中某种资源的数量。(系统中有一台打印机,就可以设置一个初值为1的信号量)用原语来对信号量进行操作,wait原语和signal原语,这两个原语可以分别简称为P操作、V操作。

3.整形信号量:用一个整数来表示系统资源的数量。

检查和上锁一气呵成,避免了并发异步导致的问题。

存在的问题:不满足让权等待,会发生忙等

4.记录型信号量:遵循让权等待,不会忙等。当资源分配完毕,进程会调用block原语自我阻塞,主动放弃处理机,并插入该类资源的等待队列中。

若考试中出现P(S)、V(S)操作,除非特别说明,否则默认S为记录型信号量。

2.3.6用信号量实现进程互斥、同步、前驱关系

 

实现进程互斥:

实现进程同步:

实现进程前驱关系:

2.3.7生产者消费者问题

1.问题描述:系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。只有缓冲区没满,生产者才能生产产品放入缓冲区;只有缓冲区不为空,消费者才能从缓冲区拿去产品。缓冲区是临界资源,各进程必须互斥访问。

2.3.8多生产者多消费者问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值