1. 操作系统由哪些构成
OS四大模块: 进程与线程管理、内存管理、IO与文件系统、设备管理

2. 进程与线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位。
上面的回答太官方,想要深入理解进程线程的区别可以参考这个回答:https://www.zhihu.com/answer/411179772

3. 进程与线程的定义

  1. 进程:一个运行中的程序实体。按我的理解包括三个维度:程序,数据,状态。
    程序不同or数据不同,必然属于不同的进程。当程序数据均相同,但所处状态(五个不同的状态:new,ready,waiting,running,terminated)不同时,应该也属于不同的进程(个人理解)。
  2. 线程:线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
  3. 最好了解一下线程的提出背景,他解决了进程的什么不足(过多相似进程执行时带来的上下文切换开销过大,因而引入线程)

4. 进程的状态、切换、调度
进程的状态:
图片说明
进程的切换:
图片说明

进程的调度:部分调度算法有抢占式和非抢占式的区别。

  1. 先来先服务FCFS
  2. 短作业优先SJF/短进程优先SPF
  3. 优先权法
  4. 轮转法

5. 进程间的通信方式
参考https://www.cnblogs.com/mydomain/archive/2010/09/23/1833369.html

6. 线程的实现方式
参考https://blog.csdn.net/gatieme/article/details/51892437

7. 临界区互斥与同步
临界区问题:假设n个进程竞相访问共享数据的情形,每个进程存在一段代码,称作临界区,进程就是通过这段代码访问了共享数据,其他代码没有访问共享数据。这n个进程中,至少存在1个以上的进程甚至修改了共享数据。

临界区问题的解决方案必须满足三个条件:
互斥:如果一个进程正在其临界区执行,那么,其他任何进程均不允许在他们的临界区中。
空闲让进:如果,没有进程处在它的临界区and某些进程申请进入其临界区。那么,只有那些不在remainder sections的进程,才能参与能否进入临界区的选举and这个选举不允许无限期推迟。
有限等待:某一进程从其提出请求至它获准进入临界区的这段时间里,其他进程进入他们的临界区的次数存在上界。
图片说明

信号量:
信号量是在多线程环境下保证共享数据不被并发调用的一种机制,在进入一个临界区前,线程必须获取一个信号量,出临界区时必须释放信号量,其他想进入临界区的线程必须(在一个等待队列中)等待第一个线程释放信号量。
代码框架:

Semaphore S;//初始值为1
do{
    wait(S){
        S--;
        if(S<0){
            block();//将进程加入等待队列(该等待队列只可采用先进先出或轮转法)
        }
    }
        Critical Section;//临界代码
    signal(S){
        S++;
        if(S<=0){
            wakeup(P);//将一个进程P从等待队列中取出
        }
    }
        Remainder Section;//其他代码段
}while(1);

信号量还可用于实现一般性进程同步问题
代码框架:

//定义信号量S,初始值为0
//假设要求执行完进程Pi的A之后,才允许执行进程Pj的B
Pi
.
.
.
A
signal(S);

Pj
.
.
.
wait(S);
B

管程:
管程也是一种进程同步互斥工具,用于解决信号量机制不易管理,易发生死锁的情况。
参考https://blog.csdn.net/qq_38998213/article/details/87899231
互斥锁:
参考https://blog.csdn.net/qq_39736982/article/details/82348672
自旋锁:
参考https://www.jianshu.com/p/dd1092451afb

8. 三个经典进程同步问题

  1. 生产者-消费者问题
    图片说明
    图片说明
    图片说明
  2. 读者-写者问题
    图片说明
    图片说明
    图片说明
  3. 哲学家进餐问题
    图片说明
    图片说明
    图片说明
    图片说明

9. 死锁

  1. 死锁的概念:多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
  2. 产生死锁的原因:
    进程竞争资源引起的死锁and进程推进的顺序不当引起死锁。
  3. 产生死锁的四个必要条件(只要有一个条件不满足,就不会产生死锁):
    图片说明
  4. 处理死锁的基本方法:
    死锁的预防(事前):进程执行前,破坏四个必要条件之一
    死锁的避免(事中):银行家算法
    死锁的检测和解除(事后)
    鸵鸟算法:大部分操作系统采用的方法,死锁后重启or人工恢复
  5. 银行家算法:
    参考https://blog.csdn.net/flowing_wind/article/details/82156968

10. 内存为什么要分段分页
有两个回答都很不错,可以作为参考
https://www.zhihu.com/answer/1642080313
https://blog.csdn.net/weixin_40710708/article/details/108720395

11. 为什么需要虚拟内存,MMU 具体如何做地址转换的

  1. 为什么需要虚拟内存?
    CPU只能够访问内存中的数据,但内存的大小是有限的。当不采用虚拟内存的时候,能够同时运行的进程数十分有限。因此为了解决这一现象,可以利用硬盘上的空间先将内存中暂不使用的部分放到硬盘上,等到用的时候再调入内存。
  2. MMU 具体如何做地址转换的?
    即页式存储管理和段式存储管理的映射机制。

12. 页面置换算法
参考1:https://blog.csdn.net/qq_39290490/article/details/82251421
参考2:https://www.cnblogs.com/Leophen/p/11397699.html

13. 文件系统的实现

  1. 文件系统的布局:文件系统存放在磁盘上,每个磁盘划分一个或多个分区,每个分区有独立的文件系统。一个磁盘包括多个扇面,编号从0开始递增,第0个扇面存放主引导记录(MBR),用来启动计算机。MBR之后的是分区表,存放每个分区的起始地址和结束地址。
  2. 文件的实现:文件的实现就是记录各个文件分别用到了哪些磁盘块。有连续分配,链表分配,内存中的表分配,i节点等方式。
  3. 共享文件:硬链接和符号链接。

14. 虚拟文件系统(VFS)是如何抽象的
VFS抽象所有文件系统共有的一部分,并且将这部分代码放在单独的一层。它定义所有文件系统都支持的基本的、概念上的接口和数据结构,同时实际文件系统也提供VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。

15. 几种磁盘调度算法

  1. FCFS(先来先服务算法):磁头移动距离较长。
  2. SSTF(最短寻道时间优先算法):磁头移动距离最短,但有可能引起某些请求的饥饿。
  3. SCAN(扫描算法/电梯算法)
  4. C-SCAN(循环扫描算法):较好的解决了饥饿现象。

16. 五种I/O模型
参考https://blog.csdn.net/yubujian_l/article/details/83244701