操作系统面试题目

操作系统的面试题目

https://blog.csdn.net/qq_22944825/article/details/77865214

1 什么是进程?什么是线程?线程和进程之间的关系?线程和进程的区别是什么?
进程是计算机中已经运行程序的实体。
线程是指进程中独立执行某个任务的单元。
线程和进程的形象化理解戳下面链接:
https://blog.csdn.net/weixin_41254254/article/details/80841806
线程和进程的联系与区别:

  1. 一个线程只能属于一个进程,而一个进程至少包含一个线程。
  2. 资源分配给进程,同一进程中的所有线程共享进程中的资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储),但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
  3. 线程共享内存地址空间,而进程不共享,且进程的地址空间相互独立
  4. 进程之间通信需要借助操作系统,而线程可以直接读/写进程数据段来进行通信。

2.进程有哪几种状态?孤儿进程、僵尸进程?如 何处理这两种进程、在编程时如何避免产生这两种进程。
五种状态。创建,就绪, 运行, 阻塞, 结束
就绪:进程已经准备好除cpu以为的所有资源,一旦得到cpu便可以运行
阻塞:进程正在等待某一资源为可用或等待输入输出完成。即使处理器空闲,该进程也不能运行。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程定期调用wait,对它们完成状态收集工作和进程释放。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
孤儿进程和僵尸进程的解决办法详见:
https://blog.csdn.net/dream_1996/article/details/71001006
https://www.cnblogs.com/Anker/p/3271773.html
https://blog.csdn.net/Eunice_fan1207/article/details/81387417

3.进程间通信有几种方式?详细解释其中最熟悉的一到两种?
进程间通信方式主要是五种:
1)管道
#include<unistd.h>
int pipe(int filedes[2]);
返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。
https://blog.csdn.net/skyroben/article/details/71513385
2) 命名管道FIFO
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
返回值:成功返回0,出错返回-1
https://www.cnblogs.com/shijingjing07/p/5621256.html
3 消息队列
http://blog.csdn.net/skyroben/article/details/72520501
4)信号量
信号量不是以传输数据为目的,而是用来保护共享资源,确保一个资源在一个时间段只有一个进程可以访问
信号量的同步于互斥详见操作系统概念第6章。
http://blog.csdn.net/skyroben/article/details/72513985
5)共享内存
共享内存的通信方式需要结合信号量来进行同步。
http://blog.csdn.net/skyroben/article/details/72625028
6)socket
后续补充
进程间五种通信方式介绍:
https://www.cnblogs.com/zgq0/p/8780893.html

4.操作系统的 CPU 调度算法有哪些?简述各种调度算法的原理?
cpu调度处理的问题是:从就绪队列中选择进程以便为其分配cpu
调度准则:最大化cpu使用率和吞吐量,最小化周转时间,等待时间和响应时间。
调度算法:
1)FSFS (先到先服务调度 First Come First Served)非抢占式调度方法,当一个进程进入就绪队列时,直接将其的PCB连接到就绪队列的尾部。FCFS的缺点是平均等待时间往往很长
2)SJF(最短作业优先调度 Short Job First) SJF平均等待时间最短,SJF算法的困难是:如何知道下次cpu执行的长度。
抢占SJF调度又称作为最短剩余时间优先调度,新进程的下次CPU执行,与当前运行进程的尚未完成的cpu执行相比,可能要小,则抢占SJF算法会抢占当前运行进程。
3)ps(优先级调度priority scheduling)SJF算法是优先级调度的一个特例。优先级调度的一个主要问题低优先级的进程可能会一直等待造成饥饿,解决饥饿的办法是老化。
4)RR(轮转调度算法Round-Robin)类似于FCFS调度,但是增加了抢占以切换进程。在极端情况下,若时间片很大,RR算法就成了FCFS算法。CPU在一个时间片内执行进程,时间片时间到,定时器中断,进而中断操作系统,进行上下文切换,再讲进程加到就绪队列的尾部,接着cpu调度程序会选择就绪队列的下一个进程。 RR策略的平均等待时间通常很长。 RR算法的性能很大程度取决于时间片的大小。RR算法时间片根据经验:80%的cpu执行应该小于时间片
5)多级队列调度 多级队列根据进程属性,如内存大小,进程优先级,进程类型将就绪队列分成多个单独队列,一个进程永久分道一个队列,每个队列有自己的调度算法,队列之间应该也有调度,通常采用固定优先级抢占调度。比如:前台队列可以使用RR算法,后台队列使用FCFS算法,前台比后台有高的优先级。
6)多级反馈队列调度 多级反馈队克服了多级队列调度中进程不能从一个队列移动到另一个队列。多级反馈队列调度算法允许进程在队列之间迁移,如果进程使用过多的cpu时间,那么他就会被迁移到更低的优先级队列,在较低优先级队列中等待过长的进程会被放到更高的优先级队列,这种形式的老化阻止了饥饿的产生。多级反馈队列的缺点是复杂。多级反馈队列需要以下参数来定义:
队列数量
每个队列的调度算法
用以确定何时升级\降级到更高\低的优先级队列中
用以确定进程在服务时将进入到那个队列的方法。
在下面链接中有其他新的调度算法:
https://www.cnblogs.com/gez123/p/6575114.html
https://www.cnblogs.com/lustar/p/7716165.html

