操作系统面试题

名词说明

文件描述符

是内核创建的索引,用于管理被进程打开的文件。

CPU上下文(寄存器)

CPU寄存器和程序计数器。
CPU 寄存器是 CPU 内置的容量小、但速度极快的内存。
程序计数器则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。

进程

名词解释

进程描述符
用于记录进程的状态、栈地址空间、内存地址空间、文件系统、打开的文件、信号量等。

什么是进程

正在执行的程序,包括程序、数据、程序控制块(PCB)。

每个进程都有一个进程描述符,记录以下重要信息:进程标识符、进程当前状态、栈地址空间、内存地址空间、文件系统、打开的文件、信号量等。

进程,线程,协程

进程是正在执行的程序,进程下可以开多个线程,可以减小并发执行时候的时空开销。

进程有独立的内存,单独的地址空间,而进程下的多个线程可以共享本进程的资源如内存、I/O、cpu等。

进程是资源分配的最小单元,线程是CPU调度的最小单位。

协程是小型的线程,可以用代码控制;线程由内核调度。

进程同步方式

临界区
任何时候最多只有一个进程可以进入临界区。

信号量
数据结构是一个值和一个指针,指针指向等待该信号量的下一个进程

值大于0大于0时,表示当前可用资源的数量;
值小于0时,其绝对值表示等待使用该资源的进程个数。

P操作,自减操作:
信号量为0时进入阻塞;否则信号量减一,开始使用资源
V操作,自增操作:
如果当前信号量小于0就唤醒一个进程,否则信号量直接加1

PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。

自旋锁
进程申请的资源被调用,这个进程会一直循环检查这个锁是否被释放。会造成两个问题:
死锁
过多占用CPU资源

进程之间通信的方式

匿名管道和命名管道
管道的数据流向是单向的
比如linux命令里面的"|"就是把一个进程的输出传输到另外一个进程。
一个进程往管道输入数据,则会阻塞等待别的进程从管道读取数据。

匿名管道:只能在有亲缘关系的进程间通信;只存在于内存,无法在文件系统中查看
命名管道:可以在不同网络的不同主机下的进程间通信;算是特殊的文件,存在于文件系统中,进程使用完命名管道后如果不删除,该管道会一直存在

应用
例如linux查找进程的指令ps -ef | grep tomcat

ps -ef是查看进程命令,grep tomcat 就是在命令1ps -ef 之后过滤,看进程描述为tomcat的进程。一句话概括就是:查看进程名为tomcat的进程信息

消息队列
消息队列是消息的链表。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

包括Posix和和SystemV队列。二者区别是:

  • POSIX消息队列的读操作总是返回消息队列中优先级最高的最早消息,而对于System V消息队列可以返回任意指定优先级(通过消息类型)的消息
  • 当向一个空消息队列中写入一个消息时,POSIX消息队列允许产生一个信号或启动一个线程,System V消息队列不提供类似的机制。

消息队列和管道的区别

  1. 进程向消息队列发送信息时,不需要某个进程等待该队列的消息;
  2. 管道和FIFO随进程持续,管道和FIFO关闭后,里面的数据会丢失;消息队列随内核持续,一个进程写入数据并终止后,另外一个进程可以之后再打开这个消息队列来读取消息。

信号量+共享内存
实现方式:把两个进程的逻辑地址(虚拟内存空间)通过页表映射到相同的物理地址。

信号量:本质就是一个计数器,用来实现进程之间的互斥与同步。例如信号量的初始值是 1,然后 a 进程来访问内存1的时候,我们就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。所以说,信号量也是进程之间的一种通信方式。

应用场景:

  • 生产者-消费者模式的进程:比如网络服务里面处理接收数据和处理数据的进程可以通过共享内存来通信
  • 文件读共享:多个进程都需要读取同一个配置文件,可以把这个文件的数据加载到内存然后在进程间共享就可以了

信号
信号和信号量不是同一个概念。信号量用于控制不同进程同步地访问同一资源。
信号是进程间通信机制中唯一的异步通信机制。比如control+c中断某个程序的运行。

socket

RPC

效率
共享内存是最快的。(因为共享内存区中的单个数据副本对于共享该内存的所有线程或进程都是可用的)

进程有哪几种状态

就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
阻塞状态: 进程等待某种条件,在条件满足之前无法执行

进程调度的策略有哪几种?

