操作系统易混淆知识点备注(更新中~)

目录

一.操作系统概述

1.访管指令

2.在用户态发生,在用户态下执行

3.中断和子程序调用

4.外核

二.进程与线程

5.内核级线程和用户级线程

6.多线程和多任务的区别

7.系统中进程的状态

8.挂起和阻塞的区别

9.分时系统和实时系统

10.共享资源,临界资源,临界区

11.关中断和原子操作

12.死锁与饥饿

13.死锁与循环等待

14.死锁预防,死锁避免和死锁检测与解除的注意点

15.颠簸与回退

16.信号量与条件变量

17.四个条件

18.从另一个角度看信号量和条件变量

19.“不可剥夺”与"请求与保持"

20.“忙等”与“忙则等待”


一.操作系统概述

1.访管指令

用户程序通过执行特定的访管指令(trap或者系统调用指令)请求操作系统内核的服务或功能。这些指令是需要硬件支持的。

在计算机组成原理中,我们学到过trap指令是程序性异常(软件中断)。

可能会有疑问,trap指令需要硬件支持,为何不是硬件中断:

软件中断是由用户程序发起的,通过执行特殊的指令来请求操作系统服务或处理异常情况。因此,虽然这些中断确实依赖于硬件来执行切换和处理,但它们的触发和控制权始终在程序的手中。

硬件中断是由设备硬件触发的(例如,控制器出错,存储器出错),通常处理器通过预设的中断控制器来接收和响应。这种中断是异步的,与当前程序的执行无关。

补充:访管指令时在用户态下使用,将用户态转为核心态,所以访管指令不是特权指令。

2.在用户态发生,在用户态下执行

系统调用是操作系统提供给用户程序的接口,系统调用发生在用户态,被调用程序在核心态下执行。

3.中断和子程序调用

中断处理和子程序调用都需要压栈,以便保护现场,中断处理一定会保存而子程序调用不需要保存的内容:PSW寄存器的内容。

子程序调用不改变程序的状态,因为子程序调用是编译器可控流程,而中断不是。以程序if(a==b)为例,它通常包含一条测试指令,以及一条根据标志位决定是否需要跳转来调用子程序的指令。编译器不在这两条指令中间插入任何子程序调用代码,因此标志位不变,但中断却时可能发生,导致标志位改变。

具体地说,执行if(a==b)时,会进行a-b操作,并生成相应的标志位,进而根据标志位来判断是否跳转到相应子程序。

假设刚好在生成相应的标志位后发生了中断,若不保存PSW的内容,则后续根据标志位来进行跳转的流程就可能发生错误(标志位可能被修改)。相反,若在生成标志位后,进行了子程序调用则说明已经根据a-b的标志位进行了跳转,此时PSW的内容已无意义而无须保存。综上所述,中断处理和子程序调用都有可能使PSW的内容发生变化,但中断处理程序执行完返回后,可能需要用到 PSW 原来的内容,子程序执行完返回后,一定不需要用到 PSW 原来的内容。

4.外核

p30

在操作系统结构一章中,外核是运行在内核态的程序。它的任务是位虚拟机分配资源,并检查这些资源使用的安全性,以确保没有机器会使用他人的资源。

二.进程与线程

5.内核级线程和用户级线程

用户级线程对操作系统是透明的,CPU调度的对象仍然是进程,同一进程中的线程切换是由应用程序自己控制的,跨进程的线程切换才需要内核支持;内核级线程的调度是以线程为单位的,同一进程中的线程切换,也需要从用户态转到核心态进行,系统开销较大。

所以,若采用时间片轮转调度,进程中设置内核级线程和用户级线程的效果完全不同:

用户级线程的调度仍以进程为单位,各个进程轮流执行一个时间片,假设进程A包含1个用户级线程,而进程B包含100个用户级线程,此时进程A中单个线程的运行时间将是进程B中各个线程平均运行时间的100倍;内核级线程的调度是以线程为单位的,各个线程轮流执行一个时间片,同样假设进程A包含1个内核级线程,而进程B含100个内核级线程,此时进程B的运行时间将是进程A的100倍。

② 用户级线程是由用户程序或函数库实现的,不依赖操作系统的支持。所以用户级线程可以在不支持内核级线程的操作系统上实现,但是若想实现跨进程的调度,则需要内核支持。

用户级线程是在用户空间实现的,不能直接利用系统调用获得内核的服务,当用户级线程想要获得内核服务时,只能借助操作系统的帮助,而内核级线程可以在内核态执行系统调用子程序,直接利用系统调用为它服务。