5.死锁问题?死锁的原因、处理、预防策略?
死锁就是指多个进程循环等待他方资源而无限期僵持下去的局面。
产生死锁的必要条件是:互斥 非抢占 请求和保持 循环等待
死锁的预防:预防死锁只需要让死锁产生的4个必要条件不满足即可

  1. 打破互斥条件。考虑到某些资源必须互斥,这种方法并无实际价值
    2)打破请求和保持。一种方法是进程在执行前获得所有资源,另外一种方法是允许进程仅在没有资源的时候才可以申请资源。但是这种方法资源利用率低并且可能产生饥饿。
    3)打破抢占。如果一个进程持有资源并且申请另一个不能立即分配的资源,那么它现在的资源可以被抢占,相当于隐式的释放了。实现困难。
    4)打破循环等待。对所有资源类型进行完全排序,要求所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。这种方法资源的利用率和系统吞吐量都有很大提高,但是该种方法限制进程对资源的请求并且如何排序是一个难点。
    死锁的避免:死锁预防通过通过限制如何申请资源来预防。而死锁避免算法通过每个进程声明可能需要的每种类型资源的最大数量,动态检查资源分配的状态,以便确保循环等待条件不成立。
    1)安全状态:系统按照一定顺序为每个进程分配资源。,以此来避免死锁。系统在不安全状态不一定会产生死锁,但是在死锁时,一定处于不安全状态。
    2)银行家算法:当一个新的进程进入系统时,它应该声明可能需要的每种类型资源实例的最大数量,这一数量不能超过系统资源的总和。当用户申请一组资源的时候,系统应确定这些资源的分配是否会使系统处于安全状态。如果会,则分配资源,否则进程等待,直到某个资源释放足够多的资源为止。
    死锁的检测与恢复:死锁检测使用类型银行家算法进行定时检测,死锁的恢复可以采用关闭操作系统、终止进程和抢占资源来完成。
    死锁忽略:LINUX UNIX WINDOWS都采用这种办法(鸵鸟算法)
    参考博客:
    https://blog.csdn.net/caozhao3344/article/details/77199552
    https://www.cnblogs.com/wuchanming/p/4345243.html

