操作系统常考知识点

91 阅读8分钟

1. 什么是进程和线程?它们的区别是什么?

  • 进程:是操作系统中资源分配的基本单位,拥有独立的内存空间。

  • 线程:是操作系统中 CPU 调度的基本单位,多个线程可以共享同一进程的资源(如堆和方法区)。

  • 协程 是轻量级的用户态并发执行单元,适合高并发、I/O 密集型任务,切换开销极低,但无法多线程并行执行。

区别

  1. 资源使用:进程之间相互独立,线程共享同一进程的资源。
  2. 内存开销:创建进程开销较大,需要独立的内存空间;线程开销较小。
  3. 通信方式:进程间通信需要使用 IPC(如管道、消息队列);线程之间可以通过共享内存直接通信。
  4. 调度:进程切换需要更高的开销(上下文切换);线程切换较快,开销较小。

2. 什么是上下文切换?上下文切换的开销是什么?

上下文切换 是指操作系统在 CPU 上从一个进程(或线程)切换到另一个进程(或线程)时,保存当前进程的状态并恢复下一个进程的状态。

上下文切换的开销

  1. 保存和恢复进程状态:需要保存当前进程的 CPU 寄存器、程序计数器、内存管理信息等,并恢复下一个进程的这些信息。
  2. 内存缓存失效:切换后,新的进程可能需要重新加载缓存,导致缓存命中率降低,增加内存访问开销。
  3. 调度开销:操作系统需要运行调度程序,决定下一个要运行的进程,这本身也占用 CPU 时间。

3. 什么是死锁?死锁的条件是什么?

死锁 是指两个或多个进程在执行过程中,因争夺资源而互相等待,导致无法继续执行的现象。

死锁的四个必要条件(同时满足才会发生死锁):

  1. 互斥:某些资源只能被一个进程占有,不能共享。
  2. 持有并等待:进程已经持有某些资源,同时请求其他资源,但未释放已经持有的资源。
  3. 不可抢占:资源不能被强行剥夺,必须由占有它的进程主动释放。
  4. 循环等待:存在一个进程链,链中的每个进程都等待下一个进程占有的资源。

4. 如何避免死锁?

为了避免死锁,可以采取以下几种方法:

  1. 破坏互斥条件

    • 将资源设计为可共享的,比如某些只读数据不必互斥锁定。
  2. 破坏持有并等待条件

    • 要求进程在开始时一次性申请所有需要的资源,避免持有资源的同时请求新的资源。
  3. 破坏不可抢占条件

    • 允许系统抢占某些资源,如强制释放正在占用的资源,将其分配给其他进程。
  4. 破坏循环等待条件

    • 强制进程按资源编号顺序请求资源,避免循环等待链的产生。
  5. 银行家算法(Banker’s Algorithm)

    • 使用银行家算法来动态检测资源分配情况,确保系统处于安全状态,避免进入死锁状态。

5. 内核态与用户态的切换方式

  1. 系统调用(System Call):用户程序通过系统调用请求操作系统的服务。
  2. 中断(Interrupt):来自外部硬件设备(如键盘、网络卡)的事件,要求 CPU 停止当前执行的任务并处理中断。
  3. 异常是程序执行过程中发生的错误或特殊情况,例如除零错误、非法内存访问等。

6. 进程调度算法有哪些?

  1. 先来先服务(FCFS)

    • 按照进程到达的顺序执行,简单但效率不高。
  2. 短作业优先(SJF)

    • 优先执行预计运行时间短的进程,可能导致长作业饥饿。
  3. 优先级调度

    • 根据进程的优先级决定执行顺序,优先级高的进程优先执行。
  4. 时间片轮转(RR)

    • 给每个进程分配固定的时间片,时间片用完则切换到下一个进程,适合时间共享系统。
  5. 多级反馈队列调度

    • 将进程放入多个优先级队列中,优先执行高优先级队列中的进程,并根据进程的行为动态调整其优先级。

