操作系统基础知识


什么是中断?中断的分类?

中断的定义:

中断是指某些事件发生时,cpu暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后,
再继续执行之前的程序。整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。

中断的类型:

* 按照中断的触发方式分成同步中断和异步中断;
  - 中断由CPU指令直接触发,这种主动触发的中断,叫做同步中断,比如系统调用、发生错误、出现异常。
  - 中断并不是由CPU直接触发,是因为需要响应外部的通知,比如响应键盘、鼠标等设备而触发的中断,
这种中断我们称为异步中断。
* 根据中断是否强制触发可分为屏蔽中断和不可屏蔽中断;
  - 可以屏蔽的中断我们称为可屏蔽中断,多数中断都是可屏蔽中断。

中断和异常的区别?

相同点是:

  • 最后都是由CPU发送给内核,由内核去处理;
  • 处理程序的流程设计是相似的。

不同点是:

  • 产生源不相同,异常是由CPU产生的,而中断是由硬件设备产生的;
  • 内核需要根据异常还是中断调用不同的处理程序;
  • 中断不是时钟同步的,这意味着中断可能随时到来,异常是由CPU产生的,所以是时钟同步的;
  • 当处理中断时,处于中断上下文中;处理异常时,处于进程上下文中。

什么是用户态和内核态?用户态和内核态的切换?

  • 很多操作系统,将内存分成了两个区域:内核空间和用户空间,内核空间只有内核程序可以访问,用户空间专门给应用程序使用。
  • 用户空间中的代码被限制了只能使用一个局部的内存空间,我们说这些程序在用户态执行,处于用户态执行时,进程所占有的处理器是可被抢占的
  • 内核空间中的代码可以访问所有内存,我们称这些程序在内核态执行,处于内核态执行时,进程所占有的处理器是不允许被抢占的

当用户程序需要做一些内核态的事情,例如从硬盘读取数据或者从键盘获取输入时,需要让操作系统切换到内核态来执行这些操作。
用户态切换到内核态的3种方式

  • 系统调用,用户态进程主动要求切换到内核态;
  • 异常,用户态程序发生了异常,会切换到处理此异常的内核态程序中;
  • 外围设备的中断,当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时候CPU会暂停执行当前程序转而去执行与中断信号对应的中断处理程序,如果此时执行的是用户态程序的指令,那么这个转换过程就发生了由用户态到内核态的切换。

进程的状态?

  • 创建状态:创建进程是一个非常复杂的过程,一般需要通过多个步骤才能完成:比如首先申请一个空白的进程控制块,冰箱PCB中填写用于控制和管理进程的信息;然后为进程分配运行时所需的资源;最后把该进程插入到就绪队列中。
  • 就绪状态:此时进程已经进入准备好运行的状态,只要获得CPU就可立即执行。
  • 运行状态:进程已经获取CPU,处在执行的状态。
  • 阻塞状态:正在执行的进程由于发生某事件比如I/O请求等,暂时无法继续执行的状态,即进程执行受到阻塞,此时操作系统会把CPU分配给另外一个就绪的进程。
  • 终止状态:进程执行完正常结束或者其他原因中断退出执行。

进程间通信?

进程间通信(Inter Process Communication,IPC):每个进程各自有不同的用户地址空间,任何一个进程变量在另一个进程中是不可见的,所以进程之间要通过内核交换数据,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

  • 管道/匿名管道:半双工,数据只能向一个方向流动,双方需要通信,则需要建立起两个管道。
