1. 操作系统由哪些构成
OS四大模块: 进程与线程管理、内存管理、IO与文件系统、设备管理
2. 进程与线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位。
上面的回答太官方,想要深入理解进程线程的区别可以参考这个回答:https://www.zhihu.com/answer/411179772
3. 进程与线程的定义
- 进程:一个运行中的程序实体。按我的理解包括三个维度:程序,数据,状态。
程序不同or数据不同,必然属于不同的进程。当程序数据均相同,但所处状态(五个不同的状态:new,ready,waiting,running,terminated)不同时,应该也属于不同的进程(个人理解)。 - 线程:线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
- 最好了解一下线程的提出背景,他解决了进程的什么不足(过多相似进程执行时带来的上下文切换开销过大,因而引入线程)
4. 进程的状态、切换、调度
进程的状态:
进程的切换:
进程的调度:部分调度算法有抢占式和非抢占式的区别。
- 先来先服务FCFS
- 短作业优先SJF/短进程优先SPF
- 优先权法
- 轮转法
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. 三个经典进程同步问题
- 生产者-消费者问题
- 读者-写者问题
- 哲学家进餐问题
9. 死锁
- 死锁的概念:多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
- 产生死锁的原因:
进程竞争资源引起的死锁and进程推进的顺序不当引起死锁。 - 产生死锁的四个必要条件(只要有一个条件不满足,就不会产生死锁):
- 处理死锁的基本方法:
死锁的预防(事前):进程执行前,破坏四个必要条件之一
死锁的避免(事中):银行家算法
死锁的检测和解除(事后)
鸵鸟算法:大部分操作系统采用的方法,死锁后重启or人工恢复 - 银行家算法:
参考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 具体如何做地址转换的
- 为什么需要虚拟内存?
CPU只能够访问内存中的数据,但内存的大小是有限的。当不采用虚拟内存的时候,能够同时运行的进程数十分有限。因此为了解决这一现象,可以利用硬盘上的空间先将内存中暂不使用的部分放到硬盘上,等到用的时候再调入内存。 - MMU 具体如何做地址转换的?
即页式存储管理和段式存储管理的映射机制。
12. 页面置换算法
参考1:https://blog.csdn.net/qq_39290490/article/details/82251421
参考2:https://www.cnblogs.com/Leophen/p/11397699.html
13. 文件系统的实现
- 文件系统的布局:文件系统存放在磁盘上,每个磁盘划分一个或多个分区,每个分区有独立的文件系统。一个磁盘包括多个扇面,编号从0开始递增,第0个扇面存放主引导记录(MBR),用来启动计算机。MBR之后的是分区表,存放每个分区的起始地址和结束地址。
- 文件的实现:文件的实现就是记录各个文件分别用到了哪些磁盘块。有连续分配,链表分配,内存中的表分配,i节点等方式。
- 共享文件:硬链接和符号链接。
14. 虚拟文件系统(VFS)是如何抽象的
VFS抽象所有文件系统共有的一部分,并且将这部分代码放在单独的一层。它定义所有文件系统都支持的基本的、概念上的接口和数据结构,同时实际文件系统也提供VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。
15. 几种磁盘调度算法
- FCFS(先来先服务算法):磁头移动距离较长。
- SSTF(最短寻道时间优先算法):磁头移动距离最短,但有可能引起某些请求的饥饿。
- SCAN(扫描算法/电梯算法)
- C-SCAN(循环扫描算法):较好的解决了饥饿现象。
16. 五种I/O模型
参考https://blog.csdn.net/yubujian_l/article/details/83244701