6.进程同步的几种解决方案?
临界区:当一个进程在临界区内执行时,其他进程不允许在它的临界区执行,没有2个进程可以在他们的临界区同时执行。同步机制遵循的原则:
(1)空闲让进;(2)忙则等待(保证对临界区的互斥访问);(3)有限等待(有限代表有限的时间,避免死等);(4)让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。
peterson解决方案:适用于两个进程交错执行临界区与剩余区。
flag[i] = true;
turn = j;
while(flag[j] && turn==j);
临界区
flag[i] = false;
剩余区
面包店解决方案:多进程下的peterson解决方案扩充。
互斥锁:一个进程在进入临界区应该得到锁,退出时应该释放锁。函数acquire()取得锁,release()释放锁。对于acquire和release的调用细节必须原子地执行。互斥锁需要忙等待,当一个进程在临界区中,任何其他进程在进入临界区必须循环调用acquire(),这种类型互斥锁为自旋锁。自旋锁多用于多处理器系统上。
acquire() {
while(!available);
available = false;
}
release() {
available = true;
}
信号量:一个信号量S是个整型变量,除了初始化之外只能通过两个标准原子操作:wait()和signal()来访问。
定义信号量:
typedef struct{
int value;
struct process *list;
}semaphore;
wait(semaphore*S){
S->value–;
if(S->value < 0){
add this process to S->list;
block();
}
}
signal(semaphore*S){
S->value++;
if(S->value <= 0){
remove a process from S->list;
wakeup§;
}
}
进程同步的经典问题:
消费者-生产者:需要维持3个互斥变量mutex,empty,full。mutex提供消费者生产者互斥,而empty和full提供缓冲区限制。
读者-作者:有多个读者,一个作者。多个读者可以同时读,但作者写时不允许读者,读者读的时候作者不能写。维持3个互斥变量,rw_mutex, mutex,read_count。rw_mutex为读者 作者互斥变量。read_count为读者个数,mutex为read_count提供互斥
哲学家就餐:解决方法是 保证一位哲学家一次必须能拿起2只筷子。因此,破坏了死锁的请求等待条件。
进程同步的方法参考博客:
https://blog.csdn.net/cs_hnu_scw/article/details/80204038
https://blog.csdn.net/zxx901221/article/details/83006453
https://www.cnblogs.com/sonic4x/archive/2011/07/05/2098036.html

7.线程池的原理及作用?
线程池的主要思想:在进程开始时创建一定数量的线程,并加到池中等待工作,当服务器收到请求时,便会唤醒池内的一个线程(如果有可用线程),并将需要服务的请求传递给它。一旦线程完成了任务,便会返回到池子中等待工作。如果池内没有可用线程,那么服务器会一直等待,一直到有空线程为止。
线程池的作用:用现有线程服务请求比等待创建一个线程更快。线程池限制了任何时候可用线程的数量。将要执行任务从创建任务中分离出来。
假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
一个线程池包括以下四个基本组成部分:
1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了

8.虚拟内存和物理内存?如何理解段页式存储管理?
虚拟内存的基本思想是将用户逻辑内存与物理内存分开。每个进程都有独立的逻辑地址空间,每个进程都有一致的地址空间,每个进程的地址空间不会被其他进程破坏。从进程来看,逻辑上貌似有很多内存空间,其中一部分对应物理内存上的一块,还有些对应没加载到内存的磁盘上。虚拟内存实际上比物理内存大,当访问虚拟内存时,会通过mmu去计算实际的物理地址,如果虚拟内存的页不存在于物理内存中,会产生缺页中断,如果内存已满,会根据调页算法换出新的内存。
段页式存储管理:程序员通常愿意讲内存看作一组不同长度的段,这些段之间并没有一定的顺序,但是用段分配内存会造成内存的大量外部碎片和紧缩。物理内存的使用一般是用分页的方式,一页的大小一般为4k,这样避免了外部碎片,但是会导致内部碎片。因此,在虚拟地址上使用分段管理,在物理地址上使用分页管理。每个进程使用一个段表和一些页表,并且每个进程段使用一个页表。首先逻辑地址通过段表获得虚拟地址,虚拟地址再通过页表获得实际的物理地址。在段页式系统中,用户的地址空间被程序员划分成很多段。每个段依次划分为许多固定大小的页,页的长度等于内存中页框的大小。段页式系统中的地址转换图见陈向群译254页。
https://www.cnblogs.com/qionglouyuyu/p/4175484.html
https://blog.csdn.net/qq_30137611/article/details/66478426