调度策略决策模式开销对进程影响
FCFS(先来先服务)非抢占最小对短时间进程不利
有利于CPU繁忙型进程,不利于I/O繁忙型进程
轮转抢占:运行完一个时间片后,即使进程没有处理完也会被挂起或阻塞最小公平
SPN(最短进程优先shortest process next)非抢占较高对长时间进程不利
SRT(最短剩余时间shortest remaining time)抢占(在到达前)较高对长时间进程不利
HRRN(最高响应比优先)非抢占较高
优先级调度算法非抢占
多级反馈队列调度算法抢占短作业优先,周转时间短,长作业也不会得不到处理

响应比:周转时间/实际服务时间
SPN:选择总运行时间最短的来运行
SRT:在SPN的基础上增加了抢占机制,总是选择预期剩余时间最短的进程处理。

多级优先反馈队列算法:最好的调度算法
设置多个就绪队列,每个就绪队列优先级从高到低,每个就绪队列时间片逐渐提高;
新进程先放到最高级队列的末尾;
处理机优先处理最高队列,按FCFS进行,每个进程处理一个时间片,处理一个时间片后如果该进程没有结束就把该进程放到第二队列;

什么是守护进程

后台自动运行的进程,一般系统启动时就开始运行,一直运行到系统关机。
守护进程一般以d结尾,比如日志系统进程syslogd,mysqld
一般以root身份运行

一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。

孤儿进程和僵尸进程有什么区别?

孤儿进程:父进程退出,被init进程收养的进程

僵尸进程:子进程退出后进程描述符没有释放,等父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。这种情况下子进程仍然保存在系统中,ps状态显示为z。

僵尸进程的危害:系统所能使用的进程号是有限的,如果产生大量僵尸进程,可能会因为没有可用的进程号而导致系统不能产生新的进程。
如果要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。

线程

线程同步的方式

临界区
控制多线程的串行化来访问公共资源或一段代码,速度快

互斥量
某个时间点下只有一个进程的一个线程可以访问互斥对象,可以实现不同进程下不同线程的同步,创建时需要资源更多

事件
一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A可以通知线程B何时更新用户数据。

信号量
限制可以访问某共享资源的线程和进程数目,本质是个计数器

多线程的锁有哪些

互斥锁
用于保护临界区,使线程串行化地访问数据

自旋锁
自旋锁和互斥锁的区别:线程申请自旋锁时不会被挂起,而是出于忙等状态。

同一进程下的不同线程可以共享哪些资源

进程的当前目录、进程的代码段、进程的文件描述符
内存、I/O、cpu等


内存

分页和分段有什么区别?

划分的单位不同
页是物理单位,可以提高内幕才能的利用率;段是逻辑单位,是为程序代码设定的。

大小和维数不同
页的大小由系统决定,一维地址空间(分页大小是固定的,可以根据分页地址算出页码和页内地址);段大小不固定,二维地址空间(段大小不固定,需要提供段号和段内偏移量才能确定位置)

实存?虚拟内存?

实存:CPU的地址线可以直接寻址的内存大小。

虚拟内存:给每个进程分配独立的地址空间,真正需要用到数据的时候再通过调入和置换物理内存和虚拟内存的内存页来实现数据访问。

  • 对于32位系统来说,每个进程都有4GB的虚拟内存
  • 程序只能使用虚拟内存地址,无法直接访问物理内存的地址
  • 虚存到实存的映射由操作系统动态维护

虚拟内存原因
物理内存是有限的,如果程序运行的需求大于物理内存需要,通过置换内存页也扩大逻辑内存;
实现方式
进程的数据放到逻辑内存,程序的运行过程中,把部分代码、数据放到物理内存来使用。每次访问数据的时候会先判断逻辑地址对应的数据是否在实存里,如果在实存里就直接通过页表访问;如果不在实存里就通过调度算法吸先把数据放到物理内存。

页表:对虚拟内存和物理内存分页,通过页表(page table)来映射虚拟内存的页(page)和物理内存的页帧(page frame)。虚拟内存的页数量大于实际内存的页帧数量,而虚拟内存的页和物理内存的页帧是一一对应的关系,所以系统会找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。

虚存的优势

  • 可以使用小内存来运行比较大的程序
  • 允许更多进程的并发
  • 对进程来说可用的内存空间更大

页面置换算法

