美文网首页
操作系统常见面试知识点

操作系统常见面试知识点

作者: 你臭显摆什么呀 | 来源:发表于2019-10-06 00:26 被阅读0次

    转载:https://www.cnblogs.com/inception6-lxc/p/9073983.html

    1.进程的常见状态?以及各种状态之间的转换条件?

    • 就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行。
    • 执行:进程已经获得CPU,程序正在执行状态。
    • 阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。


      进程状态图

    2.进程同步

    进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
    同步机制遵循的原则:
    (1)空闲让进;

    (2)忙则等待(保证对临界区的互斥访问);

    (3)有限等待(有限代表有限的时间,避免死等);

    (4)让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。

    3.进程的通信方式

    进程通信是指进程之间的信息交换。交换信息量少称为低级通信。
    高级进程是指用户利用操作系统所提供的一组通信命令传送大量数据的通信方式。
    高级通信机制归结为三类:
    (1)共享存储器系统(存储器中划分的共享存储区)
    (2)消息传递系统(进程间的数据交换以信息为单位)
    (3)管道通信系统

    • 管道:管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。无名管道只能实现父子或者兄弟进程之间的通信,有名管道(FIFO)可以实现互不相关的两个进程之间的通信。
    • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
    • 消息队列:是一个在系统内核中用来保存消息的队列,它在系统内核中是以消息链表的形式出现的。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    • 共享内存:共享内存允许两个或多个进程访问同一个逻辑内存。
    • 套接字:也是一种进程间机制,它可用于不同机器间的进程通信。

    4.上下文切换

    上下文切换(Context Switch)是一种将CPU资源从一个进程分配给另一个进程的机制。在切换的过程中,操作系统需要先存储当前进程的状态(包括内存空间的指针,当前执行完的指令等等),再读入下一个进程的状态,然后执行此进程。

    5.进程与线程的区别和联系?

    • 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
    • 线程是进程的一个实体,是CPU调度和分配的基本单位

    进程和线程的关系
    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
    (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
    (3)处理机分给线程,即真正在处理机上运行的是线程
    (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

    进程与线程的区别?
    (1)进程有自己的独立地址空间,线程没有
    (2)进程是资源分配的最小单位,线程是CPU调度的最小单位
    (3)进程和线程通信方式不同,线程之间的通信比较方便,进程之间的通信只能通过进程通信的方式进行)
    (4)进程上下文切换开销大,线程开销小
    (5)一个进程挂掉了不会影响其他进程,而线程挂掉了会影响其他线程
    (6)对进程操作开销一般比较大

    为什么进程上下文切换比线程上下文切换代价高
    进程切换分两步:
    1.切换页目录以使用新的地址空间
    2.切换内核栈和硬件上下文

    切换的性能消耗:
    1.线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
    2.上下文的切换会扰乱处理器的缓存机制。

    线程可以分为两类

    • 用户级线程,用户级线程的好处是非常高效,不需要进入内核空间,但并发效率不高
    • 内核级线程,内核可以将不同线程更好的分配到不同的CPU,以实现真正的并行计算。

    6.进程调度

    调度种类
    • 高级调度:又称为作业调度,它决定把后备作业调入内存运行。
    • 低级调度:又称为进程调度,它决定把就就绪队列的某进程获得CPU
    • 中级调度:又称为在虚拟存储器中引入,在内外存对换区进行进程对换。
    非抢占式调度与抢占式调度
    • 非抢占式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,知道进程完成或发生进程调度某事件而阻塞时,才把处理机分配给另一个进程。
    • 抢占式:操作系统将正在运行的进行强行暂停,由调度程序将CPU分配给其他就绪进程的调度方式。
    调度策略的设计
    • 响应时间:从用户输入到产生反应的时间
    • 周转时间:从任务开始任务结束的时间

    CPU任务分为交互式任务批处理任务,调度最终的目标是合理的使用CPU,使得交互式任务的响应时间尽可能短,用户不至于感到延迟,同时使得批处理任务的周转时间尽可能短,减少用户等待的时间。

    调度算法

    FIFO(先来先服务)

    • 调度的顺序就是任务到达就绪队列的顺序。
    • 公平、简单(FIFO队列)、非抢占、不适合交互式。
    • 未考虑任务特性,平均等待时间可以缩短。

    SJF最短作业优先

    • 最短的作业(CPU区间长度最小)最先调度。
    • SJF可以保证最小的平均等待时间。

    最短剩余时间作业优先

    • SJF的可抢占版本,比SJF更有优势
    • 如何知道下一个CPU区间大小,可根据历史进行预测:指数平均法

    优先权调度

    • 每个任务关联一个优先权,调度优先权最高的任务
    • 优先权太低的任务一直就绪,得不到运行,出现饥饿现象

    时间片轮转调度算法

    • 设置一个时间片,按时间片来轮转调度
    • 优点:定时有响应,等待时间较短;缺点:上下文切换次数较多;
    • 时间片太大,响应时间太长;吞吐量变小,周转时间变长;当时间片过长时,退化为FCFS。

    多级队列调度

    • 按照一定的规则建立多个进程队列
    • 不同的队列有固定的优先级(高优先级有抢占权)
    • 不同的队列可以给不同的时间片和采用不同的调度算法
    • 存在问题:1.没法区分I/O bound和CPU bound;2.一定程度的饥饿现象

    多级反馈队列

    • 在多级队列的基础上,任务可以在队列之间移动,更细致的区分任务
    • 可以根据享用CPU时间多少来移动队列,阻止饥饿
    • 最通用的调度算法,多数OS都使用该方法或变形

    7.死锁的条件?以及如何处理死锁问题?

    死锁定义:一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程就是死锁的。或者在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

    产生死锁的必要条件
    • 互斥条件:资源不能被共享,只能有一个进程使用
    • 请求与保持条件:已经得到资源的进程可以再次申请新的资源
    • 非抢占条件:已经分配的资源不能从相应的进程中被强制地剥夺
    • 循环等待条件:系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源
    如何处理死锁问题
    • 忽略该问题 不处理
    • 检测死锁并且恢复
    • 仔细的对资源进行动态分配,使系统始终处于安全状态以避免死锁
    • 破除死锁的四个必要条件之一

    8.临界资源

    • 对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源
    • 对于临界资源的访问,必须是互斥进行
    • 而进程内访问临界资源的代码被称为临界区。

    9.一个程序从开始到结束的完成过程

    1.预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。
    2.编译:将预处理后的文件转换成汇编语言,生成.s文件
    3.汇编:汇编变为目标代码(机器代码)生成.o的文件
    4.链接:连接目标代码,生成可执行程序

    10.内存池、进程池、线程池

    线程池:类似于操作系统中的缓冲区的概念,先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。
    进程池:与线程池同理
    内存池:程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;

    11.动态链接库与静态链接库的区别

    静态库

    静态库是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与链接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(static build)。

    动态库

    • 静态库很方便,但是如果我们只是想用库中的某一个函数,却仍然得把所有的内容都链接进去。一个更现代的方法则是使用共享库,避免了在文件中静态库的大量重复。
    • 动态链接可以在首次载入的时候执行(load-time linking),这是 Linux 的标准做法,会由动态链接器ld-linux.so 完成,比方标准 C 库(libc.so) 通常就是动态链接的,这样所有的程序可以共享同一个库,而不用分别进行封装。
    • 动态链接可以在首次载入的时候执行,所有的程序可以共享同一个库,而不用分别进行封装。
    • 链接使得我们可以用多个对象文件构造我们的程序。可以在程序的不同阶段进行(编译、载入、运行期间均可)

    区别
    1.使用静态库的时候,静态链接库要参与编译,在生成执行文件之前的链接过程中,要将静态链接库的全部指令直接链接入可执行文件中。而动态库提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个.dll文件中,该dll包含一个或多个已被编译,链接并与使用它们的进程分开储存的函数
    2.静态库中不能再包含其他动态库或静态库,而在动态库中还可以再包含其他动态或者静态库。
    3.静态库在编译的时候,就将库函数装在到程序中去了,而动态库函数必须在运行的时候才被装载,所以使用静态库速度快一些。

    12.虚拟内存

    定义:具有请求调入和置换功能,能从逻辑上对内存容量加以扩充得一种存储器系统。其逻辑容量由内存之和和外存之和决定。

    虚拟存储器有以下三个主要特征:

    • 请求分页存储管理
    • 请求分段存储管理

    13.页面置换算法

    操作系统将内存按照页面进行管理,在需要的时候才把进程相应的部分调入内存。当产生缺页中断时,需要选择一个页面写入。如果要换出的页面在内存中被修改过,变成了“脏”页面,那就需要先写会到磁盘。页面置换算法,就是要选出最合适的一个页面,使得置换的效率最高。

    1.最优页面置换算法

    最理想的状态下,我们给页面做个标记,挑选一个最远才会被再次用到的页面调出。当然,这样的算法不可能实现,因为不确定一个页面在何时会被用到。

    2.先进先出页面置换算法

    淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予淘汰。实现:把一个进程已调入内存的页面按先后次序链接成一个队列,并且设置一个指针总是指向最老的页面。缺点:对于有些经常被访问的页面如含有全局变量、常用函数、例程等的页面,不能保证这些不被淘汰。

    3.最近最少使用页面置换算法

    根据页面调入内存后的使用情况做出决策。LRU置换算法是选择最近最久未使用的页面进行淘汰。
    1.为每个在内存中的页面配置一个移位寄存器,定时信号每隔一段时间将寄存器右移一位。最小数值的寄存器对应页面就是最久未使用页面
    2.利用一个特殊的栈保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移除,将它押入栈顶。因此栈顶永远是最新被访问的页面号,栈底是最近最久未被访问的页面号。

    分页内存管理
    分段内存管理

    14.中断与系统调用

    所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。

    中断种类

    • 由于计算机硬件异常或故障引起的中断,称为内部异常中断
    • 由于程序中执行了引起中断的指令而造成的中断,称为软中断
    • 由外部设备请求引起的中断,称为外部中断。简单来说,对中断的理解就是对一些特殊事情的处理。
    • 中断优先级:机器错误 > 时钟 > 磁盘 > 网络设备 > 终端 > 软件中断
    用户态切换到内核态的方式如下:
    • 系统调用:程序的执行一般是在用户态下执行的,但当程序需要使用操作系统提供的服务时,比如说打开某一设备、创建文件、读写文件(这些均属于系统调用)等,就需要向操作系统发出调用服务的请求,这就是系统调用。
    • 异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
    • 外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

    用户态和内核态之间的区别是什么?

    • 权限不一样
    • **用户态的进程能存取它们自己的指令和数据,但不能存取内核指令和数据(或其他进程的指令和数据)
    • **和心态下的进程能够存取内核和用户地址某些机器指令是特权指令,在用户态下执行特权指令会引起错误。在系统中的内核并不是作为一个与用户进行平行的估计的进程的集合

    15.C++多线程,互斥,同步

    当有多个线程的时候,经常需要去同步(注:同步不是同时刻)这些线程以访问同一个数据或资源。

    所谓同步,是指在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。

    所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

    多线程的同步与互斥实现方法
    线程间的同步方法大体分为:用户模式和内核模式
    用户模式下的方法:原子操作,临界区
    内核模式下的方法有:事件,信号量,互斥量

    16.逻辑地址,物理地址,虚拟内存

    • 所谓的逻辑地址,是指计算机用户(例如程序开发者),看到的地址。逻辑地址并不一定是元素存储的真实地址,即数组元素的物理地址(在内存条中所处的位置),并非是连续的,只是操作系统通过地址映射,将逻辑地址映射成连续的,这样更符合人们的直观思维。
    • 虚拟内存,操作系统可以通过将部分不太常用的数据移出内存,“存放到价格相对较低的磁盘缓存,以实现内存扩展。

    20.同步与异步

    同步
    • 定义:是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么,这个进程将会一直等待下去,直到收到返回信息才继续执行下去。
    • 特点:
      (1)同步是阻塞模式
      (2)同步是按顺序执行,执行完一个再执行下一个,需要等待,协调运行;
    异步
    • 是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
    • 特点
      (1)异步是非阻塞模式,无需等待
      (2)异步是彼此独立,在等待某事件的过程中,继续做自己的事,不需要等待这一事件完成后再工作。线程是异步实现的一个方式。
    同步与异步的优缺点:
    • 同步可以避免出现死锁,读脏数据的发生。一般共享某一资源的时候,如果每个人都有修改权限,同时修改一个文件,有可能使一个读取另一个人已经删除了内容,就会出错,同步就不会出错。但,同步需要等待资源访问结束,浪费时间,效率低。
    • 异步可以提高效率,但,安全性较低。

    相关文章

      网友评论

          本文标题:操作系统常见面试知识点

          本文链接:https://www.haomeiwen.com/subject/iacspctx.html