共计 8056 个字符,预计需要花费 21 分钟才能阅读完成。
本文收录于《面试小抄》系列,Github 地址(可下载 pdf):https://github.com/cosen1024/… 国内 Gitee(可下载 pdf):https://gitee.com/cosen1024/J…
操作系统常见面试题来啦~
先来看本期的目录:
1. 过程和线程的区别?
- 调度:过程是资源管理的根本单位,线程是程序执行的根本单位。
- 切换:线程上下文切换比过程上下文切换要快得多。
- 领有资源:过程是领有资源的一个独立单位,线程不领有系统资源,然而能够拜访隶属于过程的资源。
- 零碎开销:创立或撤销过程时,零碎都要为之调配或回收系统资源,如内存空间,I/ O 设施等,OS 所付出的开销显著大于在创立或撤销线程时的开销,过程切换的开销也远大于线程切换的开销。
2. 协程与线程的区别?
- 线程和过程都是同步机制,而协程是异步机制。
- 线程是抢占式,而协程是非抢占式的。须要用户开释使用权切换到其余协程,因而同一时间其实只有一个协程领有运行权,相当于单线程的能力。
- 一个线程能够有多个协程,一个过程也能够有多个协程。
- 协程不被操作系统内核治理,而齐全是由程序控制。线程是被宰割的 CPU 资源,协程是组织好的代码流程,线程是协程的资源。但协程不会间接应用线程,协程间接利用的是执行器关联任意线程或线程池。
- 协程能保留上一次调用时的状态。
3. 并发和并行有什么区别?
并发就是在一段时间内,多个工作都会被解决;但在某一时刻,只有一个工作在执行。单核处理器能够做到并发。比方有两个过程 A
和B
,A
运行一个工夫片之后,切换到 B
,B
运行一个工夫片之后又切换到A
。因为切换速度足够快,所以宏观上体现为在一段时间内能同时运行多个程序。
并行就是在同一时刻,有多个工作在执行。这个须要多核处理器能力实现,在宏观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个过程同时进行。
4. 过程与线程的切换流程?
过程切换分两步:
1、切换 页表 以应用新的地址空间,一旦去切换上下文,处理器中所有曾经缓存的内存地址一瞬间都作废了。
2、切换内核栈和硬件上下文。
对于 linux 来说,线程和过程的最大区别就在于地址空间,对于线程切换,第 1 步是不须要做的,第 2 步是过程和线程切换都要做的。
因为每个过程都有本人的虚拟地址空间,而线程是共享所在过程的虚拟地址空间的,因而同一个过程中的线程进行线程切换时不波及虚拟地址空间的转换。
5. 为什么虚拟地址空间切换会比拟耗时?
过程都有本人的虚拟地址空间,把虚拟地址转换为物理地址须要查找页表,页表查找是一个很慢的过程,因而通常应用 Cache 来缓存罕用的地址映射,这样能够减速页表查找,这个 Cache 就是 TLB(translation Lookaside Buffer,TLB 实质上就是一个 Cache,是用来减速页表查找的)。
因为每个过程都有本人的虚拟地址空间,那么显然每个过程都有本人的页表,那么 当过程切换后页表也要进行切换,页表切换后 TLB 就生效了,Cache 生效导致命中率升高,那么虚拟地址转换为物理地址就会变慢,体现进去的就是程序运行会变慢,而线程切换则不会导致 TLB 生效,因为线程无需切换地址空间,因而咱们通常说线程切换要比拟过程切换块,起因就在这里。
6. 过程间通信形式有哪些?
管道:管道这种通信形式有两种限度,一是半双工的通信,数据只能单向流动,二是只能在具备亲缘关系的过程间应用。过程的亲缘关系通常是指父子过程关系。
管道能够分为两类:匿名管道和命名管道。匿名管道是单向的,只能在有亲缘关系的过程间通信;命名管道以磁盘文件的形式存在,能够实现本机任意两个过程通信。
信号:信号是一种比较复杂的通信形式,信号能够在任何时候发给某一过程,而无需晓得该过程的状态。
Linux 零碎中罕用信号:
(1)SIGHUP:用户从终端登记,所有已启动过程都将收到该过程。零碎缺省状态下对该信号的解决是终止过程。(2)SIGINT:程序终止信号。程序运行过程中,按
Ctrl+C
键将产生该信号。(3)SIGQUIT:程序退出信号。程序运行过程中,按
Ctrl+\\
键将产生该信号。(4)SIGBUS 和 SIGSEGV:过程拜访非法地址。
(5)SIGFPE:运算中呈现致命谬误,如除零操作、数据溢出等。
(6)SIGKILL:用户终止过程执行信号。shell 下执行
kill -9
发送该信号。(7)SIGTERM:完结过程信号。shell 下执行
kill 过程 pid
发送该信号。(8)SIGALRM:定时器信号。
(9)SIGCLD:子过程退出信号。如果其父过程没有疏忽该信号也没有解决该信号,则子过程退出后将造成僵尸过程。
- 信号量:信号量是一个 计数器 ,能够用来管制多个过程对共享资源的拜访。它常作为一种 锁机制,避免某过程正在访问共享资源时,其余过程也拜访该资源。因而,次要作为过程间以及同一过程内不同线程之间的同步伎俩。
- 音讯队列:音讯队列是音讯的链接表,包含 Posix 音讯队列和 System V 音讯队列。有足够权限的过程能够向队列中增加音讯,被赋予读权限的过程则能够读走队列中的音讯。音讯队列克服了信号承载信息量少,管道只能承载无格局字节流以及缓冲区大小受限等毛病。
- 共享内存:共享内存就是映射一段能被其余过程所拜访的内存,这段共享内存由一个过程创立,但多个过程都能够拜访。共享内存是最快的 IPC 形式,它是针对其余过程间通信形式运行效率低而专门设计的。它往往与其余通信机制,如信号量,配合应用,来实现过程间的同步和通信。
- Socket:与其余通信机制不同的是,它可用于不同机器间的过程通信。
优缺点:
- 管道:速度慢,容量无限;
- Socket:任何过程间都能通信,但速度慢;
- 音讯队列:容量受到零碎限度,且要留神第一次读的时候,要思考上一次没有读完数据的问题;
- 信号量:不能传递简单音讯,只能用来同步;
- 共享内存区:可能很容易管制容量,速度快,但要放弃同步,比方一个过程在写的时候,另一个过程要留神读写的问题,相当于线程中的线程平安,当然,共享内存区同样能够用作线程间通信,不过没这个必要,线程间原本就曾经共享了同一过程内的一块内存。
7. 过程间同步的形式有哪些?
1、临界区:通过对多线程的串行化来拜访公共资源或一段代码,速度快,适宜控制数据拜访。
长处:保障在某一时刻只有一个线程能拜访数据的简便方法。
毛病:尽管临界区同步速度很快,但却只能用来同步本过程内的线程,而不可用来同步多个过程中的线程。
2、互斥量:为协调独特对一个共享资源的独自拜访而设计的。互斥量跟临界区很类似,比临界区简单,互斥对象只有一个,只有领有互斥对象的线程才具备拜访资源的权限。
长处:应用互斥不仅仅可能在同一应用程序不同线程中实现资源的平安共享,而且能够在不同应用程序的线程之间实现对资源的平安共享。
毛病:
- 互斥量是能够命名的,也就是说它能够逾越过程应用,所以创立互斥量须要的资源更多,所以如果只为了在过程外部是用的话应用临界区会带来速度上的劣势并可能缩小资源占用量。
- 通过互斥量能够指定资源被独占的形式应用,但如果有上面一种状况通过互斥量就无奈解决,比方当初一位用户购买了一份三个并发拜访许可的数据库系统,能够依据用户购买的拜访许可数量来决定有多少个线程 / 过程能同时进行数据库操作,这时候如果利用互斥量就没有方法实现这个要求,信号量对象能够说是一种资源计数器。
3、信号量:为管制一个具备无限数量用户资源而设计。它容许多个线程在同一时刻拜访同一资源,然而须要限度在同一时刻拜访此资源的最大线程数目。互斥量是信号量的一种非凡状况,当信号量的最大资源数 = 1 就是互斥量了。
长处:实用于对 Socket(套接字)程序中线程的同步。
毛病:
- 信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点;
- 信号量机制功能强大,但应用时对信号量的操作扩散,而且难以管制,读写和保护都很艰难,减轻了程序员的编码累赘;
- 外围操作 P - V 扩散在各用户程序的代码中,不易控制和治理,一旦谬误,后果严重,且不易发现和纠正。
4、事件:用来告诉线程有一些事件已产生,从而启动后继工作的开始。
长处:事件对象通过告诉操作的形式来放弃线程的同步,并且能够实现不同过程中的线程同步操作。
8. 线程同步的形式有哪些?
1、临界区:当多个线程拜访一个独占性共享资源时,能够应用临界区对象。领有临界区的线程能够拜访被爱护起来的资源或代码段,其余线程若想拜访,则被挂起,直到领有临界区的线程放弃临界区为止,以此达到用原子形式操 作共享资源的目标。
2、事件:事件机制,则容许一个线程在解决完一个工作后,被动唤醒另外一个线程执行工作。
3、互斥量:互斥对象和临界区对象十分类似,只是其容许在过程间应用,而临界区只限度与同一过程的各个线程之间应用,然而更节俭资源,更有效率。
4、信号量:当须要一个计数器来限度能够应用某共享资源的线程数目时,能够应用“信号量”对象。
区别:
- 互斥量与临界区的作用十分类似,但互斥量是能够命名的,也就是说互斥量能够逾越过程应用,但创立互斥量须要的资源更多,所以如果只为了在过程外部是用的话应用临界区会带来速度上的劣势并可能缩小资源占用量。因为互斥量是跨过程的互斥量一旦被创立,就能够通过名字关上它。
- 互斥量,信号量,事件都能够被逾越过程应用来进行同步数据操作。
9. 线程的分类?
从线程的运行空间来说,分为用户级线程(user-level thread, ULT)和内核级线程(kernel-level, KLT)
内核级线程:这类线程依赖于内核,又称为内核反对的线程或轻量级过程。无论是在用户程序中的线程还是零碎过程中的线程,它们的创立、撤销和切换都由内核实现。比方英特尔 i5-8250U 是 4 核 8 线程,这里的线程就是内核级线程
用户级线程 :它仅存在于用户级中,这种线程是 不依赖于操作系统外围 的。利用过程利用 线程库来实现其创立和治理 ,速度比拟快, 操作系统内核无奈感知用户级线程的存在。
10. 什么是临界区,如何解决抵触?
每个过程中拜访临界资源的那段程序称为临界区,一次仅容许一个过程应用的资源称为临界资源。
解决抵触的方法:
- 如果有若干过程要求进入闲暇的临界区,一次仅容许一个过程进入,如已有过程进入本人的临界区,则其它所有试图进入临界区的过程必须期待;
- 进入临界区的过程要在 无限工夫内退出。
- 如果过程不能进入本人的临界区,则应 让出 CPU,防止过程呈现“忙等”景象。
11. 什么是死锁?死锁产生的条件?
什么是死锁:
在两个或者多个并发过程中,如果每个过程持有某种资源而又期待其它过程开释它或它们当初放弃着的资源,在未扭转这种状态之前都不能向前推动,称这一组过程产生了死锁。艰深的讲就是两个或多个过程无限期的阻塞、互相期待的一种状态。
死锁产生的四个必要条件:(有一个条件不成立,则不会产生死锁)
- 互斥条件:一个资源一次只能被一个过程应用
- 申请与放弃条件:一个过程因申请资源而阻塞时,对已取得资源放弃不放
- 不剥夺条件:过程取得的资源,在未齐全应用完之前,不能强行剥夺
- 循环期待条件:若干过程之间造成一种头尾相接的环形期待资源关系
如何解决死锁问题:
- 疏忽该问题。例如鸵鸟算法,该算法能够利用在极少产生死锁的的状况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟感觉看不到危险也就没危险了吧。跟自欺欺人有点像。
- 检测死锁并且复原。
- 认真地对资源进行动态分配,以 防止死锁。
- 通过破除死锁四个必要条件之一,来避免死锁产生。
12. 过程调度策略有哪几种?
- 先来先服务 :非抢占式的调度算法,依照申请的程序进行调度。有利于长作业,但不利于短作业,因为短作业必须始终期待后面的长作业执行结束能力执行,而长作业又须要执行很长时间,造成了短作业等待时间过长。另外,对
I/O
密集型过程也不利,因为这种过程每次进行I/O
操作之后又得从新排队。 - 短作业优先:非抢占式的调度算法,按预计运行工夫最短的程序进行调度。长作业有可能会饿死,处于始终期待短作业执行结束的状态。因为如果始终有短作业到来,那么长作业永远得不到调度。
- 最短剩余时间优先:最短作业优先的抢占式版本,按残余运行工夫的程序进行调度。当一个新的作业达到时,其整个运行工夫与以后过程的剩余时间作比拟。如果新的过程须要的工夫更少,则挂起以后过程,运行新的过程。否则新的过程期待。
工夫片轮转:将所有就绪过程按
FCFS
的准则排成一个队列,每次调度时,把CPU
工夫调配给队首过程,该过程能够执行一个工夫片。当工夫片用完时,由计时器收回时钟中断,调度程序便进行该过程的执行,并将它送往就绪队列的开端,同时持续把CPU
工夫调配给队首的过程。工夫片轮转算法的效率和工夫片的大小有很大关系:因为过程切换都要保留过程的信息并且载入新过程的信息,如果工夫片太小,会导致过程切换得太频繁,在过程切换上就会花过多工夫。而如果工夫片过长,那么实时性就不能失去保障。
- 优先级调度:为每个过程调配一个优先级,按优先级进行调度。为了避免低优先级的过程永远等不到调度,能够随着工夫的推移减少期待过程的优先级。
13. 过程有哪些状态?
过程一共有 5
种状态,别离是创立、就绪、运行(执行)、终止、阻塞。
- 运行状态就是过程正在
CPU
上运行。在单处理机环境下,每一时刻最多只有一个过程处于运行状态。 - 就绪状态就是说过程已处于筹备运行的状态,即过程取得了除
CPU
之外的所有所需资源,一旦失去CPU
即可运行。 - 阻塞状态就是过程正在期待某一事件而暂停运行,比方期待某资源为可用或期待
I/O
实现。即便CPU
闲暇,该过程也不能运行。
运行态→阻塞态 :往往是因为期待外设,期待主存等资源分配或期待人工干预而引起的。
阻塞态→就绪态 :则是期待的条件已满足,只需调配到处理器后就能运行。
运行态→就绪态 :不是因为本身起因,而是由外界起因使运行状态的过程让出处理器,这时候就变成就绪态。例如工夫片用完,或有更高优先级的过程来抢占处理器等。
就绪态→运行态:零碎按某种策略选中就绪队列中的一个过程占用处理器,此时就变成了运行态。
14. 什么是分页?
把内存空间划分为 大小相等且固定的块 ,作为主存的根本单位。因为程序数据存储在不同的页面中,而页面又离散的散布在内存中, 因而须要一个页表来记录映射关系,以实现从页号到物理块号的映射。
拜访分页零碎中内存数据须要 两次的内存拜访 (一次是从内存中拜访页表,从中找到指定的物理块号,加上页内偏移失去理论物理地址;第二次就是依据第一次失去的物理地址拜访内存取出数据)。
15. 什么是分段?
分页是为了进步内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需要(比方数据共享,数据保护,动静链接等)。
分段内存治理当中,地址是二维的,一维是段号,二维是段内地址;其中每个段的长度是不一样的,而且每个段外部都是从 0 开始编址的。因为分段治理中,每个段外部是间断内存调配,然而段和段之间是离散调配的,因而也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。
16. 分页和分段有什区别?
- 分页对程序员是通明的,然而分段须要程序员显式划分每个段。
- 分页的地址空间是一维地址空间,分段是二维的。
- 页的大小不可变,段的大小能够动静扭转。
- 分页次要用于实现虚拟内存,从而取得更大的地址空间;分段次要是为了使程序和数据能够被划分为逻辑上独立的地址空间并且有助于共享和爱护。
17. 什么是替换空间?
操作系统把物理内存 (physical RAM) 分成一块一块的小内存,每一块内存被称为 页(page)。当内存资源有余时,Linux 把某些页的内容转移至硬盘上的一块空间上,以开释内存空间 。硬盘上的那块空间叫做 替换空间 (swap space), 而这一过程被称为替换(swapping)。 物理内存和替换空间的总容量就是虚拟内存的可用容量。
用处:
- 物理内存不足时一些不罕用的页能够被替换进来,腾给零碎。
- 程序启动时很多内存页被用来初始化,之后便不再须要,能够替换进来。
16. 页面替换算法有哪些?
在程序运行过程中,如果要拜访的页面不在内存中,就产生缺页中断从而将该页调入内存中。此时如果内存已无闲暇空间,零碎必须从内存中调出一个页面到磁盘对换区中来腾出空间。
包含以下算法:
- 最佳算法:所抉择的被换出的页面将是最长工夫内不再被拜访,通常能够保障取得最低的缺页率。这是一种实践上的算法,因为无奈晓得一个页面多长时间不再被拜访。
- 先进先出:抉择换出的页面是最先进入的页面。该算法将那些常常被拜访的页面也被换出,从而使缺页率升高。
- LRU:尽管无奈晓得未来要应用的页面状况,然而能够晓得过来应用页面的状况。
LRU
将最近最久未应用的页面换出。为了实现 LRU,须要在内存中保护一个所有页面的链表。当一个页面被拜访时,将这个页面移到链表表头。这样就能保障链表表尾的页面是最近最久未拜访的。因为每次拜访都须要更新链表,因而这种形式实现的LRU
代价很高。 - 时钟算法 :时钟算法应用环形链表将页面连接起来,再应用一个指针指向最老的页面。它将整个环形链表的每一个页面做一个标记,如果标记是
0
,那么临时就不会被替换,而后时钟算法遍历整个环,遇到标记为1
的就替换,否则将标记为0
的标记为1
。
18. 什么是缓冲区溢出?有什么危害?
缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区自身的容量,溢出的数据笼罩在非法数据上。
危害有以下两点:
- 程序解体,导致回绝额服务
- 跳转并且执行一段恶意代码
造成缓冲区溢出的次要起因是程序中没有仔细检查用户输出。
19. 什么是虚拟内存?
虚拟内存就是说,让物理内存裁减成更大的逻辑内存,从而让程序取得更多的可用内存。虚拟内存应用局部加载的技术,让一个过程或者资源的某些页面加载进内存,从而可能加载更多的过程,甚至能加载比内存大的过程,这样看起来如同内存变大了,这部分内存其实蕴含了磁盘或者硬盘,并且就叫做虚拟内存。
20. 讲一讲 IO 多路复用?
IO 多路复用是指内核一旦发现过程指定的一个或者多个 IO 条件筹备读取,它就告诉该过程。IO 多路复用实用如下场合:
- 当客户解决多个形容字时(个别是交互式输出和网络套接口),必须应用 I / O 复用。
- 当一个客户同时解决多个套接口时,而这种状况是可能的,但很少呈现。
- 如果一个 TCP 服务器既要解决监听套接口,又要解决已连贯套接口,个别也要用到 I / O 复用。
- 如果一个服务器即要解决 TCP,又要解决 UDP,个别要应用 I / O 复用。
- 如果一个服务器要解决多个服务或多个协定,个别要应用 I / O 复用。
- 与多过程和多线程技术相比,I/ O 多路复用技术的最大劣势是零碎开销小,零碎不用创立过程 / 线程,也不用保护这些过程 / 线程,从而大大减小了零碎的开销。
21. 硬链接和软链接有什么区别?
- 硬链接就是在目录下创立一个条目,记录着文件名与
inode
编号,这个inode
就是源文件的inode
。删除任意一个条目,文件还是存在,只有援用数量不为0
。然而硬链接有限度,它不能逾越文件系统,也不能对目录进行链接。 - 符号链接文件保留着源文件所在的绝对路径,在读取时会定位到源文件上,能够了解为
Windows
的快捷方式。当源文件被删除了,链接文件就打不开了。因为记录的是门路,所以能够为目录建设符号链接。
22. 中断的处理过程?
- 爱护现场:将以后执行程序的相干数据保留在寄存器中,而后入栈。
- 开中断:以便执行中断时能响应较高级别的中断请求。
- 中断解决
- 关中断:保障复原现场时不被新中断打搅
- 复原现场:从堆栈中按序取出程序数据,复原中断前的执行状态。
23. 中断和轮询有什么区别?
- 轮询:CPU 对 特定设施 轮流询问。中断:通过 特定事件 揭示 CPU。
- 轮询:效率低等待时间长,CPU 利用率不高。中断:容易脱漏问题,CPU 利用率不高。
End
更文不易,点赞激励下呗~
这里也举荐一个我收集的计算机书籍仓库,仓库目前有上百本经典 cs 电子书,看经典的书籍会更悟得深~
点此链接即可中转书单,计算机必看经典书籍(含 pdf 下载)
Github 也有相应仓库,https://github.com/cosen1024/…
欢送 star。