管道只能用于具有亲缘关系(父子或兄弟)的进程;
单独构成一种独立的文件系统,不属于文件系统,只存在于内存中;
往管道缓冲区末尾写数据,从缓冲区头部读数据。
  • 有名管道:管道只能用于亲缘关系的进程间通信,为了克服这个缺点,提出了有名管道,有名管道不同于匿名管道的是它提供了一个路径名与之关联,以有名管道的文件形式存在于文件系统中,只要访问该路径,就能够彼此通过有名管道相互通信,因此通过有名管道不相关的进程也能交换数据。

  • 消息队列:管道的通信方式效率低下,不适合进程间频繁的交换数据,这时候消息队列的通信方式可以解决,A进程往消息队列写入数据后就可以正常返回,B进程再去读就可以了,效率比价高;而且数据会被分为一个个数据单元,消息接收和发送方可以约定消息的数据类型,然后可以边发送边接收,而不需要等待完整的数据;但是消息具有长度限制,并且消息队列通信过程中存在用户态和内核态之间的数据拷贝问题。

  • 共享内存:共享内存解决了消息队列存在的内核态和用户态之间数据拷贝问题。共享内存的机制是,不同的进程拿出一块虚拟内存空间,映射到相同的物理内存空间,这样一个进程写入的东西,另一个进程可以马上看到,不需要进行拷贝。

  • 信号量:当使用共享内存的通信方式时,如果多个进程同时往共享内存写入数据,有可能先写的数据被其他进程覆盖了,因此需要一种保护机制,信号量本质上是一个整型的计数器,用于实现进程间的同步和互斥。

  • 信号:信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发送给某一进程,而无需知道该进程的状态,例如对运行在shell终端的进程发送SIGINT信号,表示终止进程,使用kill PID产生SIGKILL信号,表示立即结束进程。

  • 套接字:前面提到的通信方式都是在同一台主机上进行,如果想要跨网络和不同主机上的进程进行通信,则需要用到socket。

进程和线程的区别?

  • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有资源,但可以访问隶属于进程的资源。
    进程所维护的是程序所包含的资源(静态资源,比如地址空间、文件系统状态等),线程所维护的是运行相关的资源(动态资源,比如运行栈、调度相关的控制信息等)
  • 调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,但是从一个进程的线程切换到另一个进程的线程时,会引起进程切换。
  • 系统开销:在创建或者撤销进程时,系统都要为其分配或回收资源,比如内存空间、I/O设备等,所付出的开销远大于创建或撤销线程时的开销。进程切换时,涉及到当前执行CPU环境的保存及新调度进程CPU环境的设置,而线程切换只需要保存和设置少量寄存器内容,开销很小。

进程调度算法?

  • 先来先服务调度算法:属于非剥夺式方式,按照进程进入就绪队列的先后次序进行选择,一旦进程得到处理机,它就一直运行下去,直到该进程完成或者因为某些事件而不能继续运行,才会让出处理机,该算法有利于大进程,不利于小进程,因为小进程可能需要等待很长时间才能运行。
  • 短进程优先调度算法:短进程优先调度算法从进程的就绪队列中挑选那些运行时间最短的进程进入主存运行,也是非剥夺式算法。一方面来说,这样能够减少在就绪队列中等待的进程数,提高了系统的吞吐量,但另一方面,大的进程可能没有机会运行,导致饿死。
  • 最短剩余时间优先调度算法:最短作业优先的抢占式版本,让“运行到任务完成所需时间最短”的进程优先得到处理,允许一个新的进程且运行时间短于当前进程的剩余时间进行抢占。
  • 时间片轮转调度算法:将所有进程按照先来先服务的原则排成一个队列,每次调度时,把CPU时间分配给队首进程,该进程执行一个时间片,当时间片用完时,即使进程还未完成,也必须让出处理机给下一个就绪进程,被剥夺的进程就返回就绪进程队列的末尾重新排队,等候再次运行(该算法的效率与时间片的大小有很大关系)。
  • 优先级调度算法:按照进程的优先级高低来进行调度,使得高优先级进程优先得到处理机,为了防止低优先级的进程永远等不到调度,可以随着时间推移增加等待进程的优先级。
  • 多级反馈队列调度算法:系统中有多个进程就绪队列,每个就绪队列对应一个调度级别,第一个队列的优先级最高,各级队列的优先级逐次降低,并且每个队列的时间片大小都不同,第一个队列的时间片最小,各级队列的时间片逐次增大,调度时,选择高优先级队首的进程进入主存运行,如果时间片内进程完成,则离开队列,若时间片用完后任务未完成,则该进程被剥夺处理机,同时放入下一级队列的末尾,只有当上一级的队列为空后,才去调度下一级队列。

