乐趣区

关于操作系统:操作系统面试总结

1. 过程和线程的区别是什么 ?

过程是资源分配的根本单位,线程是 CPU 调度的根本单位。过程领有独立的地址空间,线程是共享内存地址的。过程切换的开销比线程要大。

2. 过程间的通信形式有哪些?

  • 管道(Pipe):在缓存中开拓处输入和输出文件流空间,只能实用于父子过程通信。
  • 命名管道(FIFO):不同过程的管道通信,通过关上同一个 FIFO 文件进行数据传输。
  • 音讯队列(MessageQueue):寄存在内核中的音讯链表,简略高效。
  • 共享内存(SharedMemory):容许两个不相干的过程拜访同一个逻辑内存,通过映射同一段物理内存来实现,往往须要其余机制辅助,比方信号量。
  • 信号量(Semaphore):相似于一个计数器,是一个非凡变量,罕用于过程间的同步控制。
  • 套接字(Socket):可用于同一台机子的不同过程通信,也能够不同机子的不同过程通信。
  • 信号(sinal):用于告诉接管过程某个事件曾经产生。

3. 过程 / 线程的同步形式有哪些?

  • 临界区:通过对多线程的串行化来拜访公共资源或一段代码,速度快,适宜控制数据拜访。
  • 信号量:为管制一个具备无限数量用户资源而设计。它容许多个线程在同一时刻拜访同一资源,然而须要限度在同一时刻拜访此资源的最大线程数目。
  • 互斥量:协调独特对一个共享资源的独自拜访而设计的
  • 事件:通过告诉操作的形式来放弃线程的同步,还能够不便实现对多个线程的优先级比拟的操作总结下事件 Event

4. 过程的调度策略有哪些?

过程调度的次要指标是让 CPU 始终处于繁忙状态,并为所有程序提供最短的响应工夫。为了实现这一点,必须要适当的中断程序的运行以及唤起其余程序运行。以后的调度分为了两大类:

  • 领先调度:让程序按肯定的工夫去占有这些资源,工夫到了就被迫让呈现有资源,给其余的程序轮流应用。
  • 非抢占式调度:让程序顺利的实现本人的工作,再把资源腾出来给其余程序应用。

以后的调度算法也有很多,总的能够分为上面几类:

  • 先来先服务(FCFS):按先后顺序进行调度。
  • 最短作业优先:按执行工夫长度来调度。
  • 优先级调度:给每个过程定义一个优先级,每次须要过程切换时,找优先级最高的过程进行调度。
  • 循环调度(Round Robin):让程序再一个工夫片内占有 CPU 资源,工夫到了就换下一个,平等看待程序,没有特殊性。
  • 多级队列调度:将过程存储到不同的队列中,每个队列都有本人的调度算法,比方按先来先服务,优先级调度等。
  • 多级反馈队列:设置多个不同优先级的队列,动静调整过程所在的队列,如果过程应用过多的 CPU 工夫,那么它会被移到更低的优先级队列。

5. 过程的状态有哪些?

当过程开始运行时,通常会波及到 5 个状态:

  • 创立状态: 当程序启动时,须要到零碎创立过程治理块(PCB:Process Control Block)实现资源分配,进入正在创立的状态。
  • 就绪状态: 创立状态实现之后,过程曾经筹备好,此时还没被 CPU 调度到,需期待调配。
  • 运行状态: 被 CPU 调度,调配到肯定的工夫片,开始进入运行状态。
  • 阻塞状态: 正在期待某个事件实现(比方 IO 操作),当操作实现后则进入就绪状态,期待 CPU 调度进入运行状态。
  • 终止状态: 过程完结或被终止,无奈再被执行。

在过程运行期间次要是就绪、运行、阻塞状态这几种状态轮流转换。

6. 什么是僵尸过程

fork 进去的子过程在完结开释资源时,会残留着一些状态信息在 PCB 里,只有等到父过程调用 wait 或 waitpid 函数来取走这些信息,才会真正的完结。

