操作系统面试常问题

298 阅读8分钟

1. 操作系统的四个特征

A. 并发

程序中同一时间段有多个进程在运行. 每个进程可分为多个线程, 同一时间段有一个线程运行

B. 共享

操作系统中的不同进程共享资源, 但进程各自有地址空间, 互不干扰

C. 虚拟

时分复用(同一时间段有多个进程运行),

空分复用(同一个内存对每个进程来说都映射了虚拟内存空间)

D. 异步

同步指一段程序时连续执行完的, 而异步是指一段程序在操作系统中运行时走走停停的, 人无法预测

2. 操作系统主要功能

  • 处理器管理(CPU管理)
  • 存储器管理(内存管理)
  • 设备管理(I/O)
  • 文件管理
  • 提供用户接口

3. 进程 & 线程

进程是操作系统资源分配的单位, 每个线程有自己独立的地址空间, 进程间互不干涉.

进程切换耗费系统资源大

线程是操作系统调度的单位, 是一段连续的执行代码, 线程共享进程的资源, 每个进程至少有一个线程.

线程切换耗费资源少

4. 进程间通信方式

A. 共享内存

因不同进程有独立的地址空间, 共享内存需用系统调用创建

B. 消息队列

C. 管道

D. 信号

E. 套接字

F. 信号量(Semphare)

5. 线程之间如何同步

A. 互斥量

如锁(Synchronized, Lock), 同一时间只有一个线程可以占有

B. 信号

wait, notify 通知的方式

C. 信号量Semphare

同一时间段内最大有n个线程可同时访问

6. 进程的状态

新建 start()后

就绪

运行

阻塞(wait(), join(), sleep(), 等待I/O, 等待🔐)

死亡

7. 死锁

死锁是指一个进程占有一个资源, 而需要的另一个资源被等待它所占有资源的另一个进程所占有, 形成了环路, 谁都无法执行.

死锁需要满足以下4个条件:

  1. 互斥条件: 资源同一时刻只能被一个进程占有
  2. 请求和保持条件: 进程占有原本的资源, 不释放, 继续请求另一项资源
  3. 不可剥夺条件: 进程所持有的资源不可被剥夺
  4. 环路等待条件: 进程之前形成资源等待的环路

8. 如何避免死锁

防止死锁的4个条件同时成立.

条件1是互斥锁的根本, 不能修改;

条件2: 不要在同一段同步代码中占用2个不同的资源;可以要求每个进程一次性请求所需的全部资源, 或申请新资源时释放已经占有的资源

条件3: 如果进程阻塞超过阈值时间, 主动释放资源; 死锁避免:如果进程申请某个资源会造成死锁, 不允许其申请; 死锁解除: 如果已经形成死锁,撤销资源或挂起进程

条件4: 对资源进行线性排序, 持有m资源的进程只能申请排序更大的资源

9. 进程调度算法

FCFS先来先服务调度算法

即按照进程到来的顺序逐个执行完毕

SJF短作业优先调度算法

每次从队列中挑选耗时最短的作业完成, 不利于大作业被调度

非抢占优先级调度算法

每次从队列中挑选优先级最高的作业, 执行完毕

抢占式优先级调度算法

每次从队列中挑选优先级最高的作业执行, 如果执行过程中有优先级更高的作业进入队列, 则讲原本执行的作业调度下CPU, 执行更高优先级的作业

RR时间片轮转调度算法

队列按照到来先后排列, 每次给队首任务分配固定的时间片执行, 如果未执行完, 将其移到队尾, 下一轮再执行.

多级反馈队列调度算法

有n个不同优先级的队列. 新任务加入时放到优先级最高的队列, 每次调度队首的作业, 执行固定的时间片长度, 如果未执行完, 将该作业移到下一优先级的队列.

优先级高的队列时间片小.

优先级为i的队列仅当前i-1个队列都为空时才会被调度.

10. 内存地址分配

动态分区分配: 操作系统为进程分配内存时根据其所需大小分配适当大小的空间

如何从内存中找到足够大的内存空间:

  1. FirstFit: 空闲区域按照地址顺序链接, 为新的进程分配找到的第一个足够大小空间
  2. BestFit: 将内存空闲区域从小到大链接, 为新的进程分配找到的第一个足够大小空间
  3. WorstFit: 将内存空闲区域从大到小链接, 为新的进程分配第一个(最大)的指定大小空间

11. 内存管理

CPU32位,64位表示一次可处理64位即8字节的信息

CPU地址线有16根表示一次寻址2^16大小, 即65535 = 64K大小的地址空间

直接寻址

CPU的地址线有16根, 则可直接寻址64Kb大小的内存空间

分段式寻址

8086计算机有1M内存, 需要20位地址总线(2^20 = 1Mb), 但此时ALU只能计算16位, 于是将内存分为64Kb一段, 共16段, 寻址时用16位寄存器存储的段基址 (实际段可以有不同的大小)

    段基址<<4位 + 偏移(段内地址)

分页式寻址

CPU --> MMU --> TLB ->物理地址总线

现代操作系统采用进程, 每个进程有独立的地址空间, 这个地址空间是虚拟内存. 使用虚拟内存有两个好处:

  • 程序不直接操作物理内存, 避免造成系统崩溃
  • 多进程并发运行, 如果直接操作物理内存容易冲突
  • 虚拟内存可以比物理内存更大, 避免内存不足

虚拟内存分为, 物理内存分为页框, 与页一一对应. 通过MMU映射到物理内存, 如果页不在物理内存中, 发生缺页中断, MMU中存有页表, 将页与页框映射起来

对于4GB的内存, 若每页4KB, 则共1M页, 如果有16位地址线, 一次可寻址2^16=64K页, 则需要二级页表.

64位系统需要多级页表

通过多级页表找到虚拟地址对应的物理地址, 此映射关系会被缓存到CPU的TLB高速缓存中.

段页式存储

分割依据 逻辑分割 固定大小分割
用户可见 ×
固定大小 ×

用分段方法来分配和管理虚拟存储器。程序的地址空间按逻辑单位分成基本独立的段,而每一段有自己的段名,再把每段分成固定大小的若干页。

用分页方法来分配和管理实存。即把整个主存分成与上述页大小相等的存储块,可装入作业的任何一页。程序对内存的调入或调出是按页进行的。但它又可按段实现共享和保护。

段表式存储

每一个段对应一张页表

12. 页面调度算法

FIFO算法

先入先出,即淘汰最早调入的页面。

OPT(MIN)算法

选未来最远将使用的页淘汰,是一种最优的方案,可以证明缺页数最小。实际中难以预测, 通常用来评价其他算法

LRU(Least-Recently-Used)算法

用过去的历史预测将来,选最近最长时间没有使用的页淘汰(也称最近最少使用)。

LFU(Least-Frequently-Used)

用寄存器记录页面被访问次数, 访问最少的页面被置换

时钟算法clock(最近未使用算法NRU)

页面设置一个访问位,并将页面链接为一个环形队列,循环直到遇到一个访问为位0的页面

内存抖动: 页面频繁换页, 导致系统性能下降(可能页面调度算法不佳/内存太小/程序算法不佳)

13. 零拷贝

零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。实现零拷贝用到的最主要技术是 DMA 数据传输技术和内存区域映射技术。

  1. mmap()代替read
  2. sendfile()