面试必备-操作系统

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiaoming100001/article/details/94960922

前言

操作系统理论性非常强,刚开始学起来非常粗糙。然而,面试过程中经常会被问到计算机网络或者操作系统,有兴趣的同学可以看我这篇有关于计算机网络的文章(https://blog.csdn.net/xiaoming100001/article/details/81109617 ),相信会有所收获。本篇文章主要讲述面试可能遇到的重点内容,金九银十,希望可以帮到大家,下面主要按照如下思路展开:

在这里插入图片描述

概述

定义: 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。
在操作系统的发展过程中,主要是分时系统和实时系统,分时系统是提供多个终端供多个用户使用,具有人机交互,多用户共享主机的优点,例如现在使用的Windows系统。实时系统是能够及时响应,并规定时间内完成,控制所以实时任务协调一致的运行,例如嵌入式系统。

基本特性

  • 并发: 两个或多个程序在同一时间段内发生,注意并行是指同一时刻多个事件发生。
  • 共享: 系统中的资源可供内存中多个并发执行的进程共同使用,注意限定了进程在内存期间
  • 虚拟: 利用时分复用空分复用技术来实现把一个物理实体虚拟多个。
  • 异步: 在多道程序环境下,系统允许多个进程并发执行,以走走停停的方式执行的,并以不可预知的速度推进,现在操作系统都是这样了。

主要功能

  • 处理器管理: 处理器管理最基本的功能是处理中断事件。其中处理机分配是以进程为单位,可以理解为对进程的管理,包括进程同步、进程通信和进程调度等。
  • 存储器管理: 简单理解对内存的管理,当然还有一些虚拟内存等。主要任务是:分配内存空间,保证各作业占用的存储空间不发生矛盾,并使各作业在自己所属存储区中不互相干扰。
  • 设备管理: 管理所有的外围设备,包括完成用户的IO请求、为用户进程分配IO设备等。
  • 文件管理: 管理用户文件和系统文件,方便使用同时保证安全性。

进程和线程

进程

定义

进程是程序的一次执行过程,进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,例如打开QQ或者微信都是一个进程。

生命周期

在这里插入图片描述
就绪状态: 等待进程调度装填,进程获得了除处理机之外的一切所需资源,如果得到处理机即可运行。
运行状态: 进程正在处理机上运行。
阻塞状态(等待状态): 进程正在等待某一事件而阻塞运行,比如等待某资源为可用或者输入/输出完成。

注意区别就绪状态和等待状态: 就绪状态是指进程只是缺少处理机,只要获得处理机资源立即执行;而等待状态是指进程需要其他资源(除了处理机)或等待某一事件。

就绪状态 -> 运行状态: 处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片),进程由就绪状态转换为运行状态。
运行状态 -> 就绪状态: 处于运行状态的进程在时间片用完后,不得不让出处理机,进程由运行状态转换为就绪状态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。
运行状态 -> 阻塞状态: 当进程请求某一资源的使用和分配或等待某一事件的发生(如I/O操作的完成)时,进程由运行状态转换为阻塞状态。
阻塞状态 -> 就绪状态: 当进程等待的事件到来时,如I/O操作结束或中断结束时,进程由阻塞状态转换为就绪状态。

终止进程的过程如下:

  1. 根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
  2. 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
  3. 若该进程还有子进程,则应将其所有子进程终止。
  4. 将该进程所拥有的全部资源,或归还给其父进程或归还给操作系统。
  5. 将该PCB从所在队列(链表)中删除。

进程通信

进程通信是指进程之间的信息交换。PV操作是低级通信方式,髙级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三个类。

共享存储

在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如 P操作、V操作),对共享空间的写/读进行控制。

消息传递

在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的,通过系统提供的发送消息和接收消息两个原语进行数据交换。

管道通信

管道指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件,主要是通过文件读写的方式。

进程同步

多进程虽然提高了系统资源利用率和吞吐量,但是由于进程的异步性可能造成系统的混乱。进程同步的任务就是对多个相关进程在执行顺序上进行协调,使并发执行的多个进程之间可以有效的共享资源和相互合作。

同步机制注意记住下面四大原则:
空闲让进: 当没有进程处于临界区(资源共享的代码块)的时候,应该许可其他进程进入临界区的申请。
忙则等待: 当前如果有进程处于临界区,如果有其他进程申请进入,则必须等待,保证对临界区的互斥访问。
有限等待: 对要求访问临界资源的进程,需要在有限时间内进入临界区,防止出现死等。
让权等待: 当进程无法进入临界区的时候,需要释放处理机,以防陷入忙等。

死锁

死锁是指多个进程(或者线程)在运行过程中,因为争夺资源而造成的一种僵局,如果没有外力推进,处于僵局中的进程就无法继续执行,最后会卡死。

死锁原因

竞争资源: 请求同一有限资源的进程数多于可用资源数
进程推进顺序非法: 进程执行中,请求和释放资源顺序不合理,如资源等待链

死锁产生的四大必要条件

互斥条件: 进程对所分配的资源进行排他性的使用
请求和保持条件: 进程被阻塞的时候并不释放锁申请到的资源
不可剥夺条件: 进程对于已经申请到的资源在使用完成之前不可以被剥夺
环路等待条件: 发生死锁的时候存在的一个 进程-资源 环形等待链

处理死锁的解决方法

预防死锁: 破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量

避免死锁: 在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)、比如经典的银行家算法,校招面试的同学建议了解一下这个算法,面试可以争取加分

检测死锁: 允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大

解除死锁: 与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大

进程调度算法

