操作系统面试题总结

孤街浪徒 提交于 2020-02-17 11:38:30

1.进程的常见状态?以及各种状态之间的转换条件?

  • 就绪
  • 执行
  • 阻塞:正在执行的进程由于某些发生的事件/中断(如I/O请求,申请缓冲区失败暂时无法继续执行的状态)

2.进程同步

  • 同步和互斥的区别?
  • 同步指的是不同进程之间的执行有先后顺序/依赖关系。需要对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间互相合作,使程序的执行具有可再现性。
  • 同步机制遵循的原则
    • 空闲让进
    • 忙则等待(保证对临界区的互斥访问)
    • 有限等待(等待有限的时间,避免死等)
    • 让权等待(进程不能自己进入临界区时,应该是v昂处理机,一面陷入忙等待状态)

3.进程通信的方式有哪些?

  • 低级通信:使用信号进行进程间的互斥和同步,交换的信息量少
  • 高级通信:利用才做系统提供的一组通信命令传送大量数据,实现过程对进程/用户隐藏
  • 高级通信机制可以分为一下三大类
    1. 共享存储器系统(如剪贴板)
    2. 消息传递系统
    3. 管通信系统
      • 管道时单向的,先进先出,无结构的,固定大小的字节流,把一个进程的标准输出和另一个进程的标准输入连接在一起。一段写入,另一端读取,有阻塞机制
  • 什么是信号量:简单来说就是一个计数器
  • 消息队列
  • 共享内存:不同进程的虚拟内存可以被映射到同一块物理内存
  • 套接字

4.上下文切换

  • 将CPU资源从一个进程分配给另一个进程的机制。切换的过程中,操作系统需要保存当前进程的状态(包括寄存器,程序计数器,内存空间的指针/页表头的地址等),在载入另一个进程运行锁需要的资源(状态)。

5.进程和线程的区别和联系

  • 进程和线程的关系
    • 进程是资源分配调度的最小单元
    • 线程是CPU分配调度的最小单元
    1. 线程必须属于一个进程,线程不能独立存在。一个进程至少有一个线程,线程是计算机可以识别的最小调度执行单位。
    2. 资源分配给进程,同一进程内的所有线程共享所在进程的所有资源,包括代码段,数据段(全局变量和静态变量),扩展段(堆)。
    3. 每个线程可以有自己的运行栈和局部变量、临时变量
    4. CPU分配给线程,真正在CPU上执行的是线程
    5. 线程在执行过程中,需要协作同步。不同进程的线程间要利用通信的方法实现同步
  • 进程和线程的区别
    1. 进程有自己的地址空间,线程没有
    2. 进程是资源分配的最小单位,线城市CPU调度的最小单位,真正在CPU上运行的是线程
    3. 通信方式不同。线程之间通信比较方便,共享数据(代码段,数据段,扩展段等)。当然需要处理好这些共享数据访问的同步和互斥比较难。
    4. 进程上下文切换开销大,线程开销小,因为很多数据都共享,切换程序计数器的指针就好了。
    5. 进程之间一般不会相互影响,线程可能会互相影响
    6. 对进程操作开销都比较大
    • 上下文切换的开销是什么
      • 进程切换上下文需要
      1. 切换页表目录以切换地址空间
      2. 切换内核栈和硬件上下文
      • 线程切换不需要第一步,因为共享地址空间
    • 开销到底在哪里
      1. 扰乱缓存机制,原本TLB中缓存的地址都失效,重新翻译地址需要到内存中读取,更加低效
      2. 都需要进行的内核栈操作,因为上下文切换是内核执行的,需要陷入内核态,需要切换寄存器内容,开销大。
  • 进程 = 加载上下文->程序执行(多个线程总和)->保存上下文,进程和线程都是一个时间段的描述,只是颗粒大小不同。
  • 现成的分类
    • 用户级线程:线程的管理由应用程序完成。内核并不清楚用户级线程的存在,用户级线程的优势在于,高效,不许要进入内核空间,但并发效率不高
    • 内核级线程:线程的管理由内核完成。内核可以将吸纳成分配到不同的CPU,真正实现并行计算。

6. CPU调度算法

  1. FIFO,先来先服务:比较公平,实现简单
  2. Shortest Job First:最短的作业优先调度
  3. 优先权调度
  4. 轮转调度算法:设置最长时间片,等待时间短,但是上下文切换次数比较多
  5. 多级队列调度。不同的队列由不同的优先级
  6. 多级反馈队列:不同队伍有不同的优先级。首先调度优先级高队列中的进程,高优先级队列中没有进程后才会调度优先级低队列中的任务。对于同一个优先级队列中的任务,采用时间片轮转调度法,如果一个任务不能完成,则加入下一级优先队列。如果正在执行低优先级队列中的任务,高优先级队列中到达新的作业,那么运行完这个时间片后,立即执行高优先级队列中的作业(抢占式)。

7. 产生死锁的条件?如何处理死锁?

产生死锁的必要条件:

  • 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

  • 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

  • 非抢占条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

  • 循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

如何处理死锁问题:

  • 忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

  • 检测死锁并且恢复。

  • 仔细地对资源进行动态分配,使系统始终处于安全状态以避免死锁。

  • 通过破除死锁四个必要条件之一,来防止死锁产生。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!