内核级线程可以同时调度同一进程的多个线程在多CPU上并行运行,而对于用户级线程,操作系统对其并不直接感知和调度。因此,即使是在多CPU系统上,如果一个进程中有多个用户级线程,操作系统仍然会将整个进程视为一个单元(即操作系统感应不到用户级线程的存在)。即操作系统只会将该进程中的一个用户级线程调度到一个CPU核心上执行。若用户级线程被阻塞,那么整个进程就被阻塞。

所以,系统调用,I/O请求,异常处理等涉及内核态的事情不会导致用户级线程切换,但会导致内核级线程的切换。

6.多线程和多任务的区别

多任务是针对操作系统而言的,代表操作系统可以同时执行的程序个数;多线程是针对一个程序而言的,代表一个程序可以同时执行的线程个数,而每个线程可以完成不同的任务。

7.系统中进程的状态

① 若系统中没有运行进程,也没有就绪进程,那么系统中的所有进程可能都处于等待态,可能处于死锁状态,也有可能因为等待的事件未发生而进入循环等待态。

② 采用优先级进程调度,运行进程是否一定是系统中优先级最高的进程?

不一定。因为高优先级的进程有可能正处在等待队列(阻塞队列)中,进程调度会从就绪队列中选择一个进程占用 CPU,这个被选中的进程可能优先级较低。

8.挂起和阻塞的区别

在进程的状态中,有“挂起态”和“阻塞态”:

两种状态都是暂时不能获得CPU的服务。但是① 挂起态是将进程映像调到外存中,而阻塞态进程映像还在内存中。② "挂起"是一种主动行为,由操作系统或者其他管理机制决定将进程暂停,挂起的进程可以随时恢复执行。“阻塞”是一种被动行为,由进程自身因为等待某些条件满足而暂时停止执行,在条件满足或者超时后,进程会自动或者被通知继续执行。

9.分时系统和实时系统

分时系统是指在一个系统中多个用户分时地使用同一台计算机; 实时系统是指计算机及时响应外部事件地请求并在规定时限内完成对该事件地处理,控制所有实时外设和实时任务协调一致地运行。

实时系统和分时系统的主要区别有两点:(1)分时系统的目标是提供一种通用性很强的系统,有较强的交互能力;而实时系统则大都是具有特殊用途的专用系统,交互能力略差。(2)分时系统对响应时间虽有要求,但一般来说,响应时间由人所能承受的等待时间来确定;而实时系统对响应时间要求很高,一般由控制系统或信息处理磁头所能接受的延迟时间来决定。

分时系统通常采用“时间片轮转调度算法”,“高响应比优先算法”,“多级反馈队列调度算法”,这些算法都能保证每个任务在一定时间内分配到时间片,并轮流占用CPU。

实时系统通常采用“抢占式的优先级高者优先”算法。

10.共享资源,临界资源,临界区

临界资源:将一次只允许一个进程使用的资源成为临界资源,临界资源又名 独占资源。

临界区:进程中访问临界资源的那段代码,称为临界区,又名 临界段。

临界资源与共享资源的区别在于,在一段时间内能否允许被多个进程访问(并发使用),例如,磁盘属于共享设备。公用队列属于临界资源,公用队列可供多个进程使用,但一次只可供一个进程使用,试想若多个进程同时使用公用队列,势必造成队列中的数据混乱而无法使用。

11.关中断和原子操作

关中断和原子操作都能保证进程的互斥访问。两者都是由硬件实现的。两者的主要区别在于,关中断不适用于多处理器系统,而原子操作适用于多处理器系统。

关中断由硬件实现,具体来讲是中断隐指令,可以对应"王道计算机组成原理p307"。它实现的原理:通过屏蔽中断,保证当前运行的进程让临界区代码顺利执行完。

关中断不适用于多处理器系统,因为在一个CPU上关中断并不能防止进程在其他CPU上执行相同的临界区代码。

原子操作也由硬件机制实现,例如保证进程互斥访问的硬件指令方法之一---TS指令就是通过硬件方式将"加锁"(关闭临界资源)和"检查"操作变成原子操作。由于"锁"是共享的,所以这种方式适用于多处理器系统。

原语就是指:完成某种功能且不被分割,不被中断执行的操作序列,通常由硬件实现。在多处理器系统中可以通过原子操作实现,例如“TS指令以及Swap指令”。而单处理系统中可有“关中断”或由软件通过屏蔽中断方式实现。

原语之所以不能被中断执行,是因为原语对变量的操作若被打断,则可能会去运行另一个对同一个变量的操作过程,从而出现临界段问题。


