操作系统面试题

本文最后更新于:2022年7月3日 下午

1.进程和线程以及他们的区别与联系?

进程是程序在某个数据集合上的一次执行过程,是系统资源调度和分配的最小单位。
线程是进程的实体,是cpu调度和分派的最小单位,线程自己基本上不拥有系统资源,只拥有一些必要资源,但是他可以与同属于一个进程的线程共享所有的资源。
一个进程可以拥有很多个线程,但是一个线程只能属于一个进程,一个线程还可以创建多个子进程,同时多个线程可以并发执行。线程执行开销小,但是不利于资源的管理和保护,而进程则正好相反。

2.分段和分页以及他们的区别是什么?

页是信息的物理单位,是为了实现信息的离散分配方式,提高内存的利用率,分页仅仅是由于系统的需要而非用户的需要。页的大小是固定的,把逻辑地址分为页号和页内地址,但是用户只用提供一个逻辑地址就能标识对应的地址,所以分页作业地址空间是一维的。
段是信息的逻辑单位,它包含了一组意义相对完整的信息,长度可变,由用户决定,程序员标识一个地址时,要给出段号还有段内偏移量,所以分段的作业地址空间是二维的。

3.进程通信方式?

1)匿名管道:通常称为管道,管道是IPC最基本的一种实现机制,在Linux下一切皆文件,其实这里的管道就是一个文件。管道实现进程的通信就是让两个进程都能访问这个文件。管道的特点只提供单向通信,虽然两个进程都能访问这个文件,但是一个在写的时候另一个只能读。同时只能用于具有血缘关系的进程之间通信,常用于父子进程通信。
2)FIFO命名管道:管道虽然实现了进程通信,但是也存在一定局限性,故提出了命名管道。其特点是提供了一个路径名与之关联,以FIFO文件的形式存储在文件系统中,它不局限于父子进程,而能够实现任意两个进程之间的通信。同时遵循先进先出的原则,即第一个写进的数据会第一个被读走。
3)消息队列:存放在内核中,在内核中创建一块内存存放消息,生命周期随内核,消息队列会一直存在。同时可以双向通信,不一定按照先进先出的方式取消息,也可以按照类型取消息。
4)信号量:类似于一个计数器,可以控制多个进程对共享资源的访问,需要限制在同一时刻最大访问资源的进程数。
5)共享内存:顾名思义,映射一段与其他进程共享的内存空间,当一个进程写完后另一个进程读就实现了进程通信,同时要注意写的过程不能读,这就需要配合信号量机制使用。共享内存区是IPC形式中最快的,因为进程不通过执行任何进入内核的系统调用就可以进行通信。

4.线程同步方式?

临界区:访问临界资源的代码段,在任意时刻只允许一个线程对临界资源进行访问,如果有多个线程试图访问临界资源,那么在有一个线程进入后,其他试图访问临界资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
互斥量:采用互斥对象机制,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。
信号量:同进程同步方式。

5.什么是线程安全?

指某个函数、函数库在并发环境中被调用时,能后正确地处理多个线程之间的共享变量,是程序能够正确的完成。

6.什么是死锁?

在两个或多个并发进程中,如果每个进程持有各自的资源而又都等待其余进程释放正在持有的资源,在没有外力的情况下谁都无法推进,相互等待的一种状态,称为死锁。

7.死锁产生的原因以及避免方法?

死锁产生的原因1)系统资源的竞争:系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。2)进程运行推进顺序不合适:进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。
死锁产生的必要条件:1)互斥条件:一个资源每次只能被一个进程使用。2)请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,但是请求的资源又正在被其他进程所占有。3)不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走。4)循环等待条件:若干进程键形成首尾相连循环等待资源的关系。
死锁避免方法:系统对进程发出的资源申请进行动态检查,若分配后可能发生死锁,那么不与分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。如果操作系统能保证所有进程在有限时间内得到需要的全部资源,则系统处于安全状态否则系统是不安全的。

8.操作系统的fork()过程?

父进程调用fork()函数后,系统给子进程分配资源时,fork并不直接复制父进程的内存空间,而是与父进程共享一个写时复制的内存空间。Fork()返回时会返回两次,分别返回到父进程和子进程。

9.说说Cpu调度算法?

1)先来先服务算法:按照进程就绪的先后顺序使用处理器。
2)短作业优先算法:具有最短完成时间的进程优先使用处理器。
3)最高响应比优先算法:首先计算响应比,选择最高响应比的进程使用处理器(响应比=(等待时间+处理时间)/处理时间)。
4)时间片轮转调度算法:每个进程分配一个时间片,如果在时间片内没有执行完毕则剥夺处理器并分配给其他进程。
5)最高优先级调度算法:选择优先级最高的进程优先执行。优先级可以静态不变,也可以动态调整。
6)多级反馈队列调度算法:根据先来先服务原则给就绪队列排序,为就绪队列赋予不同的优先级数,不同的时间片,按照优先级抢占CPU的调度算法。