当父过程比子过程先完结,那么此时子过程会交给 init 过程治理。当子过程完结时,即便没有原来的父过程去收走那些残留信息也没关系,因为 init 过程会接手治理。

如果子过程先完结,此时父过程还没完结,又没有调用 wait/waitpid 来取走相干信息,导致子过程的过程描述符始终残留在零碎里,那么就会始终占用着资源。当父过程也完结后,就会变为僵尸过程,此时的僵尸过程还是得交给 init 过程治理,由 init 过程对立清理。

7. 内核态和用户态区别是什么?

在内核态下,操作系统能够拜访任意数据以及进行任意操作,而用户态下是有限度的,只能拜访指定的内存。内核态相当于领有了全副权力,用户态让用户程序对系统的操作是有边界的,只能应用零碎凋谢的能力。

8. 上下文切换什么时候会产生?

当产生了程序调度的时候,势必波及到以后过程状态的保留,以及另一个行将运行的过程的状态加载。这一过程被称之为 上下文切换。过程的上下文信息是保留在 PCB,也就是过程管制块里的,保留的信息包含了 CPU 寄存器的值、过程状态和内存治理信息。

上下文切换是纯正的性能开销,因为在此过程中,操作系统不做任何有用的工作,仅仅只是为了切换而切换。所以这一块会很容易就变成瓶颈,导致咱们会常常 new 一个新的过程来进步执行效率。

9. 为什么须要内存?内存的调配形式是怎么样的?

古代计算机体系是一个为数据处理而设计的构造(冯·诺依曼体系结构),执行指令和数据会同时寄存在存储器里。这里的存储器包含了凑近 CPU 的高速缓存(cache),也包含了咱们相熟的内存条这种主存储器(RAM);当然,还有像磁盘这种便宜但速度较慢的外存储器。通过这些存储器的分工合作,使得程序具备长期记忆、疾速运算的特点。

在晚期的操作系统里,物理内存都是裸奔在 CPU 背后的,也就是程序能够间接操作物理内存。而内存的调配形式采纳的是间断调配治理,也就是用户程序将会失去一段间断的地址空间,次要有繁多间断和分区式调配形式:

  • 繁多间断调配:分为零碎区和用户区,零碎区是操作系统应用,用户区给用户程序应用。用户程序加载到内存时会一次性调配所需内存,并始终占用,直到程序完结。
  • 固定分区调配:将内存空间划分为若干个固定大小的间断区域,当程序须要分配内存时,会从一张分区阐明表中查找未应用且大小适合的区域来调配。
  • 动静分区调配:下面划分的区域大小将不再固定,是动静划分的,当程序开释后比拟容易呈现内部碎片,须要采纳 压缩技术 合并这些碎片。

10. 虚拟地址是什么?

下面这种间接拜访物理内存的形式会让程序变得很 软弱,很容易就呈现拜访抵触和内存碎片。为此,操作系统提供了一种机制,将程序要拜访的地址和实在的物理地址进行了隔离,形象出了面向程序的虚拟地址空间。

当程序运行起来后,每个程序都有属于本人的虚拟地址空间,这种虚拟地址空间的益处就在于每个程序所看到的内存地址都是对本人负责的,跟其余程序互不烦扰,不必放心抵触的问题。而且一开始并不会调配真正的物理内存,只有当 CPU 须要操作这个虚拟地址的时候,才会通过 一个内存治理单元(MMU)来映射真正的物理地址。

下面这种形象出虚拟地址的形式,使得程序看到的地址空间将不再须要和底层的物理内存地址空间一一对应,也就是说,一个程序的实在物理地址将能够是离散的,不须要始终间断的,而这更有利于物理内存的高效利用,只须要有一个相似映射关系机制即可。而这种设计次要有分段治理和分页治理。

11. 分段治理是什么的?

分段治理将程序的虚拟地址空间划分成多个段,这些段的划分根据是依据程序本身的逻辑关系来调配的,例如 main 函数的划分为一个段,库函数的划分一个段,数据划分为一个段。总之,这些段是有逻辑含意,能够由用户本人来指定段名。

