OS面试总结

  • 内核态和用户态:
    • CPU指令级分为 分为 0-3 级,具体为 ring0、ring1、ring2、ring3,最高级为ring0,最低级为ring3像windows系统linux系统只用到ring0和ring3
    • 用户态和内核态,
      • 当一个任务执行系统调用而陷入内核代码中执行时,此时处理器处于特权级最高的(ring0级)内核中执行,
      • 我们称进程处于内核态。当进程执行用户自己的代码时,此时处理器处于特权级最低的(ring3级)用户代码中执行,我们成进程处于用户态。
      • 一般情况是,系统调用运行在内核态,函数运行在用户态。
  • 进程与线程:
    • 1、概念
      • 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
      • 线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
    • 2、共享空间(开销)来说
      • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
      • 线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
    • 3、通信
      • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据
      • 进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
    • 4、可靠性
      • 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,
      • 一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
  • 进程间通信的方法:
    • 1.管道:速度慢,容量有限,只有父子进程能通讯
    • 2.FIFO:任何进程间都能通讯,但速度慢
    • 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
    • 4.信号量(主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段)+共享内存(它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等;)
    • 5.Socket套接字编程
  • 进程有哪几种状态?(5态:加入新建态和终止态)
    • 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源;
    • 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数;
    • 阻塞状态: 进程等待某种条件,在条件满足之前无法执行;
  • 进程调度算法。
    • CPU调度:即按一定的调度算法从就绪队列中选择一个进程,把CPU的使用权交给被选中的进程。
    • CPU调度时机(运行态,就绪态,阻塞(等待)态):发生在内核对中断/异常/系统调用处理后返回到用户态时,具体来说有以下情况:
      • 进程正常终止 或 由于某种错误而终止;
      • 新进程创建 或 一个等待进程变成就绪;
      • 当一个进程从运行态进入阻塞态;
      • 当一个进程从运行态变为就绪态。
    • 先来先服务算法(FCFS——First Come First Serve):按照进程就绪的先后顺序使用CPU。特点:非抢占,公平,实现简单,长进程后面的短进程需要等很长时间,不利于用户体验。
    • 最短作业优先(SJF——Shortest Job First):具有最短完成时间的进程优先执行,非抢占。 
    • 最短剩余时间优先(SRTN——Shortest Remaining Time Next):SJF抢占式版本,即当一个新就绪的进程比当前运行进程具有更短完成时间时,系统抢占当前进程,选择新就绪的进程执行;特点:有最短的平均周转时间,但不公平,源源不断的短任务到来,可能使长的任务长时间得不到运行,从而产生 “饥饿”现象 (starvation)。
    • 时间片轮转调度算法(Round Robin——RR): 每个进程被分配一个时间片,允许该进程在该时间段运行,如果在时间片结束时该进程还在运行,则剥夺CPU并分配给另一个进程,如果该进程在时间片结前阻塞或结束,则CPU立即进行切换。特点:公平;有利于交互式计算,响应时间快;由于进程切换,时间片轮转算法要花费较高的开销;对进程表中不同进程的大小差异较大的有利,而对进程都是相同大小的不利。
    • 优先级调度算法(Priority Scheduling Algorithm——PSA)即给每个作业一个优先级,优先级越高越紧迫,应该先执行。通常:系统进程优先级高于用户进程;前台进程优先级高于后台进程;操作系统更偏好 I/O型进程。特点:实现简单,但不公平,可能导致优先级低的进程产生饥饿现象;可能产生优先级反转问题(基于优先级的抢占式算法),即一个低优先级进程持有一个高优先级进程所需要的资源,使得高优先级进程等待低优先级进程运行。
  • 进程线程,fork和vfork ,fork时内存空间发生了哪些变化
    • fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中。刚调用完fork()之后,子进程只是拥有一份和父进程相同的页,而指向数据段,堆段,栈段的会在我们将要改变父子进程各自的这部分内容时,才会将要操作的部分进行部分复制
    • vfork是 创建一个子进程,并和父进程的内存数据share一起用。
  • 操作系统I/O模型了解吗?epoll模型了解吗?
    • 1.阻塞I/O模型
      • 老李去火车站买票,排队三天买到一张退票。耗费:在车站吃喝拉撒睡 3天,其他事一件没干。
    • 2.非阻塞I/O模型
      • 老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。
    • 3.I/O复用模型
      • 1.select/poll
        • 老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次
      • 2.epoll
        • 老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话
      • 4.信号驱动I/O模型
        • 老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话
      • 5.异步I/O模型
        • 老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话
  • 什么是死锁?死锁产生的条件?
    • 1). 死锁的概念
      • 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。
    • 2). 死锁产生的四个必要条件
      • 互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
      • 占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;
      • 非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
      • 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系
      • 3). 死锁的处理基本策略和常用方法
        • (1). 死锁预防
          • 打破互斥条件:允许进程同时访问某些资源。但是,有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此,这种办法通常并无实用价值。
          • 打破占有并等待条件:可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行;只有当系统能满足当前进程所需的全部资源时,才一次性将所申请资源全部分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。
          • 打破非抢占条件:允许进程强行从占有者哪里夺取某些资源。也就是说,但一个进程占有了一部分资源,在其申请新的资源且得不到满足时,它必须释放所有占有的资源以便让其它线程使用。这种预防死锁的方式实现起来困难,会降低系统性能。
          • 打破循环等待条件:实行资源有序分配策略。对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源,这样就不回产生环路,预防死锁的发生。
        • (2). 死锁避免的基本思想
          • 死锁避免的基本思想是动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态。所谓安全状态是指:如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态。资源分配图算法和银行家算法是两种经典的死锁避免的算法,其可以确保系统始终处于安全状态。其中,资源分配图算法应用场景为每种资源类型只有一个实例(申请边,分配边,需求边,不形成环才允许分配),而银行家算法应用于每种资源类型可以有多个实例的场景。
        • (3). 死锁解除
          • 死锁解除的常用两种方法为进程终止和资源抢占。所谓进程终止是指简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止;所谓资源抢占是指从一个或多个死锁进程那里抢占一个或多个资源,此时必须考虑三个问题:
            • (I). 选择一个牺牲品
            • (II). 回滚:回滚到安全状态
            • (III). 饥饿(在代价因素中加上回滚次数,回滚的越多则越不可能继续被作为牺牲品,避免一个进程总是被回滚)

猜你喜欢

转载自blog.csdn.net/wzEminem/article/details/95315120
今日推荐