0. 写在前面
这些问题是我备考操作系统过程中,详细总结的常见面试问题和答案。逐个搜索并记录下来,花了很大的精力!
特点
并发:宏观上同时发生,微观上交替发生
共享:共享指资源共享,指系统中的资源可供内存中多个并发执行的进程共同使用
3虚拟:虚拟是指把一个物理上的实体变为若干逻辑上的对应物,物理实体是实际存在的,而逻辑对应物是用户感受到的
异步:进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步‘
功能
处理器管理
存储管理
设备管理
作业管理
文件管理
2. 中断和系统调用的区别?
系统调用:应用程序主动向操作系统发出的服务请求
中断: 来自硬件设备的处理请求
系统调用 | 中断 | |
源头 | 应用程序 | 外设 |
响应方式 | 同步或者异步 | 异步 |
处理机制 | 等待或者持续 | 持续,对用户是透明的 |
3. 并发和并行的理解
并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
4. 同步、异步、阻塞、非阻塞的概念
同步调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为
异步调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作
阻塞是指:,当试图对该文件描述符进行读写时,如果当时没有数据可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止
非阻塞是指, 如果没有数据可读,或者不可写,读写函数马上返回,而不会等待
5. 进程和线程的基本概念
进程是具有独立功能的程序在某个数据集合上的一次执行过程。进程是系统进行资源分配和调度的一个独立单位。
线程是进程内的一个执行实体或执行单元,是比进程更小的能独立运行的基本单位
6. 进程和线程的区别?
进程是资源分配最小单位,线程是程序执行的最小单位
进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据
CPU切换一个线程比切换进程花费小
创建一个线程比进程开销小
线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数据,进程之间的通信需要以通信的方式(IPC)进行;(但多线程程序处理好同步与互斥是个难点)
多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间)
7. 为什么进行的进程的切换开销比线程少?
现在都采用轮转时间片的方式去运行,当切换进程时,需要保存进程的执行现场,然后去执行下一个进程,恢复执行时,首先要恢复执行现场,才能继续执行。切换线程也是同样的道理,需要保存线程的执行现场,但是在进程内切换线程,进程的资源是共享的不用切换。
在虚拟内存那边文章里说过,程序运行时,CPU拿到的也是线性地址,需要将其转换到物理地址。这个任务交给CPU中的内存管理单元MMU负责,但是从内存中查询数据是及其缓慢的,因此每次查询时会将已经转换过的映射信息缓存到TLB中,再转换地址时先从TLB中查找,如果没有再去页表中查询。
而如果切换进程的话,TLB的缓存就会失效,而切换线程则不会影响TLB。因此这是切换进程代价比较高的一点原因。
8. 为什么有了进程还要有线程?
减少程序在并发执行时所付出的时空开销,提高并发性
9. 进程的状态转换
10. 进程间的通信方式
管道:速度慢,容量有限,只有父子进程能通讯;
FIFO:任何进程间都能通讯,但速度慢;
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题;
信号:有入门版和高级版两种,区别在于入门版注重动作,高级版可以传递消息。只有在父子进程或者是共享内存中,才可以发送字符串消息;
信号量:不能传递复杂消息,只能用来同步。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
11. 进程调度算法
先来先服务
时间片轮转
最短作业优先
最短剩余时间优先
优先级调度
多级反馈队列调度
https://blog.csdn.net/qq_43380851/article/details/119970956
12. 读写者问题是进程实现的还是线程实现的
读者写者和进程共同是实现
13. 文件系统中文件是如何组织的
文件系统中的文件有逻辑结构和物理结构。在逻辑结构上无非就是逻辑块0到80等等,逻辑上文件可以分为有结构和无结构,有结构可以分为定长和不定长,组织方式有顺序文件,索引文件,索引顺序文件
物理上,就是逻辑块对应一个个的磁盘块,分配方式主要有,顺序,链接(隐式和显式),索引
14. 什么是死锁
就是多个进程为了争夺同个资源,成为了阻塞状态。没有外力是无法进行下去的。
15. 死锁的必要条件
互斥,占有并等待,不可剥夺,循环等待
16. 解决死锁的基本方法
检测、恢复、预防、避免
17. 预防死锁
事先破坏死锁产生的必要条件之一
18. 死锁避免
银行家算法
19. 死锁恢复
资源剥夺,进程回滚,系统重启
20. 哲学家进餐的实现方式
至多n-1个哲学家同时进餐;检测左右两边都有筷子才能进餐;奇数哲学家先拿左边的筷子,偶数哲学家先拿右边的筷子
21. 常见进程调度算法
先进先出,最短作业优先,剩余最短作业优先,优先级,轮转,多级反馈队列
21. 分页的好处?和分段的区别
分页:
优点:内存利用率高,不会产生外部碎片。
缺点:不是划分的逻辑模块,不利于信息的共享和保护
分段:
优点:能够利用逻辑模块进行分段,利于信息的共享和保护
缺点:如果段太长,不利于管理;会产生外部碎片
23. 虚拟内存,共享内存?
虚拟内存是基于局部性的原理,将程序很快要用到部分装入内存,暂时用不到的地方就放入外存
需要完成:请求调页和页面置换两个核心功能
24. 页面置换算法
OPT长时间内不会访问的页面(无法实现)
FIFO先进先出
LRU最长没有访问的页面
循环时钟算法,访问位
改进型循环时钟算法,访问位和修改位,先淘汰(0,0),再淘汰(0,1),将访问位置0,再淘汰(0,0),再淘汰(0,1)
25. 磁盘调度算法和磁盘空间存储管理
先来先服务,最短寻道作业优先,SCAN,C-SCAN,LOOK,C-LOOK
盘面和柱面
磁盘初始化:
物理初始化
根据柱面分区
逻辑初始化(文件系统)
引导块(启动分区):
磁盘初始化后写入操作系统,用来初始化内存、CPU、寄存器等工作(这些内容被写到了ROM存储器中,后来由于ROM不可修改的特性,就把启动程序放入了硬盘里面,称为引导块。ROM里面存放自举装入程序)
26. 缓冲区溢出?有什么危害?
缓冲区就是处理CPU和其它设备速度不匹配的问题,比如说CPU和I/O。
缓冲区是一个数据块,必须为空才能写,必须写满。如果缓冲区不为空就只能读。
单缓冲区,双缓冲区,双向缓冲区,缓冲区池
缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害有以下两点:
1、程序崩溃,导致拒绝服务
2、跳转并且执行一段恶意代码
27. 一个程序从开始到结束的完整过程
28. 用户态和内核态
是操作系统运行的两种状态
用户态的cpu只能访问内存,不允许执行特权指令,不允许访问外围设备,不能独占CPU,CPU能被其它程序获取
内核态的cpu以访问任意的数据,包括外围设备,比如网卡、硬盘,cpu可以从一个程序切换到另一个程序。
为了是限制用户程序访问能力,计算机中有一些比较危险的操作,比如设置时钟、内存清理,这些都需要在内核态下完成
系统调用
中断
异常
29. 进程终止的方式
正常return
exit()的作用是退出当前进程,并且尽可能释放当前进程占用的资源
_exit()的作用也是退出当前进程,但是不试图释放当前进程占用的资源,而且_exit()终止进程的时候不调用atexit()、on_exit()等注册的回调函数!
atexit()、on_exit()作用都是程序退出是指定调用用户的代码(可以理解为设置回调函数),区别在于on_exit()可以为设定的用户函数设定参数。
30. 锁的种类
悲观锁,乐观锁,公平锁,非公平锁,读写锁,自旋锁,自适应自旋锁
和非自旋锁的区别,它拿不到锁就阻塞等待唤醒
自旋锁:阻塞和唤醒线程都是需要高昂的开销的,如果同步代码块中的内容不复杂,那么可能转换线程带来的开销比实际业务代码执行的开销还要大
31. 段页式管理
将进程根据逻辑模块进行分段,再将各段进行分页
32. 中断服务程序流程
1.保护现场
保护现场有两个含义,其一是保存程序的断点;其二是保存通用寄存器和状态寄存器的内
容。前者由中断隐指令完成(详见8.4.4节),后者由中断服务程序完成。具体而言,可在中断
服务程序的起始部分安排若干条存数指令,将寄存器的内容存至存储器中保存,或用进栈指令
(PUSH)将各寄存器的内容推入堆栈保存,即将程序中断时的“现场”保存起来。
2.中断服务(设备服务)
这是中断服务程序的主体部分,对于不同的中断请求源,其中断服务操作内容是不同的,例
如,打印机要求CPU将需打印的一行字符代码,通过接口送人打印机的缓冲存储器中(参见图573)以仕打印机打印又如,显示设各要求CPU将需显示的一屏字符代码通过接口送人显示5.23)以供打印机打印。又如,显示设备要求CPU将需显示的一屏字符代码通过接口送入显示器的显示存储器中(参见图5.18)。
3.恢复现场
这是中断服务程序的结尾部分,要求在退出服务程序前,将原程序中断时的“现场”恢复至
原来的寄存器中。通常可用取数指令或出栈指令(POP),将保存在存储器(或堆栈)中的信息这
回到原来的寄存器中。
4.中断返回
中断服务程序的最后一条指令通常是–条中断返回指令,使其返回到原程序的断点处,以信
继续执行原程序。
计算机在处理中断的过程中,有可能出现新的中断请求,此时如果CPU暂停现行的中断月
务程序,转去处理新的中断请求,这种现象称为中断嵌套,或多重中断。倘若CPU在执行中断服务程序时,对新的中断请求不予理睬,这种中断称为单重中断。这两种处理方式的中断服务程戶略有区别。图5.43(a)和图5.43(b)分别为单重中断和多重中断服务程序流程。比较图5.4
()和图5.43(h)可以发现.其区别在千“开中断”的设置时间不同。