操作系统面试题


操作系统面试题

进程和线程有什么区别?

进程就是正在执行的程序,是操作系统资源分配的基本单位,包括指令、数据和PCB

线程是进程内部的不同的执行路径,是操作系统独立调度的基本单位。一个进程可以有多个线程,他们共享进程资源

区别

1、拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问属于进程的资源

2、调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程的切换,从一个 进程的线程切换到另一个进程的线程时,会引起进程切换

3、系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小

4、通信:线程间可以通过直接读写同一进程的数据进行通信,但是进程通信需要借助IPC

进程的状态和转换条件?

  • 创建

  • 就绪:进程已处于准备好的状态,即进程已分配到除CPU外的所有资源后,只要再获得CPU后,就可以执行

  • 执行:进程已获得CPU,程序正在执行状态

  • 阻塞:正在执行的进程由于发生某事件暂时无法继续执行的状态

  • 终止

线程状态
线程状态

进程调度算法有哪些?

1、先来先服务(FCFS):非抢占式的调度算法,按照请求的先后顺序进行调度

  • 对于长作业有利,短作业不利,短作业必须一直等待前面的长作业执行完毕才能执行,而长作业有需要很长一段时间,造成了短作业等待时间过长

2、短作业优先(SJF):非抢占式的调度算法,按照运行时间最短的顺序进行调度

  • 长作业可能一直等不到,处于一直等待短作业执行完毕的状态

3、时间片轮转调度算法:将所有就绪进程按FCFS的原则排成一个队列,每次调度时,把CPU的时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把CPU时间分配给队首的进程

4、高响应比响应:按照高响应比(已等待时间+要求运行时间)/要求运行时间优先的规则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比,选择最大的作业投入运行

5、优先权调度算法:按照进程的优先权大小来调度 ,使优先权高进程得到优先处理

6、多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分成若干个队列,所有的作业按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法

抢占式调度和非抢占式调度

  • 抢占式调度是操作系统将正在运行的进程强制暂停,由调度器将CPU分配给其他就绪进程
  • 非抢占式调度是调度器一旦将处理机制分配给某进程后一直运行,直达进程完成或发生进程调度某事件而堵塞时,才把处理机制分配给另一个进程

死锁的产生条件?如果避免死锁?

  • 死锁:在两个或者多个并发进程中,各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
  • 饥饿:由于长时间得不到想要的进程资源,某进程无法向前推进。短作业优先调度算法中,若短作业一直进来,而长作业得不到处理,发生长作业饥饿
  • 死循环:某进程执行过程中一直跳不出某个循环的现象。

死锁、饥饿和死循环的区别

死锁:至少是两个进程一起死锁,死锁进程处于阻塞状态

饥饿:可以只有一个进程饥饿,饥饿进程可能阻塞或者就绪

死循环:可能只有一个进程发生死循环,死循环的进程可上处理机

死锁产生的必要条件

  • 互斥条件:对互斥使用的资源的争抢才会导致死锁
  • 不剥夺条件:进程保持的资源只能主动释放,不可强行剥夺
  • 请求和保持条件:保持某些资源不放的同时,请求别的资源
  • 循环条件:存在一种进程资源的循环等待链;循环等待未必死锁,死锁一定有循环等待

死锁的处理

  • 预防死锁:破坏死锁产生的四个必要条件
  • 避免死锁:确保循环等待条件不成立,避免系统进入不安全状态,资源分配图算法和银行家算法就是避免死锁的算法
  • 死锁的检测和解除:允许死锁发生,系统负责检测出死锁
    • 死锁解除的两种方法:进程终止和资源抢占
      • 进程终止是指简单地终止一个或多个进程打破循环等待,包括终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止
      • 资源抢占是从一个或者多个进程抢占一个或多个进程抢占一个或多个资源,必须考虑选择一个牺牲品、回滚(回滚到安全状态)、饥饿(在代价因素上加上回滚次数,回滚越多的越不能作为牺牲品,避免总是一个进程回滚)

进程间通信的方式

  • 管道及命名管道:管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,还允许无亲缘关系进程间的通信
  • 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
  • 消息队列:消息队列是消息的链接表,克服了上面两种通信方式的信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息,具有读权限的进程可以从消息队列中读取信息
  • 共享内存:最有用的进程间通信方式,使得多个进程可以访问同一个内存空间,不同进程可以及时看到对方进程对共享内存中数据更新,需要某种同步操作,如互斥锁和信号量等
  • 信息量:作为主要进程间及同一进程不同线程之间的同步和互斥手段
  • 套接字:一般的进程间通信机制,用于网络间不同机器之间的进程间通信

线程同步的方式?

  • 互斥量(Synchronized/Lock):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
  • 信号量(Semphare):允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程量
  • 事件(Wait/Noify):通过通知操作的方式来保持线程同步,还可以实现多线程优先级的比较操作

分页和分段有什么区别?

段式存储管理是一种符合用户视角的内存分配管理方案。在段式存储管理中,两程序的地址空间划分为若干段,如代码段,数据段,堆栈段,这样每个进程都有一个二维地址空间,相互独立,互不干扰。段式管理的优点是你没有段碎片,因为段大小可变,改变段大小来消除内碎片,但段换入换出,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)

页式存储管理方案是一种用户视角与物理内存相分离的内存分配管理方案。在页式存储管理方案,将程序的逻辑顺序划分为固定大小的页,而物理内存划分为同样大小的帧,程序加载时,可以将任意一页放入内存中任何一帧,这些帧不必连续,从而实现了离散分散。优点是没有外碎片,因为页的大小固定的,但是会产生内碎片,因为一个页可能填充不满

  • 目的不同:分页是由于系统管理的需要而不是用户的需要,是信息的物理单位;分段的目的是为了更好地满足用户的需要,是信息的逻辑单位,含有一组其意义相对完整的信息
  • 大小不同:页的大小固定且由系决定,而段的长度却不固定,由其所完成的功能决定
  • 地址空间不同:段向用户提供二维地址空间;页向用户提供的是一维地址空间
  • 信息共享:段是信息的逻辑单位,便于储存保护和信息的共享,页的保护和共享受到限制
  • 内存碎片:页式存储管理没有外碎片,但是会产生内碎片;而段式管理没有内碎片,但是段换入换出时,会产生外碎片

虚拟内存

每一个进程拥有独立的内存空间,这个空间被分为大小相等额多个快,称为页,每一页都是连续的地址,这些被映射到物理内存,但不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件进行必要的映射,当程序引用到一部分不在物理内存的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。

这样的话,逻辑上似乎有很大的内存空间,实际上一部分对应物理内存的一块,还有一些没有加载在内存中对应在硬盘上

image-20220607092658500
image-20220607092658500

虚拟内存实际上比物理内存大,当访问虚拟内存时,会访问MMU去匹配对应的物理地址。如果虚拟内存的页并不存在物理地址中,就会发生缺页中断,从磁盘中取得缺的页放入内存中,如果内存已满,会根据置换算法将磁盘中的页换出

优点:

  • 在内存中保留多个进程,系统并发度提高
  • 解除了内存和用户的紧密约束,进程可以比内存的全部空间还大

页面置换算法

  • FIFO先进先出算法:根据作业的达到的顺序置换
  • LRU最近最少使用算法:根据使用时间到现在的长短来判断
  • LFU最少使用次数算法:根据使用次数
  • OPT最优置换算法:保证置换出去的是不再是使用的页,或者是在实际内存中最晚使用的算法

Author: baiwenhui
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source baiwenhui !