version:1.0
文章目录
- 操作系统
- 进程管理
- 🙎♂️面试官:进程和线程的区别?
- 🙎♂️面试官:进程有哪几种状态?
- 🙎♂️面试官:进程间的通信方式?
- 🙎♂️面试官:线程间的同步的方式?
- 🙎♂️面试官:什么是PCB?
- 🙎♂️面试官:进程的调度算法?
- 🙎♂️面试官:什么是死锁?死锁的四个必要条件,解决死锁的方法
- 内存管理
- 🙎♂️面试官:常见的内存管理机制?
- 🙎♂️面试官:这两种机制的内存碎片问题了解吗?
- 🙎♂️面试官:分段机制和分页机制的共同点和区别?
- 🙎♂️面试官:分段机制和分页机制下的地址翻译过程分别是怎样的?
- 🙎♂️面试官:单级页表有什么问题?为什么需要多级页表?
- 🙎♂️面试官:TLB 有什么用?使用 TLB 之后的地址翻译流程是怎样的?
- 调度算法
- 🙎♂️面试官:页缺失,常见的页面置换算法有哪些?
- 🙎♂️面试官:硬链接和软链接有什么区别?
- 🙎♂️面试官:常见的磁盘调度算法有哪些?
操作系统
进程管理
🙎♂️面试官:进程和线程的区别?
🙋♂答:
进程就是运行中的程序;线程就是进程中一条执行流程。
两者区别如下:
- 进程是资源(比如内存)分配的基本单位;线程是CPU调度的基本单位。
- 线程的时间效率和空间效率都要比进程高。当一个进程内有多个线程时,线程会共享虚拟内存和全局变量,线程独享寄存器,栈等必不可少的资源。
🙎♂️面试官:进程有哪几种状态?
🙋♂答:
- 创建状态(new):进程正在被创建时的状态;
- 运行状态(Running):该时刻进程占用 CPU;
- 就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;
- 阻塞状态(Blocked):该进程正在等待某一事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时,即使给它CPU控制权,它也无法运行;
- 结束状态(Exit):进程正在从系统中消失时的状态;
Java中还存在等待和超时等待状态。
调用sleep,或者带时间的wait,会进入超时等待(TIME_WAITING)的状态。
调用wait,或者join,会进入等待(WAITING)状态。在这个状态,线程需要被显式的唤醒。
🙎♂️面试官:进程间的通信方式?
🙋♂答:
- 管道传输。提供一种进程间单向通信的方式,一个进程作为写入端,另一个进程作为读取端。所谓的管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。
- 消息队列。是保存在内核中的消息链表,相比于管道可以自定义消息类型。
- 共享内存。分配一个共享空间,每个进程都可以互相通信。可以减少消息队列中从用户态到内核态切换带来的开销。
- 信号量。信号量可以保证只有一个进程访问共享资源,本质是一个计数器,表示资源个数。信号量可以通过P操作和V操作来控制。
- 信号。对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。 例如,
SIGTERM
信号,就是终止进程的意思。 - Socket。用于不同主机进程之间的通信。
🙎♂️面试官:线程间的同步的方式?
🙋♂答:
所谓同步,就是并发进程/线程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程/线程同步。
- 信号量。信号量是一种计数器,表示资源的个数。如果资源个数小于0,则当前线程需要等其他线程释放资源后才能继续执行。
- 自旋锁。如果拿不到资源就一直自旋。通过CPU提供的CAS函数来实现。
- 互斥锁。互斥锁加锁失败就释放CPU给其他线程,当锁被释放,内核在把CPU切换给该线程。
🙎♂️面试官:什么是PCB?
🙋♂答:
PCB是进程控制块,用来描述进程。一个进程存在,必然会有一个PCB,如果进程消失,那么PCB也会消失。
PCB具体包含的信息有如下几个:
- 进程描述信息: 进程标识符、用户标识符;
- 进程控制和管理信息: 进程当前状态;进程优先级:进程抢占 CPU 时的优先级;
- CPU 相关信息: CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息都会被保存在相应的 PCB 中,以便进程重新执行时,能从断点处继续执行。
PCB通过链表进行组织,把具有相同状态的进程链在一起,组成各种队列。比如:
- 将所有处于就绪状态的进程链在一起,称为就绪队列;
- 把所有因等待某事件而处于等待状态的进程链在一起就组成各种阻塞队列;
🙎♂️面试官:进程的调度算法?
🙋♂答:
- 先来先服务,顾名思义,就是按照顺序从就绪队列中取出进程,但是对于短作业不利;
- 最短作业优先,选择运行时间最短的进程;
- 高相应比优先,在进程调度时计算相应比,相应比最高的进程先执行。
- 时间片轮转:每个进程分配一个时间片,时间片用完,就释放CPU。
- 最高优先级:选择优先级最高的先运行,优先级随着时间的推移会上升。
- 多级反馈队列:有多个队列,队列的优先级从高到底,优先级越高分配的时间片越短;短作业会在第一梯队率先完成,长作业即使没有完成,可以移入下次队列执行,即使等待时间上升,但是执行的时间也变长了。比较好的兼顾了长作业和短作业。
🙎♂️面试官:什么是死锁?死锁的四个必要条件,解决死锁的方法
🙋♂答:
多进程系统中,进程之间为了争夺资源而陷入无限的等待状态,导致它们都无法继续执行,就表示发生了死锁。
死锁只有同时满足以下四个条件才会发生:
- 互斥条件;
- 持有并等待条件;
- 不可剥夺条件;
- 环路等待条件。
解决死锁问题,破坏其中一个条件即可:
- 破坏请求于保持条件:要求进程一次性获取所有需要的资源,如果不能获取到所有资源,就释放已经获得的资源,等待重新获取全部资源。
- 破坏循环等待条件:多个线程获取资源的顺序一致。线程A先去获取资源A,之后去获取资源B。线程B以同样的顺序访问资源。
内存管理
🙎♂️面试官:常见的内存管理机制?
🙋♂答:
- 分段机制:程序可以分为代码段、堆段、栈段、数据段若干个逻辑分段。所以分段机制就把虚拟内存用分段的形式将这些段分离出来。
- 分页机制:将虚拟内存空间分成一页页连续的固定尺寸的大小。
🙎♂️面试官:这两种机制的内存碎片问题了解吗?
🙋♂答:
- 分段机制存在外部内存碎片的问题。因为每个段的大小不固定,所划分出的内存空间不一定是连续的。这样就可能会出现新的程序没办法加载的问题。
- 解决外部内存碎片就需要内存交换,将程序swap到硬盘中,接着装载到被占用的内存后面。如果swap的内存很大,就会出现性能问题。
- 分页机制存在内部内存碎片的问题。因为每个页的大小都是固定好的,但是程序可能不足一个页,这样就会造成内存浪费。
- 内存空间不足,触发swap机制,一次性写入磁盘的也就是少数的几个页,性能要比分段机制更好。
🙎♂️面试官:分段机制和分页机制的共同点和区别?
🙋♂答:
共同点:
- 都是非连续的内存管理机制。
- 都采用了地址映射的方法,将虚拟地址映射到物理地址,实现对内存的保护。
区别:
- 虚拟地址和物理地址的转化方式不同。
- 分段机制使用段表【段基地址 + 段界限】、分页机制使用页表【虚拟页号 + 物理页号对应】。
- 内存不足时,触发swap机制的交换效率不同。
- 页是物理单位,根据物理地址的内存划分实际大小。段是逻辑单位,每个程序不同。
🙎♂️面试官:分段机制和分页机制下的地址翻译过程分别是怎样的?
🙋♂答:
- 分段机制下的虚拟地址由段选择因子 + 段内偏移量 两部分组成。段选择因子中的段号作为段表的索引。
- 段表中保存段基地址,段基地址 + 段内偏移量就是物理内存地址。
- 分页机制下的虚拟地址由 虚拟页号 + 页内偏移量 两部分组成。虚拟页号作为页表的索引。
- 页表中保存虚拟页号与物理页号的映射关系。物理页号 + 页内偏移量就是物理内存地址。
🙎♂️面试官:单级页表有什么问题?为什么需要多级页表?
🙋♂答:
单页表的缺陷:
- 内存占用。假设进程拥有的虚拟内存地址的空间4GB(232),系统页的大小为4KB(212),那么分配的页有100万个(220)。因为页表必须要覆盖到所有的虚拟地址空间。所以同时也需要100万个页表项,每个页表项占用4字节,那么页表大小就是4MB。一个进程就会消耗4MB的内存。
多级页表的好处:
- 多级页表中,一级页表就可以映射到所有的虚拟地址空间。如果某个一级页表的页表项没有用到,就不需要创建页表项对应的二级页表。这样就会节省很多空间。
🙎♂️面试官:TLB 有什么用?使用 TLB 之后的地址翻译流程是怎样的?
🙋♂答:
TLB(Translation Lookaside Buffer)是页表缓存。TLB存在的理由如下:
- 因为程序是遵循局部性原理的,经常访问的内存是有空间局部性的。利用这个特性,我们可以把经常访问的页表存储到CPU的Cache中,这个Cache就是TLB。
使用TLB后地址翻译流程:
- CPU中的MMU(内存管理单元)负责进行虚拟地址到物理地址的转换和TLB的访问。有了TLB后,在CPU进行寻址时,会先查TLB,如果没找到,才会继续查常规的页表。TLB 的命中率其实是很高的,因为程序最常访问的页就那么几个。
调度算法
🙎♂️面试官:页缺失,常见的页面置换算法有哪些?
🙋♂答:
页面置换算法的功能是:当CPU发现虚拟地址在页表中查不到时,会发生缺页异常,需要将页换入到内存中,如果内存满,需要将内存中的页面置换出来,此时就需要页面置换算法。
法的目标是,尽可能减少页面的换入换出的次数,常见的页面置换算法有如下几种:
-
最佳页面置换算法(OPT):是一种理想情况,每次换出未来最长时间不访问的页面。
-
先进先出置换算法(FIFO):每次换出在内存中驻留时间最长的页面。
-
最近最久未使用的置换算法(LRU):每次换出最久没有访问的页面。与最佳页面置换算法思想类似,前者考虑未来的情况,LRU考虑历史的情况。
-
时钟页面置换算法(Lock):表针会检查页表的访问位,访问位为0就把该页淘汰出内存,插入新的页面。访问位为1,就把访问位置为0,继续往下,寻找访问位为0的页表。
-
最不常用置换算法(LFU):每次换出访问次数最少的页面。但是这个算法没有考虑时间的问题,可能一个页表过去的访问次数高,但是最近不访问了,但是也不会换出。
🙎♂️面试官:硬链接和软链接有什么区别?
🙋♂答:
在 Linux 中可以通过硬链接(Hard Link) 和软链接(Symbolic Link) 的方式来实现访问文件,可以让文件有多个不同的有效路径名。
-
硬链接是多个目录项中的节点指向同一个文件,也就是指向同一个inode【index node:包含文件的元信息】。
不同的文件系统inode不同,所以硬链接不能跨越文件系统。
由于多个目录项都是指向一个 inode,那么只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。ln file1 inode # file1 硬链接到inode
-
软链接相当于重新创建一个文件,但是这个文件的内容是另外一个文件的路径,类似于快捷方式。
软连接创建不同的inode,可以跨文件系统。
即使源文件删除,软连接也还会存在,只不过是指向的文件找不到了而已。
🙎♂️面试官:常见的磁盘调度算法有哪些?
🙋♂答:
磁盘的调度算法通过优化磁盘的访问请求顺序,来优化磁盘的性能。常见的磁盘调度算法有以下几种:
- 先来先服务算法:顾名思义,但是如果大量进程竞争使用磁盘,请求访问的磁道可能会很分散,那先来先服务算法在性能上就会显得很差,因为寻道时间过长。
- 最短寻道时间优先算法:优先访问最短寻道距离的请求。对于某些请求可能产生饥饿,磁头可能只在一定范围内来回移动。
- 扫描算法:一开始就向一边移动,到头之后向另一边移动。每个磁道的响应频率有差异,中间磁道的响应频率会相对较高。
- 循环扫描算法:一开始就向一边移动,到头之后迅速复位磁头,返回途中不处理任何请求,因为磁道只扫描一边的请求,这样可以使得每个磁道的扫描频率一致。
- LOOK 与 C-LOOK 算法:对两个扫描算法的优化,不需要移动到磁盘的最始段和最末端,只需要移动到最远的请求位置即可。
完。