操作系统(operating system,简称OS)是控制和管理计算机硬件与软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口环境,是计算机系统中最基本的系统软件。
目标
安全、高效
功能
命令接口1:允许用户直接使用
-->联机命令接口:用户说一句,系统做一句
-->脱机命令接口:用户说一堆,系统做一堆
程序接口:允许用户通过程序间接使用,由一组系统调用组成
GUI(图形用户界面):现代操作系统中最流行的图形用户接口
目标:方便用户使用计算机
功能:
实现对硬件机器的拓展
没有任何软件支持的计算机称为裸机,覆盖了软件的机器称为扩充机器,也就是虚拟机
图灵机、通用图灵机和计算机
A.C.图灵:在纸带上读入数据,控制器查表,再在纸带上写入数据
图灵机–>通用图灵机(一个能看懂菜谱的厨师)
储存程序
将程序和数据存放到计算机内部,计算机在程序的控制下进行处理。
五大部件
输入设备、运算器、存储器、控制器、输出设备
1.2.2指针IP
X86PC 刚开机时CPU处于实模式
开机时,CS = 0XFFFF;IP = 0 X 0000;
IP指针指向FFFF0;CS左移四位,FFFF -->FFFF0加上IP
检查RAM ,键盘,显示器,磁盘
将磁盘读入操作系统的引导扇区0X7c00
引导扇区:启动设备的第一个扇区
启动设备信息被设置在***CMOS***2中;
设置cs=0X 07c0,IP = 0X 0000
并发
指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但是微观上是交替发生的。
并行
指两个或多个事件在同一时刻同时发生
互斥共享
系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源,例如摄像头
同时共享
系统中的某些资源,允许一个时间段内由多个进程同时对他们进行访问
使用QQ发送文件A,使用微信发送文件B
互为存在条件
指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑对应物是用户感受到的。
”时分复用技术“
微观上处理机在各个微小的时间段内交替着位各个进程服务
1.2.5异步
再多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进
计算机以时间片为单位轮流为各个用户/作业服务
,各个用户可通过终端与计算机进行交互。
优点:用户请求可以被及时响应,解决了人机交互问题,可多个用户同时使用一台计算机,且操作相互独立,感受不到人的存在
缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环的为每个用户作业服务一个时间片,不区分人物的紧急性
能够优先响应一些紧急任务,某些紧急任务不需要时间片排队
在此控制下,计算机操作系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。
主要特点:及时性和可靠性
分为两类:
绝对严格的规定时间内完成处理
能够偶尔违反时间规定
特权指令
不允许普通用户使用
非特权指令
用户态
指非特权状态,在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。在操作系统的设计中,用户态也类似,指非特权的执行状态。内核 禁止此状态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。
此时CPU只能执行非特权指令
核心态
核心态是操作系统内核所运行的模式,运行在该模式的代码,可以无限制地对系统存储、外部设备 进行访问。
内核态可以访问任何数据,特权指令和非特权指令都可执行,用户态不能访问内核数据
用程序状态字寄存器(PSW)中的某标志位来表示当前处理器处于什么状态。如0为用户态1为核心态,核心态转换到特权态可以通过执行一个特权指令,将程序状态字(PSW)的标志位设置为”用户态“
内核程序
可以执行特权指令,用于实现操作系统内核功能的程序,运行在核心态
应用程序
不可以执行特权指令,运行在用户态
实现计时功能
跳转下一小节
是最接近硬件的部分,之中程序的运行育有原子性
早期–串行–效率低
中断机制–>实现多道程序并发
本质上就是发生中断就意味着需要操作系统介入,开展管理工作
1.当中断发生时,CPU立即进入核心态
2.当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理
3.对于不同的中断信号,会进行不同的处理
发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、分配/0设备等)需要使用特权指令,因此CPU要从用户态转为核心态。中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权。有了中断,才能实现多道程序并发执行。
例如陷入trap 有意为之 ;故障fault 错误条件引起,可能被修复 ; 终止 abort不可修复
信号来源CPU内部,与当前执行的指令有关
信号来源CPU外部,与当前执行的指令无关
概念
系统调用是操作系统提供给应用程序使用的接口,可以理解为一种可供应用程序雕鹰的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务,系统调用会使处理器从用户态–>核心态
什么时候会进行系统调用?
资源共享操作,敏感操作,可能对安全造成威胁
系统调用按照功能分
设备管理——完成设备的请求/释放/启动等功能
文件管理——完成文件的读/写/创建/删除等功能
进程控制——完成进程的创建/撤销/阻塞/唤醒等功能
进程通信——完成进程之间的消息传递/信号传递等功能
内存管理——完成内存的分配/回收等功能
注意
系统调用相关处理涉及到对系统资源的管理、对进程的控制,这些功能需要执行一些特权指令才能完成,因此系统调用的相关处理需要在核心态下进行
系统调用的相关处理在核心态进行
普通应用程序——可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及
编程语言——向上提供库函数。有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使上层进行系统调用更加方便。
操作系统——向上提供系统调用
库函数不一定涉及系统调用
调用库函数,而该函数内部封装了系统调用的复杂细节
用户程序(汇编语言视角)运行在用户态
处理系统调用的相关代码(运行在核心态)
系统调用发生在用户态,但是对系统调用的处理发生在核心态
传递系统调用参数–>执行陷入指令(用户态)–>执行系统调用相应的服务程序(核心态)–>返回用户程序
注意:
1.陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,从而CPU进入核心态
2.发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
3.陷入指令是唯–一个只能在用户态执行,而不可在核心态执行的指令
程序:就是一个指令序列,早期计算机只支持单道程序
程序的代码段放在程序段内,程序运行过程的数据处理放在数据段内
PCB进程控制块(process control block)
系统为 每个运行的程序配置一个数据结构,称为PCB,用来描述进程的各种信息
**进程实体(进程映像)**简称为进程
由PCB、程序段、数据段三部分构成,PCB是进程存在的唯一标志
从不同的角度,进程可以有不同的定义,比较传统典型的定义有:
1.进程是程序的一次执行过程。
2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3.进程是具有独立功能的程序在数据集合上运行的过程(强调动态性),它是系统进行资源分配和调度的一个 独立单位
引入进程实体的概念后,可把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
当进程被船舰是,操作系统会为该进程分配一个唯一的、部车哦那个福德的ID,用于区分不同的进程
各种寄存器。进程切换时需要把进程当前的运行情况记录下来保存在PCB中
跟数据管理相关的一定是在PCB中
程序段数据段存放的是程序本身所需的数据
动态性是进程最基本的特征
进程是资源分配、接受调度的基本单位
异步性会导致并发程序执行结果的不确定性。
三种基本状态:运行态、就绪态、阻塞态
运行状态
占有CPU,并在CPU. 上运行
注意
单核处理机环境下,每一时刻最多只有一个进程处于运行态。(双核环境下可以同时有两个进程处于运行态)
就绪状态
已经具备运行条件,但由于没有空闲CPU,而暂时不能运行
进程已经拥有了除处理机之外所有需要的资源,一且获得处理机,即可立即进入运行态开始运行。即:万事俱备,只欠CPU
阻塞状态
因等待某一事件而暂时不能运行
如:等待操作系统分配打印机、等待读磁盘操竹
的结果。CPU是计算机中最昂贵的部件,为了提
高CPU的利用率,需要先将其他进程需要的资源
分配到位,才能得到CPU的服务
创建状态(New)
操作系统需要完成创建进程。操
作系统为该进程分配所需的内存
空间等系统资源,并为其创建、
初始化PCB (如:为进程分配PID)
终止状态(Terminated)
进程运行结束(或者由于bug导致进程
无法继续执行下去,比如数组越界错
误),需要撤销进程
操作系统需要完成撤销进程相关
的工作。完成将分配给进程的资
源回收,撤销讲程PCB等工作
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
如何实现进程控制?
用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。
这种不可被中断的操作即原子操作。
原语采用“关中断指令”和“开中断指令”实现,在核心态下执行
更新PCB中 的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
1.更新中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
所有的进程控制原语–定都会修改进程状态标志
一个。所有的进程控制原语–定都会修改进程状态标志
剥夺当前运行进程的CPU使用权必然需要保存其运行环境
某进程开始运行前必然要恢复期运行环境
2.将PCB插入合适的队列
3.分配/回收资源
概念
顾名思义,进程通信就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
为了保证安全,一个进程不能直接访问另个进程的地址空间。但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。
两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。操作系统只负责提供共享空间和同步互斥工具(如P、V操作)
比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
基于存储区的共享:在内存中画出一块共享存
储区,数据的形式、存放位置都由进程控制,
而不是操作系统。相比之下,这种共享方式速
度更快,是一种高级通信方式。
进程间的数据交换以格式化的消息(Message) 为单位。进程通过操作系统提供的“发送消息/接收
消息”两个原语进行数据交换。
消息直接挂到接收进程的消息缓冲队列上
消息要先发送到中间实体(信箱)中,因此也称“信箱通信方式”。Eg: 计网中的电子邮件系统
管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区
1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置
两个管道。
2.各进程要互斥地访问管道。
3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
4.写满时,不能再写。读空时,不能再读如果没写满,就不允许读。如果没读空,就不允许写。
5.数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况
还没引入进程之前,系统中各个程序只能串行执行。有些进程需要同时工作,因此引入线程。
传统的进程是程序执行流的最小单位
引入线程后,线程成为了程序执行流的最小单位
可以把线程理解为“轻量级进程“线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务( 如QQ视频、文字聊天、传文件)
线程是处理机调度的单位,进程是资源分配的单位
由应用程序通过线程库实现。
所有的线程管理工作都由应用程序负责(包
括线程切换)
用户级线程中,线程切换可以在用户态下即
可完成,无需操作系统干预。
在用户看来,是有多个线程。但是在操作系
统内核看来,并意识不到线程的存在。(用
户级线程对用户不透明,对操作系统透明)
可以这样理解,“ 用户级线程”就是“从用
户视角看能看到的线程”
内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
可以这样理解,“内核级线程” 就是“从操作系统内核视角看能看到的线程
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上( n>=m)
重点重点重点:
操作系统只“看得见”内核级线程,因此只有***内核级线程才是处理机分配的单位。***
例如:上边这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中
有三个线程。但即使该进程在一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。
在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了“多线程模型”问题。
多对一模型:多个用户及线程映射到一一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一**个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。**多个线程不可在多核处理机上并行运行
一对一模型:一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行,并发度高
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对多模型: n用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一-模型中一个用户进程占用太多内核级线程,开销太大的缺点。
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪队列中按照一-定的算法选择一个进程并将处理机分配给它运行,以实现进程
的并发执行。
按一定的原则从外存上处于后备队列的作业中挑选-一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。
高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。
引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。这么做的目的是为了提高内存利用率和系统吞吐量。
暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。
挂起态可分为就绪挂起和阻塞挂起
区别
两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
七状态模型
不能进行进程调度与切换的情况
1.在处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。
2.进程在操作系统内核程序临界区中。
临界资源:一个时间段内只允许-一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区访问的临界资源如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换
普通临界区访问的临界资源不
会直接影响操作系统内核的管
理工作。因此在访问普通临界
区时可以进行调度与切换。
3.在原子操作过程中(原语)。原子操作不可中断,要一气呵成(如
之前讲过的修改PCB中进程状态标志,并把PCB放到相应队列)
“狭义的进程调度”与“进程切换”的区别:
狭义的进程调度
指的是从就绪队列中选中一个要运行的进程。(这 个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。
广义的进程调度
包含了选择一个进程和进程切换两个步骤。
进程切换的过程主要完成了:
1.对原来运行进程各种数据的保存
2.对新的进程各种数据的恢复
(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)
注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。
非剥夺调度方式(非抢占式)
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统
剥夺调度方式(抢占式)
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。可由操作系统剥夺当前进程的CPU使用权
可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统
指CPU“忙碌”的时间占总时间的比例。
单位时间内完成作业的数量
指从作业被提交给系统开始,到作业完成为止的这段时间间隔。
它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。
计算机的用户希望自己的作业尽可能少的等待处理机等待时间,指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。
指从用户提交请求到首次产生响应所用的时间。
先来先服务调度算法
按照到达的先后顺序调度,事实.上就是等待时间越久的越优先得到服务。
周转时间=完成时间-到达时间
带权周转时间=周转时间/运行时间
等待时间=周转时间-运行时间
注意:本例中的进程都是纯计算型的进程,一个进程到达后要么在等待,要么在运行。如果是又有计算、又有I/O操作的进程,其等待时间就是周转时间-运行时间-1/O操作的时间
抢占式的短作业优先算法又称“最短剩余时间优先算法(SRTN)
最短剩余时间优先算法
每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度
注意几个小细节:
1.如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的
2.很多书上都会说“SJF调度算法的平均等待时间、平均周转时间最少”严格来说,这个表述是错误的,不严谨的。之前的例子表明,最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少,应该加上一个条件“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少;或者说“在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少”;
如果不加,上述前提条件,则应该说“抢占式的短作业/进程优先调度算法(最短剩余时间优先,SRNT算
法)的平均等待时间、平均周转时间最少.
3.虽然严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如FCFS),
SJF依然可以获得较少的平均等待时间、平均周转时间
4.如果选择题中遇到“SIF 算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项.
FCFS算法是在每次调度的时候选择-一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至还会造成饥饿问题
高响应比优先算法
非抢占式的调度算法,只有当前运行的进程主动放弃CPU时( 正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选响应比最高的进程上处理机。
王道计算机考研 操作系统_哔哩哔哩_bilibili
时间片太大太小的影响
如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
非抢占式的优先级调度算法
每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度
抢占式的优先级调度算法
每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。另外,当就绪队列发生改变时也需要检查是否会发生抢占。
补充:
就绪队列未必只有一个,可以按照不同优先级来组织。另外,也可以把优先级高的进程排在更靠近队头的位置
根据优先级是否可以动态改变,可将优先级分为两种。
静态优先级:创建进程时确定,之后一直不变。
动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。
如何合理地设置各类进程的优先级?
通常:
系统进程优先级高于用户进程前台进程优先级高于后台进程操作系统更偏好I/O型进程( 或称/0繁忙型进程)
注:与I/O型进程相对的是计算型进程(或称CPU繁忙型进程)
I/O设备和CPU可以并行工作。如果优先让I/O繁忙型进程优先运行的话,则越有可能让I/O设备尽早地投入工作,则资源利用率、系统吞吐量都会得到提升
如果采用的是动态优先级,什么时候应该调整?
可以从追求公平、提升资源利用率等角度考虑。如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级如果某进程占用处理机运行了很长时间,则可适当降低其优先级.如果发现一个进程频繁地进行I/O操作,则可适当提升其优先级
设置多级就绪队列,各级队列优先级从高到低,时间片从小到大新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片。若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经在最下级的队列,则重新放回最下级.队列队尾
只有第k级队列为空时,才会为k+1级队头的进程分配时间片被抢占处理机的进程重新放回原队列队尾
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。
系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源
系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问
我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备( 比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后另一一个进程才能去访问临界资源。
进入区(检查是否可进入临界区,可进入需要上锁)、临界区(访问临界资源的代码)、退出区(解锁)、剩余区
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
临界区空闲时,可以允许-一个请求进入临界区的进程立即进入临界区;
当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿) ;
当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予
主要问题是:违背“空闲让进”原则。
算法思想:设置一个布尔型数组flag[], 数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0] = true”意味着0号进程PO现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。
主要问题:违反忙则等待原则
原因在于,进入区的“检查”和“上锁”两个处理不是一气呵成的。“检查” 后,“上锁”前可能发生进程切换。
算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查”
的方法,来避免上述问题。
若按照①⑤②…的顺序执行,PO 和P1将都无法进入临界区。因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。
两个进程都争着想进入临界区,但是是也不让谁,最后都无法进入
算法思想:双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。Gary L. Peterson想到了一种方法,如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”,主动让对方先使用临界区。
Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。
利用“开/关中断指令”实现
关中断:不允许当前进程被中断,也必然不会发生进程切换
临界区
开中断:直到当前进程访问完临界区,再执行开中断指令,才有可能有别的进程.上处理机并访问临界区
优点:简单、高效.
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
简称TS指令,也有地方称为TestAndSetLock指令,或TSL指令
TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。
若刚开始lock是false,则TSL返回的old值为false, while 循环条件不满足,直接跳过循环,进入临界区。若刚开始lock是true,则执行TLS后old返回的值为true, while 循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行“解锁"。
相比软件实现方法,TSL 指令把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作。
优点
实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点
不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”
有的地方也叫Exchange 指令,或简称XCHG指令。
Swap指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。
逻辑上来看Swap和TSL并无太大区别,都是先记录下此时临界区是否已经被上锁(记录在old变量上),再将上锁标记lock设置为true,最后检查old,如果old为false则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区。
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。
用户进程可以通过使用操作系统提供的–对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退
出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。
用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。与普通整数变量的区别:对信号量的操作只有三种,即初始化、P操作、V操作
存在的问题:不满足“让权等待”原则,会发生忙等
王道计算机考研 操作系统_哔哩哔哩_bilibili
整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。
在考研题目中wait(S)、signal(S) 也可以记为P(S)、V(S),这对原语可用于实现系统资源的“申请”和“释放”。S.value的初值表示系统中某种资源的数目。对信号量S的一次P操作意味着进程请求一个单位的该类资源,因此需要执行S.value–,表示资源数减1,当S.value<0时表示该类资源已分配完毕,因此进程应调用block原语进行自我阻塞(当前运行的进程从运行态阻塞态),主动放弃处理机,并插入该类资源的等待队列S.L中。可见,该机制遵循了“让权等待”原则,不会出现“忙等”现象。
对信号量S的一-次V操作意味着进程释放一个单位的该类资源,因此需要执行S.value++,表示资源数加1,
若加1后仍是S.value<=0,表示依然有进程在等待该类资源,因此应调用wakeup原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态–>就绪态)。
1.分析并发进程的关键活动,划定临界区
2.设置互斥信号量mutex,初值为1
3.在临界区之前执行P(mutex)
4.在临界区之后执行V(mutex)
注意:对不同的临界资源需要设置
不同的互斥信号量。
P、V操作必须成对出现。缺少
P(mutex)就不能保证临界资源的互
斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。
要让各并发进程按要求有序地推进
1.分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
2.设置同步信号量S, 初始为0
3.在“前操作”之后执行V(S)
4.在“后操作”之前执行P(S)
若先执行到V(S)操作,则S++后S=1。之后当执行到P(S)操作时,由于S=1,表示有可用资源,会执行S–, S的值变回0,P2进程不会执行block原语,而是继续往下执行代码4。
若先执行到P(S)操作,由于S=0, S-- 后S=-1,表示此时没有可用资源,因此P操作中会执行block原语,主动请求阻塞。之后当执行完代码2,继而执行V(S) 操作,S++, 使S变回0,由于此时有进程在该信号量对应的阻塞队列中,因此会在V操作中执行wakeup原语,唤醒P2进程。这样P2就可以继续执行代码4了
每一个前驱关系都是一个进程同步问题
1.要为每- -对前驱关系各设置一个同步变量
2.在“前操作”之后对相应的同步变量执行V操作
3.在“后操作”之前对相应的同步变量执行P操作
系统中有一组生产者进程和- -组消费者进程,生产者进程每次生产-一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注: 这里的“产品”理解为某种数据)
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待
缓冲区时临界资源,各进程必须互斥地访问
信号量机制可实现互斥、同步、对一类系统资源的申请和释放。
其中:
互斥–>设置初始值为1 的互斥信号量
同步–>设置初始值为0的同步信号量(实现一前一后)
对一类系统资源的申请和释放
–》设置一个信号量,初始值即为资源的数量(本质上也属于“同步问题”,若无空闲资源,则申请资源的进程需要等待别的进程释放资源后才能继续往下执行)
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步(在不同的两个程序)、互斥关系(在同一个程序之间)。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
3.设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。 (互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
3.设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。 (互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
假设一个系统有三个抽烟者进程和一一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一-支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它, 并给供应者进程一一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一-直重复(让三个抽烟者轮流地抽烟)
本质上这题也属于“生产者-消费者”问题,更详细的说应该是“可生产多种产品的单生产者—多消费者”。
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序
3.设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。( 互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
有读者和写者两组并发进程,共享-一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。
因此要求:
①允许多个读者可以同时对文件执行读操作;
②只允许-一个写者往文件中写信息;
③任一写者在完成写操作之前不允许其他读者或写者工作;
④写者执行写操作前,应让已有的读者和写者全部退出。
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序
3.设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。( 互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
两类进程:写进程、读进程
互斥关系:写进程- -写进程、写进程一读进程。读进程与读进程不存在互斥问题。
写者进程和任何进程都互斥,设置一个互斥信号量rw,在写者访问共享文件前后分别执行P、V操作。
读者进程和写者进程也要互斥,因此读者访问共享文件前后也要对rw执行P、V操作。
如果所有读者进程在访问共享文件之前都执行P(rw)操作,那么会导致各个读进程之间也无法同时
访问文件。Key:读者写者问题的核心思想一–怎公处理该问题呢?
P(rw)和V(rw)其实就是对共享文件的“加锁"和“解锁”。既然各个读进程需要同时访问,而读进
程与写进程又必须互斥访问,那么我们可以让第- 一个访问文件的读进程“加锁”,让最后-一个访问
完文件的读进程“解锁”。可以设置一一个整数变量count来记录当前有几个读进程在访问文件。
读者-写者问题为我们解决复杂的互斥问题提供了一个参考思路。其核心思想在于设置了一个计数器count用来记录当前正在访问共享文件的读进程数。我们可以用count的值来判断当前进入的进程是否是第-一个/最后一个读进程,从而做出不同的处理。另外,对count变量的检查和赋值不能一气呵成导致了- -些错误,如果需要实现“一气呵成”,自然应该想到用互斥信号量。
最后,还要认真体会我们是如何解决“写进程饥饿”问题的。
绝大多数的考研PV操作大题都可以用之前介绍的几种生产者消费者问题的思想来解决,如果遇到更复杂的问题,可以想想能否用读者写者问题的这几个思想来解决。
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一-碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根- -根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。
①可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有一个
哲学家是可以拿到左右两只筷子的
②要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子;而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子, 另一个会直接阻塞。这就避免了占有一支后再等待另一只的情况。
更准确的说法应该是只哲学家拿筷子这件事必须互斥的执行。这就保证了即使一个哲学家在拿筷子拿到一半时被阻塞,也不会有别的哲学家会继续尝试拿筷子。这样的话,当前正在吃饭的哲学家放下筷子后,被阻塞的哲学家就可以获得等待的筷子了。
分为 1、联机命令接口也叫做交互式命令接口 2、脱机命令接口也叫做批处理命令接口 ↩︎
CMDS:互补金属氧化物半导体(64B-128B) ,用来存储时钟和硬件配置信息 ↩︎