为了能建设跟物理内存的映射关系,每当创立出一个段的时候,就会在一个段表里保护以后段的信息,段表里的段信息包含了以后段的索引号:段号;以后段的最大长度:段长以及以后段在物理内存里的起始地址:段基地址。

这样的话,只有虚拟地址是由段号和段内偏移量组成的话,那么就能够推算出物理内存地址了:即依据段号在段表里找到以后段基地址,段基地址加上段内偏移量就能够失去实在的物理地址了:

有下面能够看出,段地址其实是二维的,因为须要咱们给出段名(段号)以及段内偏移量来标识一个虚拟地址。

12. 分页治理是怎么样的?

分段治理尽管建设起一套映射的机制,然而它蕴含了逻辑含意,须要用户去指定段名(段号)和段内偏移量。这种治理形式太过于灵便了,如果调配某一个段的段长很大,那么就很容易产生内部内存碎片了。

为此,操作系统提供了分页治理形式,并且对用户是不可见的。它将虚拟地址空间和物理地址空间切割成了一个个固定大小的页(例如在 Linux 里页的大小为 4k),并且它们的映射关系会交由一张页表来保护。

页表里蕴含了虚拟地址页号和物理地址页号的关联关系,只有咱们的虚拟地址蕴含了页号和页偏移量,那么就能够通过页表找到物理地址页号,依据物理地址页号找到物理内存地址,再加上页偏移量,就失去物理地址了。

13. 多级页表指的是什么?

页的大小是固定的,而虚拟地址空间大小也是固定的,比方在 32 位的 Linux 零碎里,一个虚拟地址空间大小将会调配到 4G,如果按每页为 4k 计算,那么对于一个程序来讲,操作系统就要治理 100 多万个页了。如果有多个程序同时运行,那对于操作系统来讲,压力将会很大,效率也提不下来。

所以,操作系统进行了多级治理,例如,将这 100 多万个页先拆分到 1024 个页表里,每个页表治理着 1024 个页项。这样就放大了治理页数,而且很多时候程序可能也就须要 100 多 M 的地址空间,并不会真正的用上所有的地址空间,所以前面的页表也并不需要去创立出具体的页项,能够等到应用的时候再创立。

14. 段页式治理是怎么样的?

分段治理让程序的内存调配有了逻辑含意,能更好的满足用户需要,而分页治理进步了内存的利用率,缩小了内部内存碎片。因而将两者联合,也就是当初操作系统罕用的段页式内存治理了。

段页式治理会先将程序划分为多个有逻辑意义的段,比方代码段、数据段等。而后在这些段里进行了按页治理的形式。段页式治理的虚拟地址是由段号、段内页号和页内位移组成。当要依据这些信息查找物理地址时,将会经验上面三个过程:

  • 依据段号找到该段的页表起始地址
  • 依据页表起始地址找到物理页号
  • 依据物理页号找到物理内存的基地址,再联合页内位移就能够失去物理地址了。

15. 内存置换是什么?算法有哪些?

只管操作系统为内存治理进行了很多优良的设计,但对于物理内存来讲,它的下限就是固定的,比方内存条大小为 4G,那再怎么优化,也只能应用 4G 的下限。所以,一旦操作系统检测到没有足够的闲暇内存调配时,此时就须要启动“替换”机制了。将那些近期不再应用或不会再用的内存替换到硬盘上,这样就能临时的闲暇出更多的物理内存来应用了。如果有些物理内存加载进来后始终没有被批改过,那么就会间接删除,等到下次触发缺页中断,从新加载。

因而,怎么适合的去替换这些闲暇内存,也是须要用决策的,以后风行操作系统都是采纳段页式治理内存的,所以次要有三种“页面置换”算法:

  • 最佳置换算法:抉择将来长时间不被拜访的或者当前永不应用的页面进行淘汰,这种是一种理想化算法,须要去预估应用工夫,所以很难剖析失去。
  • 先进先出页面置换算法:最先进入内存的页面最先被淘汰,性能较差,因为有些频繁应用的页面会被频繁替换进来,影响性能。
  • 最近起码应用置换算法:抉择最近且起码应用的页面进行淘汰,性能较好,合乎局部性原理,Linux 零碎采纳的就是这种算法