什么是死锁?死锁产生的必要条件?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,
若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在互相
等待的进程称为死锁进程。

发生死锁的四个必要条件

  • 互斥条件:一个资源每次只能被一个进程使用,即在一段时间内仅为一个进程所占有,此时若有其他进程请求该资源,则请求进程只能等待。
  • 请求与保持条件:进程已经保持了至少一个资源,但又提出了一个新的资源请求时,该资源已经被其他进程占有,此时请求进程被阻塞,但对自己已经获得资源保持不变。
  • 不可剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。
  • 循环等待条件:若干个进程间形成首位相接循环等待资源的关系。

如何处理死锁?

  • 鸵鸟策略:因为解决死锁问题的代价很高,因此针对死锁时不采取任何措施。
  • 死锁检测与恢复:不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。
  • 死锁预防:破坏死锁产生的四个必要条件(哲学家进餐问题)。
  • 死锁避免:当用户申请资源时,系统必须确定这些资源的分配是否处于安全状态,如果安全,则分配,如果不安全,则不予分配(银行家算法)。

虚拟内存?

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

为了更好的管理内存,操作系统将内存抽象成地址空间,每个程序拥有自己的地址空间,这个地址空间被分割称多个块,每一块称为一页,这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。

当程序引用的页不在物理内存中时,由硬件执行必要的映射,将缺失的页装入到物理内存中,并重新执行指令。

内存管理有哪几种方式?

  • 块式管理:将内存分为几个固定大小的块,每个块中只包含一个进程,如果程序运行需要内存的话,操作系统就给它分配一块,如果程序运行只需要很小的空间的话,块中很大一部分内存几乎都会被浪费,每个块中未被利用的空间,我们称之为碎片。
  • 页式管理:把主存分为大小相等且固定的一页一页的形式,页相对较小,提高了内存利用率,减少了碎片,页式管理通过页表对应逻辑地址和物理地址。
  • 段式管理:页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何意义,段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多,段式管理通过段表对应逻辑地址和物理地址。
  • 段页式管理:段页式管理机制结合了段式管理和页式管理的优点,先把主存分成若干段,每个段又分成若干页。

缺页中断?

如果需要执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序。

页面置换算法?

当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存中选择一个页面将其移除内存,以便为即将调入的页面让出空间。
用来选择淘汰哪一页的规则叫做页面置换算法

  • 最佳页面置换算法(OPT):该页面置换算法所选择的被淘汰页面是以后永不使用的,或者是在很长时间内不再被访问的页面,这样可以保证获得最低的缺页率,但由于人们目前无法预知内存中的页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,一般作为衡量其他置换算法的方法。
  • 先进先出页面置换算法(FIFO):总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。
  • 最近最久未使用页面置换算法(Least Receantly Used, LRU):LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间T,当需要淘汰一个页面是,选择现有页面中T值最大的,即最近醉酒未使用的页面予以淘汰。
  • 最少使用页面置换算法(Least Frequently Used,LFU):该置换算法选择在之前时期使用最少的页面作为淘汰页。

磁盘调度算法?

读写一个磁盘块的时间影响因素有:旋转时间、寻道时间、实际的数据传输时间,其中寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。

  • 先来先服务:按照磁盘请求的顺序进行调度,优点是公平和简单,缺点是未对寻道做任何优化,使得平均寻道时间可能较长。
  • 最短寻道时间优先:优先调度与当前磁头所在磁道距离最近的磁道,虽然平均寻道时间比较低,但是不够公平,距离所在磁道较远的请求可能会出现饥饿现象。
  • 电梯算法:按照一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向,因此所有的磁盘请求都会被满足,解决了最短寻道时间优先的饥饿问题。

参考
https://www.nowcoder.com/discuss/824423?type=all&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_all_nctrack&gio_id=B1EEF4DC16824D1AC08ACC0B88EA04EE-1658970232959

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值