12.死锁与饥饿

死锁:一组进程处于死锁状态是指组内的每个进程都在等待一个事件,而该事件只可能由组内的另一个进程产生。

系统死锁的可能原因主要是时间上和空间上的。时间上由于进程运行中推进顺序不当,即调度时机不合适,不该切换进程时进行了切换,可能会造成死锁;空间上的原因是对独占资源分配不当,互斥资源部分分配又不可剥夺,极易造成死锁。

注:对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争不会引起死锁(例如CPU和主存)。

饥饿:

产生饥饿的主要原因是:当系统中有多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序,有的分配策略可能是不公平的,即不能保证等待时间上界的存在。在这种情况下,即使系统未发生死锁,某些进程也可能长时间等待。当等待时间给进程的推进带来明显影响时,称发生了饥饿。

例如,当有多个进程需要打印文件时,若系统分配打印机的策略是最短文件优先,则长文件的打印任务将困短文件的源源不断到来而被无限期推迟,最终导致饥饿,甚至“饿死”。饥饿并不表示系统一是死锁,使至少有一个进程的执行被无限期推迟。

死锁和饥饿的共同点都是进程无法顺利向前推进的现象。死锁和饥饿的主要差别:

发生饥饿的进程可以只有一个;而死锁是因循环等待对方手里的资源而导致的,因此,如果有死锁现象,那么发生死锁的进程必然大于或等于两个。

②发生饥饿的进程可能处于就绪态(长期得不到CPU,如SJF 算法(短作业优先)的问题),也可能处于阻塞态(如长期得不到所需的 I/O 设备,如上述举例);而发生死锁的进程必定处于阻塞态

13.死锁与循环等待

"循环等待"为产生死锁的四个必要条件之一,其他三个是“互斥条件”,“请求与保持”,“不可剥夺”。

循环等待:存在一个进程资源的循环等待链,链中每个进程以获得的资源同时被下一个进程所请求。循环等待的定义和死锁类似,但是死锁定义的等待环条件更加严格:

死锁中,Pi等待的资源必须由Pi+1来满足,但是循环等待条件无此限制,如下图所示,K不属于集合{0,1,…,n}。Pn等待一台输出设备,它可从P0或Pk获得。因此,虽然Pn,P0和其他一些进程形成了等待环,但Pk不在圈内,若Pk释放了输出设备,则可打破循环等待。

所以循环等待是死锁的必要条件,满足循环等待条件不一定发生死锁。

从这里可以总结:

资源分配图含圈而系统又不一定有死锁的原因是,同类资源数大于1。但若系统中每类资源.都只有一个资源,则资源分配图含圈就变成了系统出现死锁的充分必要条件。

产生死锁需要同时满足四个必要条件,只要其中任意一个条件不成立,那么死锁就不会发生,这也是"死锁预防"的原理。

注:信号量机制中的PV操作能够保证资源的互斥访问,但是不能破坏死锁条件,反而可能加强互斥和占有并等待条件,即信号量机制不能避免死锁

14.死锁预防,死锁避免和死锁检测与解除的注意点

死锁预防:可以确保系统不发生死锁,死锁预防是通过破坏产生死锁的4个必要条件中的一个或几个来防止死锁的。

死锁避免:也可以保证系统不发生死锁,银行家算法是最著名的死锁避免算法。

银行家算法的主要思想是避免系统进入不安全状态。在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求,若有则先进行试分配,并对分配后的新状态进行安全性检查。若新状态安全,则正式分配上述资源,否则拒绝分配上述资源。这样,它保证系统始终处于安全状态,从而避免了死锁现象的发生。

安全状态,是指系统能按某种进程推进顺序(P1,P2…Pn)为每个进程Pi分配其所需的资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成。此时称P1,P2…Pn为安全序列(可能有多个)。若系统无法找到一个安全序列,则称系统处于不安全状态。

被定义为处于不安全状态的系统,不一定发生了死锁。而发生死锁的系统一定处于不安全状态。

所以避免进入死锁,并不能检测出是否发生死锁。

银行家算法虽然会通过检测是否存在安全序列来判断申请资源的请求是否合法,但安全序列并不是唯一的,也不是固定的,它只是一种可能的分配方案,而不是一种必须遵循的规则,银行家算法更没有给出固定的申请资源的顺序。

死锁的检测和解除:系统为进程分配资源时不采任何措施,但提供死锁检测和解除手段,一旦检测到系统发生死锁,则立即采取相应措施解除死锁。

:死锁的解除的手段并非都是剥夺(p156):