10.用户态和内核态是什么?进程什么时候由用户态转化为内核态?

Linux进程地址空间分为用户空间和内核空间,内核空间可以执行比用户空间更高权限的动作。应用程序如果运行在用户空间,就叫用户态;如果运行在内核空间,就叫内核态。
系统调用:用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的程序服务完成工作,总是返回接着执行下一条指令。
异常:当CPU在执行运行在用户态的程序时,出现了某些异常,这时会出发异常处理程序,由用户态切换到内核态中,可能会返回到用户态接着执行出现异常的指令,也可能直接终止而不返回。
中断:当外围设备准备完成之后,会向用户发送相应的中断信号,这时用户在执行完当前指令后注意到中断引脚的电压变高了,就从系统总线读取异常信号,然后调用适当的中断处理程序。如果先执行的指令是在用户态下那么自然就发生了用户态到内核态的切换。

11.互斥量与信号量的区别?

互斥量用于线程的互斥,信号量用于线程的同步。
互斥量只能为0/1,信号量可以为非负值。
互斥量只能由一个线程加锁或者解锁,信号量可以由一个线程释放,另一个线程得到。

12.进程切换会发生什么?

1)正在运行的用户态进程X
2)发生中断
3)保存现场
4)进程上下文切换
5)开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以继续执行)
6)恢复现场
7)继续运行用户态进程Y

13.linux线程同步的方法?

互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等。

14.互斥锁、读写锁和自旋锁的区别和使用场景?

互斥锁:保护了一个临界区,在这个临界区中,一次最多只能进入一个线程。
读写锁:从广义的逻辑上讲,也可以认为是一种共享版的互斥锁。可以多个线程同时进行读,但是写操作必须单独进行,不可多写和边读边写。如果对一个临界区大部分是读操作而只有少量的写操作,读写锁在一定程度上能够降低线程互斥产生的代价。
自旋锁:当要获取一把自旋锁的时候又被别的线程持有时,不断循环的去检索是否可以获得自旋锁,一直占CPU资源,直到获取到锁才会退出循环。

15.怎么解决死锁?

发生死锁后,撤销进程,回收资源,分配给正在阻塞状态的进程。

16.多进程和多线程那个更可靠?

多进程相比而言更可靠,因为多进程的进程之间不会互相影响,然而多线程一个线程崩溃会导致进程出错使得进程中所有线程都出错。

17.僵尸进程是什么,孤儿进程是什么?

子进程先于父进程结束,而父进程又没有调用wait或者waitpid获取其退出信息。子进程还需要在其PCB中保存其退出的相关信息,所以,子进程的执行主体已经结束,但是操作系统并没有释放该进程PCB结构,以满足父进程后续对该子进程退出信息的查询(如果父进程还在运行)。在子进程结束运行之后,父进程读取其退出状态之前,我们称该子进程为僵尸进程。
父进程结束或者异常终止,但是子进程继续运行。此时子进程的PPID被设置为1,即init进程。init进程接管了该子进程,并等待它结束,在父进程退出之后,子进程退出之前,该子进程属于孤儿进程

18.进程上下文切换的过程?

(1接收到切换信号,挂起进程,记录当前进程的虚拟内存、栈等资源存储;
(2将这个进程在 CPU 中的上下文状态存储于起来;
(3然后在内存中检索下一个进程的上下文;
(4并将其加载到 CPU的寄存器中恢复;
(5还需要刷新进程的虚拟内存和用户栈;
(6最后跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。

19.什么时候会发生进程调度?

1)进程时间片耗尽;
2)系统资源不足(如内存不足);
3)进程通过睡眠函数 sleep 把自己挂起来;
4)当有优先级更高的进程运行时,为了去运行高优先级进程,当前进程会被挂起;
5)发生硬中断,CPU 上的进程会被挂起,然后去执行内核中的中断服务进程。

20.进程切换与线程切换的区别?

线程和进程的最大区别就在于地址空间,线程共享进程的地址空间,所以不会进行新的页表的切换。

21.线程有什么是共享的什么是私有的?

线程共享的包括进程代码段、进程的公有数据、进程打开的文件描述符、信号的处理器、进程当前目录、进程用户ID与进程组ID。
线程私有的有线程ID、寄存器组的值、线程的堆栈、错误返回码、线程的信号屏蔽码。

22.堆和栈分配的速度,为什么?

栈更快,因为栈中的数据生存周期固定,定位数据快速,而堆是动态随机分配的内存空间。

23.为什么要用虚拟内存?

隔离进程地址空间、提高内存利用率、程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。


操作系统面试题
https://dlddw.xyz/2022/07/01/操作系统基础面试题/
作者
Deepblue
发布于
2022年7月1日
许可协议