进程运行过程中如果出现缺页中断,内存又没有剩余空间的话,需要通过页面置换算法将内存页送到磁盘的对换区。

FIFO
换出最先进入内存的页

最佳置换算法OPT
换出以后不再使用或长时间不使用的内存页,只是一种理论算法

最近最久未使用算法LRU
为每个页面设置一个访问字段,记录这个页面上次访问的时间,需要置换页的时候置换出上次访问时间最久远的。

实现方式1:计时器
系统给每一页添加计时器,保存最后一次的访问时间

实现方式2:双向链表
维护一个链表,把最近使用的页维持在表头。

最近未使用置换算法NRU
LRU算法相对比较耗时
NRU算法把所有页通过指针连接成一个循环队列,每次页面被访问的时候把访问位设为1
需要置换出页的时候,可以检查这个页的访问位,如果是0就淘汰这个页,如果是1就置0,然后检查下一页,直到访问到0的访问位页。

NRU还有一个好处是,不仅可以淘汰最近未使用的页,还可以尽量淘汰在内存中没有被修改的页,来避免写盘。


什么是死锁?死锁产生的条件?

死锁:多个进程进入无限期的阻塞状态,等待其他进程释放资源来给自己使用

产生死锁条件(4个缺一不可):

  • 互斥条件:一个资源一次只能被一个进程使用
  • 请求与保持条件:进程因为请求其他资源处于阻塞状态,但是它又不放开自己现有的资源
  • 不剥夺条件:进程获得的资源在没有使用完之前,不能强行剥夺
  • 环路条件:多个进程相互形成了请求资源

处理死锁的策略

预防策略
一种方法是保证每个进程在任何时刻只能占用一个资源,如果要请求另一个资源,必须先释放第一个资源;
要求进程请求资源时,先暂时释放其当前拥有的所有资源,再尝试一次获取所需的全部资源。

线程启动拒绝:如果一个线程的请求会引发死锁,则不允许其启动。
资源分配拒绝:如果一个线程增加的资源请求会导致死锁,则不允许此申请。

缺点:资源利用利用率低

死锁避免策略
使用银行家算法和安全性算法。

银行家算法:
假设有m类资源,n个进程。创建长度为m的可用资源向量,再创建进程资源使用相关的矩阵。
每次先预分配给不同的进程不同的资源,使用安全性算法来判定这样分配资源是否会让系统处于不安全状态,如果系统可以处于安全状态就执行,如果不能处于安全状态,就从进程集合里面找到可以单独执行再释放资源的进程,将资源给它,再循环判定系统这样分配下去能不能处于安全状态。

缺点:
资源分配比较保守,分配资源的时候很消耗计算资源

死锁检查和死锁处理
周期性检查死锁,或发现系统性能下降的时候检查死锁。
通过资源分配图的化简来判定是否处于死锁状态。

如果系统当前处于死锁状态,使用如下方式来处理:

  • 取消所有相关的线程或进程
  • 按照最小代价原则逐个取消直至死锁结束

死锁综合处理
每种死锁处理方式都有自己的优缺点,可以不同场景使用不同的处理策略。

作业资源(打印机、文件IO):使用死锁避免策略,因为资源和进程的数据相对比较对等
内存资源:剥夺资源的方式(资源状态容易保存和恢复)

磁盘

有哪些磁盘调度算法?

FIFO
最短寻道时间优先
优先响应与当前磁头所在磁道最近的请求
平均寻道时间段,但是容易出现饥饿现象

电梯算法
磁头的读写总是保持一个方向,直到该方向上没有请求为止;解决了最短寻道的饥饿现象

循环扫描
电梯算法有个问题,假设磁头由内向外移动,这个时候有个请求刚好出现在磁头的内侧,则这个请求需要等到磁头从里向外再从外向里移动回来,请求处理时间太长;循环扫描就是磁头一直从里向外扫或者从外向里扫,可以解决电梯算法的这个问题。

其他

处理机和CPU有什么区别

处理机包括CPU、主存储器、输入-输出接口。处理机加接外围设备就构成完整的计算机系统

CPU是一块超大规模的集成电路,运算中心和控制中心

什么是缓冲区溢出?有什么危害?原因是什么?

计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

危害:
程序崩溃,拒绝服务
跳转并执行恶意代码

原因:
一般是程序缺陷
没有检查用户输入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值