资源剥夺法和撤销进程法都是强制剥夺死锁进程占有的资源。但是进程回退法并非剥夺,而是回退时自愿释放资源。

注:从死锁预防,死锁避免到死锁检测,对死锁的处理从严到宽,同时系统并发性从小到大,并发性就是允许更多进程无等待地向前推进。

15.颠簸与回退

颠簸也就是抖动,这是请求分页系统中页面调度不当而导致的现象,

回退是指从此时此刻的状态退回到一分钟之前的状态,假如一分钟之前拥有资源X,它有可能释放了资源X,那就不称回到一分钟之前的状态,也就不是回退。

16.信号量与条件变量

条件变量是管程中出现的概念(王道p110)。

当一个进程进入管程后被阻塞,直到阻塞的原因解除时,在此期间,如果该进程不释放管程,那么其他进程无法进入管程。为此,将阻塞原因定义为条件变量condition。通常,一个进程被阻塞的原因可以有多个,因此在管程中设置了多个条件变量。每个条件变量保存了一个等待队列,用于记录因该条件变量而阻塞的所有进程,对条件变量只能进行两种操作,即wait和signal。

条件变量和信号量的比较:
相似点:条件变量的 wait/signal 操作类似于信号量的 P/V 操作,可以实现进程的阻塞,唤醒。

不同点条件变量是“没有值”的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反映了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。信号量机制中的V操作一定会改变信号量的值S=S+1。而管程中的signal操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则 signal不会产生任何影响。

17.四个条件

进程建立同步,实现临界区互斥需要遵循的四个原则:“空闲让进”,“有限等待”,“忙则等待”和“让权等待”。(p95)

进程死锁的必要条件:“互斥条件”,“不可剥夺条件”,“请求与保持”,“循环等待”(p149)

18.从另一个角度看信号量和条件变量

信号量分为整型信号量和记录型信号量。实现互斥的互斥信号量,初值为1,表示可用资源数为“1”,实现同步的同步信号量的初值为"0"。

整型信号量不遵循"让权等待",而记录型信号量遵循"让权等待"。条件变量同样遵循"让权等待"。即,进程不能进入临界区,应该立即释放处理器。

记录型信号量:若进程请求的某个资源没有了,或者说已经分配完了,那么该进程调用block原语进行自我阻塞(运行-->阻塞),主动放弃CPU,并插入该类资源的等待队列中。

条件变量:当x对应的条件不满足时,则会调用x.wait,将自己插入x条件的等待队列,并释放管程。这样其他进程可以使用改管程。

这里总结一下不满足"让权等待"的例子(对应知识点p96):

在方法中如果存在while循环,那么就不满足"让权等待",即等待进入临界区的进程不断执行while循环。

事件临界区互斥的软件实现方式:Peterson算法

硬件实现方法中的硬件指令方法:TS指令和Swap指令。

互斥锁(连续循环调用acquire(),获得锁)

19.“不可剥夺”与"请求与保持"

不可剥夺条件:强调的是进程所获得的资源在未使用完之前,不能被其他进程强行夺走,只能由获得该资源的进程自己释放。

请求与保持条件:强调的是进程已经至少保持了一个资源,又提出了新的资源请求,而该资源已经被其他进程占有。

20.“忙等”与“忙则等待”

"忙则等待"是进程建立同步机制的过程中,需要遵循的原则之一,另外三个是“空闲让进”,“有限等待”和“让权等待”。

忙则等待表示,若已有进程进入临界区,其他进程试图进入临界区就必须等待;而“忙等”是违背“让权等待”所产生的结果:

如果进程不能进入临界区,应该立即释放处理器,这样才遵循“让权等待”。否则会出现进程忙等待,就是进程不断申请进入临界区,也就是一直处于运行态,直到时间片用完,才变为就绪态,唤醒另一个处于就绪态的进程拥有处理器。

注:让权等待原则上必须遵循,但非必须。考试考过

21.进程与程序的区别

1.进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块(PCB)三部分组成的。而程序是一组有序的指令集合,是一种静态的概念。

2.进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命周期(并发进程可能因等待资源或因被抢占CPU而暂停运行,生命周期是不连续的),是暂时存在的;而程序则是一组代码的集合,是永久存在的,可长期保存。

3.一个进程可以执行一个或几个程序,一个程序也可构成多个进程。进程可创建进程,而
程序不可能形成新的程序。
4.进程与程序的组成不同。进程的组成包括程序、数据和 PCB。


如需要”408电子书”的小伙伴,可以私聊我,免费分享给大家!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值