先来先服务调度算法(FCFS): 作业调度算法或者进程调度算法,按作业或者进程到达的先后顺序依次调度,对于长作业比较有利,但是无法优先处理比较紧急的任务。

短作业优先调度算法(SJF): 是作业调度算法,从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行。所以缺点很明显不利于长作业,没有考虑到部分作业的重要性

高响应比算法(HRN): 根据响应比决定优先级,响应比=(等待时间+要求服务时间)/要求服务时间;

时间片轮转调度(RR): 按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,以此循环。

多级反馈队列调度算法: 被公认较好的调度算法,设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部……只有当前一个队列为空的时候才会去调度下一个队列的进程。

线程

线程是每个程序的必要部分,有自己的堆栈和局部变量,但线程之间没有单独的地址空间,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率差。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

  1. 一个程序至少有一个进程,一个进程至少有一个线程
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高
  3. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  4. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

储存器和虚拟存储器管理

内存连续分配

主要是指动态分区分配时所采用的几种算法。 动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的。
在这里插入图片描述

首次适应(First Fit)算法: 空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。

最佳适应(Best Fit)算法: 其实是最差的算法,空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。

最坏适应(Worst Fit)算法: 是比较好的,又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。

分页式储存管理方式

主要思想是把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。

页号->物理块号: 因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录逻辑地址和实际存储地址之间的映射关系,以实现从页号到物理块号的映射。

页表也是存储在内存中的,访问分页系统中内存数据需要两次的内存访问(一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。

img

为了减少两次访问内存导致的效率影响,分页管理中引入了快表机制,包含快表机制的内存管理中,当要访问内存数据的时候,首先将页号在快表中查询,如果查找到说明要访问的页表项在快表中,那么直接从快表中读取相应的物理块号;如果没有找到,那么访问内存中的页表,从页表中得到物理地址,同时将页表中的该映射表项添加到快表中(可能存在快表换出算法)。

在某些计算机中如果内存的逻辑地址很大,将会导致程序的页表项会很多,而页表在内存中是连续存放的,所以相应的就需要较大的连续内存空间。为了解决这个问题,可以采用两级页表或者多级页表的方法,其中外层页表一次性调入内存且连续存放,内层页表离散存放。相应的访问内存页表的时候需要一次地址变换,访问逻辑地址对应的物理地址的时候也需要一次地址变换,而且一共需要访问内存3次才可以读取一次数据。

分段式储存管理方式

分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。

分段内存管理当中,地址是二维的,一维是段号,一维是段内地址;其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。段表中的每一个表项记录了该段在内存中的起始地址和该段的长度。段表可以放在内存中也可以放在寄存器中。

img

访问内存的时候根据段号和段表项的长度计算当前访问段在段表中的位置,然后访问段表,得到该段的物理地址,根据该物理地址以及段内偏移量就可以得到需要访问的内存。由于也是两次内存访问,所以分段管理中同样引入了联想寄存器。

分段分页方式区别

页是信息的物理单位,是出于系统内存利用率的角度提出的离散分配机制;段是信息的逻辑单位,每个段含有一组意义完整的信息,是出于用户角度提出的内存管理机制。页的大小是固定的,由系统决定;段的大小是不确定的,由程序员开发决定,所以后面基本都是用基于分页分段式储存管理方式。

虚拟内存

由于技术限制,计算机的真实内存空间是有限的。如果存在一个程序,所需内存空间超过了计算机可以提供的实际内存,那么由于该程序无法装入内存所以也就无法运行。单纯的增加物理内存只能解决一部分问题,但是仍然会出现无法装入单个或者无法同时装入多个程序的问题。但是可以从逻辑的角度扩充内存容量,即可解决上述两种问题。

基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。

虚拟存储器的特征

多次性: 一个作业可以分多次被调入内存。多次性是虚拟存储特有的属性。
对换性: 作业运行过程中存在换进换出的过程(换出暂时不用的数据换入需要的数据)。
虚拟性: 虚拟性体现在其从逻辑上扩充了内存的容量(可以运行实际内存需求比物理内存大的应用程序)。虚拟性是虚拟存储器的最重要特征也是其最终目标。虚拟性建立在多次性和对换性的基础上行,多次性和对换性又建立在离散分配的基础上。

页面置换算法

最佳置换算法: 将当前页面中在未来最长时间内不会被访问的页置换出去。

先进先出置换算法: 简单粗暴的一种置换算法,每次置换最早调入的页面。

最近最久未使用算法LRU: 算法赋予每个页面一个访问字段,用来记录上次页面被访问到现在所经历的时间t,每次置换的时候把t值最大的页面置换出去(实现方面可以采用寄存器或者栈的方式实现)。

时钟算法clock(也被称为是最近未使用算法NRU): 页面设置一个访问位,并将页面链接为一个环形队列,页面被访问的时候访问位设置为1。页面置换的时候,如果当前指针所指页面访问为为0,那么置换,否则将其置为0,循环直到遇到一个访问为位0的页面。

改进型Clock算法: 在Clock算法的基础上添加一个修改位,替换时根究访问位和修改位综合判断。优先替换访问位和修改位都是0的页面,其次是访问位为0修改位为1的页面。

最少使用算法LFU: 设置寄存器记录页面被访问次数,每次置换的时候置换当前访问次数最少的。

缺页率:通过置换次数/总页面

看完这些应对操作系统面试应该够用,计算机网络可以看我这篇文章

参考资料

  1. https://blog.csdn.net/yongchaocsdn/article/details/78532676
  2. https://www.cnblogs.com/fuchongjundream/p/3829508.html

猜你喜欢

转载自blog.csdn.net/xiaoming100001/article/details/94960922