7. 什么是虚拟内存?它的作用是什么?

虚拟内存 是操作系统通过硬件实现的一种内存管理技术,它允许程序使用比物理内存更大的内存空间。

作用

  1. 扩展内存容量:虚拟内存可以将物理内存和磁盘结合使用,让系统能够运行比物理内存大得多的程序。
  2. 隔离内存空间:每个进程拥有独立的虚拟地址空间,避免进程之间互相干扰,提高系统安全性和稳定性。
  3. 提高内存利用率:通过分页技术,将不常用的数据暂时交换到磁盘中,腾出内存空间供其他进程使用。

8. 什么是内存碎片?如何解决内存碎片问题?

内存碎片 是指内存分配和释放过程中产生的小块未被使用的内存,导致可用内存无法满足大的内存分配需求。

内存碎片的类型

  1. 外部碎片:由于不连续的内存分配导致的碎片,即虽然有足够的内存总量,但分布在不连续的地址空间中。
  2. 内部碎片:由于分配的内存块大于实际需要,导致未使用的空间浪费。

解决内存碎片的方式

  1. 分页:通过将内存分为固定大小的页,避免外部碎片问题。
  2. 内存紧凑:定期将分散的内存块合并成一个大的连续块,减少外部碎片。
  3. 适当的分配算法:如首次适应算法、最佳适应算法等,减少内存分配过程中产生的碎片。

9. 什么是信号量(Semaphore)?它有哪些类型?

信号量(Semaphore) 是一种用于进程同步的机制,通过信号量可以控制多个进程对共享资源的访问。

信号量的类型

  1. 计数信号量:用于控制可以同时访问共享资源的进程数量。当进程获取资源时,信号量减 1,释放资源时,信号量加 1。如果信号量为 0,进程需等待。
  2. 二进制信号量(也称互斥量):信号量只有 0 和 1 两个值,用于互斥访问共享资源。只有一个进程能访问资源,其他进程必须等待。

信号量的作用

  • 控制进程同步,避免多个进程同时访问共享资源时产生冲突。
  • 可以解决生产者-消费者问题等经典同步问题。

10. 什么是分页(Paging)和分段(Segmentation)?它们的区别是什么?

  • 分页(Paging) :将物理内存和逻辑内存分为固定大小的页(page)和页框(frame)。分页是操作系统内存管理的一种方式,通过页表将逻辑地址映射到物理地址。
  • 分段(Segmentation) :将内存分为大小不定的段(segment),每个段代表逻辑上的一个单位(如代码段、数据段)。段表将逻辑段映射到物理内存。

区别

  1. 内存分配方式

    • 分页:内存以固定大小分配,防止内存碎片。
    • 分段:内存分配以逻辑段为单位,段的大小可变,容易产生内存碎片。
  2. 地址结构

    • 分页:逻辑地址由页号和页内偏移量组成。
    • 分段:逻辑地址由段号和段内偏移量组成。
  3. 应用场景

    • 分页:适合解决外部碎片问题,提高内存利用率。
    • 分段:适合按逻辑划分程序结构,方便管理代码、数据等。

总结: 分页是固定大小的内存管理方式,避免了碎片问题;分段是按逻辑划分的内存管理方式,更灵活但易产生碎片。


11. 什么是分页替换算法?常见的页面置换算法有哪些?

分页替换算法 是操作系统在虚拟内存管理中,当物理内存不足时,选择一个页面置换(换出到磁盘)以便加载新的页面到内存中的算法。

常见的页面置换算法

  1. FIFO(先进先出) :最早进入内存的页面最先被替换,简单但效率不高。
  2. LRU(最近最少使用) :替换最近最少使用的页面,近似最优,但需要额外的硬件支持记录页面使用情况。
  3. LFU(最少使用) :替换使用频率最低的页面,适合使用频率有明显差异的场景。
  4. OPT(最佳置换算法) :理论上最优的算法,替换将来最不常使用的页面,但实际难以实现。