如果页面替换频繁,那么操作系统势必要花更多的工夫来执行这些动作,这在操作系统里称之为抖动平稳,当产生这种景象的时候,CPU 的利用率将会很低,因为内存不能及时反馈获取。

16. 死锁是什么?怎么防止?

死锁是因为多个过程并发抢夺系统资源而相互期待的景象。死锁要满足四个必要条件才会产生,别离是:

  • 互斥:某种资源一次只容许一个过程拜访,即该资源一旦调配给某个过程,其余过程就不能再拜访,直到该过程拜访完结。
  • 占有且期待:一个过程自身占有资源(一种或多种),同时还有资源未失去满足,正在期待其余过程开释该资源。
  • 不可抢占:他人曾经占有了某项资源,你不能因为本人也须要该资源,就去把他人的资源抢过来。
  • 循环期待:存在一个过程链,使得每个过程都占有下一个过程所需的至多一种资源。

解决死锁有四种办法:

  • 死锁预防:通过确保死锁的一个必要条件不会满足,保障不会产生死锁
  • 死锁检测:容许死锁的产生,然而能够通过零碎设置的检测构造及时的检测出死锁的产生,采取一些措施,将死锁革除掉
  • 死锁防止:在资源分配过程中,应用某种办法防止零碎进入不平安的状态,从而防止产生死锁
  • 死锁解除:与死锁检测相配套的一种措施。当检测到零碎中已产生死锁,需将过程从死锁状态中解脱进去。

罕用办法:撤销或挂起一些过程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的过程。

17. 同步 IO、异步 IO、IO 多路复用、select、poll、epoll 的相干概念?

操作硬盘上的文件时,先将文件用一个叫文件描述符来示意,而后将文件中的数据加载到内核的缓冲区,再将缓冲区的数据映射到用户空间,通知用户能够通过文件描述符来操作某个文件了。

缓冲区的文件数据映射到用户空间这个动作能够让用户过程本人来,即站在用户过程来讲,读写操作都是由用户过程来执行的,这个叫 同步 IO。也能够将映射的过程交由操作系统的内核来实现,即所谓的 异步 IO

其中,同步 IO 里,又能够分为阻塞和不阻塞 IO。所谓的阻塞 IO 即用户过程在询问文件数据是否加载到缓冲区时,能够阻塞的期待,直到缓冲区的数据都加载结束;不阻塞 IO 即用户过程通过一直的询问操作系统,来获取加载后果。

在不阻塞 IO 模式里,如果要监控的文件形容比拟多的话。能够应用 select 模型。select 将监控多个文件描述符,再将后果对立的返回给处理程序。

因为 select 能监督的文件描述符无限,个别为 1024 个,为了解决这个瓶颈,前面实现了 poll 这种构造来监控文件描述符的数据达到状况。即 poll 没有最大数量的限度。

select 和 poll 实质上都须要遍历的去操作文件描述符,效率不高。为此, linux 前面有设计了 epoll 模型,通过在内核里应用一个红黑树的构造来治理注册进来的文件描述符,同时应用了一个就绪链表保护了就绪事件,一旦基于某个文件描述符就绪时,内核会采纳相似 callback 的回调机制,将事件告诉给用户过程。

18. 软连贯和硬链接区别?

创立一个文件时,会有一个 inode 值指向这个文件的具体存储信息,能够了解为这个文件的指针。每当创立硬链接时,就会将文件的援用计数 + 1,直到没有援用时,那么这个文件就会被删除。硬链接不能够在不同文件系统建设链接,而且只有超级用户才能够为目录创立硬链接。

软链接则没有文件系统的限度,它和原来的文件具备不一样的 node 值,并且 inode 里保留了原来文件绝对路径。因而,在删除了原来文件后,软链接会拜访有效的。


感兴趣的敌人能够搜一搜公众号「阅新技术」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。

退出移动版