9.转换检测缓冲区。
原则上,每个虚拟内存访问会引起2次物理内存访问,一次取相应的页表项,一次去需要的数据。转换检测缓冲区中存放着最近用过的页表项,则省去了一次物理内存访问。给定一个虚拟地址,处理器首先检测TLB,如果需要的页表在TLB中,则检索页框号形成物理地址。如果TLB未命中,则处理器用页号检索进程页表,并检查相应的页表项。如果‘存在位’为1,该页在内存中,处理器从页表项中检索页框号形成物理地址。处理器同时更新TLB,包含这个新的页表项。最后如果该页不在内存中,这是将产生一次缺页故障中断,这是离开硬件作用范围,调用操作系统,操作系统负责装入所需要的页,并更新页表。TLB中存放的页表项一般为64-1024个。详细流程见陈向群译249页。

10.了解的页面置换算法有几种?详述其中一种?
当内存中的所有页框都被占据,并且需要读取一个新页以处理缺页中断的时候,页面置换决定当前在内存中的那个页被置换。所有策略的目的都是移除最近最不可能访问的页。由于局部性的原理,最近的访问历史和最近将要访问的模式有很大的相关性,大多数策略都基于过去的行为来预测将来的行为。在分析各种算法前,需要注意的是关于置换策略的一个约束:内存中的某些页框可能是被锁定的,如果一个页框被锁定时,当前保存在该页框中的页是不能够被置换的,大部分操作系统内核和重要的控制结构就保存在锁定的页框中。
页面置换的几种基本算法有
1)最佳(OPT):OPT算法选择置换下次访问距离当前时间最长的那页,该算法可以导致最少的缺页中断。但是需要知道将来的页面访问,这显然是不可能的,但是其可以作为衡量其他算法的标准。
2)先进先出(FIFO):先置换进来的页会被先置换出去。该算法隐藏的逻辑是:置换驻留在内存中时间最长的页,这个推断往往是错误的。
3)最近最少使用(Least Recently used,LRU):LRU算法置换内存中上次使用距当前最远的页,根据局部性原理,这也是最近最不可能访问到的页。LRU算法可以通过添加时间戳或则栈来准确实现,但是实现难度大,开销大。
4)时钟算法(clock algorithm):时钟算法是LRU和FIFO算法的折中实现。时钟算法又叫二次机会算法。时钟算法的升级可以通过增加使用的位数,使时钟算法更为有效(最近未被访问+最近未被修改)。时钟算法同样可以通过快慢指针来实现,快指针用来定期清除标志位,慢指针用来淘汰页。
5)页面缓冲。页面缓冲使用FIFO算法,为了提高性能,被置换出去的页不是被丢弃,而是被分配到以下2个表之一:如果未被修改,则分配到空闲链表,如果修改了,则分配到页链表。保留一个空闲帧池,并且记住那些页面在那些帧内。因为在帧被写到磁盘后的内容并未被修改,所以当帧被重用之前,如果再次需要,那么旧的页面可以从帧池中直接取出并使用。

11.了解的磁盘调度算法有几种?详述其中几种?
1)FCFS 顺序处理磁盘队列中的项目,简单公平
2)SSTF 最短寻道时间优先。SSTF选择最接近磁头位置的待处理请求。SSTF本质上是一种最短作业优先(SJF)调度。但是SSTF会造成饥饿
3)SCAN 扫面算法又称电梯算法。磁头的行为就像大楼里面的电梯,先处理所有向上的请求,再处理相反方向的请求。
4)C-SCAN调度 循环扫面算法。是SCAN的一个变种,以提供更加均匀的等待时间。不同于SCAN的是,当磁头到达另外一端时,他立即放回到磁盘的开头,而并不处理任何回程上的请求。
5)LOOK调度 SCAN和C-SCAN调度将磁头在磁盘整个宽度内移动磁臂。磁臂只需要移动到一个方向的最远请求为止。C-LOOK调度同样是C-SCAN调度的一种改进。
SSTF是最常见的磁盘调度算法,但是对于磁盘负荷较大的系统,SCAN,C-SCAN表现的更好,应为不会造成饥饿问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值