操作系统面试笔试题

操作系统的四个特性

  • 并发性:在计算机系统中存在着许多并发执行的活动
  • 共享性:系统中各个并发活动要共享计算机系统中的各种软、硬件资源,因此操作系统必须解决在多道程序间合理地分配和使用资源问题。
  • 虚拟性:虚拟是操作系统中的重要特征,所谓虚拟是指把物理上的一台设备变成逻辑上的多台设备。例如,在操作系统中采用了spooling技术,可以利用快速、大容量可共享的磁盘作为中介,模拟多个非共享的低速的输入输出设备,这样的设备称为虚拟设备。
  • 不确定性:通常一个程序的初始条件相同时,无论何时运行结果必然相同。但由于程序的并发执行系统内的各种进程错综复杂,与这些进程有关的事件,如:从外部设备来的中断、输入输出请求、各种运行故障等,发生的时间都不可预测,如果处理不当将导致系统出错,这种不确定性所带来错误是很难查找的。

进程的状态,状态转换图,以及导致转换的事件

进程有三种状态:

  • 就绪态:只要进程获得CPU资源,即可执行。一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,成为就绪队列
  • 执行态:进程已获得CPU,其程序正在执行。
  • 阻塞态:正在执行的进程由于发生某事件而暂时无法继续执行时,便处于阻塞态。

这里写图片描述

进程与线程的区别

  • 调度:
    • 进程是具有一定独立功能的程序的一次运行活动,进程是资源拥有和分派的基本单位
    • 线程是进程的一个实体,是CPU调度和分派的基本单位
  • 并发性
    • 同一个进程中的多个线程之间可以并发执行。
  • 拥有资源
    • 进程可以拥有资源,是系统中拥有资源的一个基本单位
    • 线程自己不拥有系统资源,但可以访问其所属的进程的资源。
  • 系统开销
    • 在创建或撤销进程时,系统都要创建和回收进程控制块,分配或者回收资源。类似的,进程切换时也涉及到当前进程CPU环境的保存以及新被调度进程的CPU环境的设置。
    • 创建和撤销线程时开销较小。切换线程时,由于线程都具有相应的地址空间,因此仅需保存少量寄存器内容即可。

进程通信的方式

  • 共享存储器
    相互通信的进程共享某些数据结构或者共享存储区,进程之间通过这些空间来通信。
  • 消息传递系统
    进程间的通信以格式化的message为单位。
  • 管道通信
    管道是用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件。
    写进程以字符流的形式将大量的数据送入管道,读进程从管道中接收数据。

进程同步的方式

进程同步就是对多个相关进程在执行次序上进行协调,使得并发执行的各个进程之间可以有效地共享资源。

临界区

临界资源:一次只能被一个进程所占用的资源
临界区:进程中访问临界资源的代码为临界区。
每个进程在进入临界区之前,先对欲访问的临界资源进行检查:

  • 若该临街资源没有被访问,进程可以进入临界区并将该临界资源设置为正在访问。
  • 若临界资源正在被访问,那么本进程不能进入临界区

信号量

信号量是一个确定的二元组(s,q),其中s是一个具有非负初值的整形变量,q是一个初始状态为空的队列,整形变量s表示系统中某类资源的数目:

  • 当其值 ≥ 0 时,表示系统中当前可用资源的数目
  • 当其值 < 0 时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目

除信号量的初值外,信号量的值仅能由P操作和V操作更改,操作系统利用它的状态对进程和资源进行管理。

  • P操作:P操作记为P(s),其中s为一信号量,它执行时主要完成以下动作:
s.value = s.value - 1/*可理解为占用1个资源,若原来就没有则记帐“欠”1个*/

若s.value ≥ 0,则进程继续执行,否则(即s.value < 0),则进程被阻塞,并将该进程插入到信号量s的等待队列s.queue中

  • V操作:V操作记为V(s),其中s为一信号量,它执行时,主要完成以下动作:
s.value = s.value + 1/*可理解为归还1个资源,若原来就没有则意义是用此资源还1个欠帐*/

若s.value > 0,则进程继续执行,否则(即s.value ≤ 0),则从信号量s的等待队s.queue中移出第一个进程,使其变为就绪状态,然后返回原进程继续执行。

线程的实现方式

内核级线程

此类线程的创建、撤销和切换都是依靠内核完成的。内核也为每一个内核级线程设置了一个线程控制块。

优点

  • 在多处理器中,内核能够同时调度统一进程中的多个线程并行执行
  • 如果进程中的一个线程被阻塞了,内核可以调度该进程中的其他线程运行,也可以运行其他进程中的线程
  • 内核级线程具有很小的数据结构和堆栈,线程切换快、开销小

缺点
对于用户的线程切换来说,在同一个进程中从一个线程切换到另一个线程,需要从用户态转到内核态运行,开销较大。

用户级线程

这类线程的创建、撤销、同步与通信等无需系统调用来实现,也无需内核支持。

优点

  • 线程切换不需要转换到内核空间,节省了不必要的开销。
  • 调度算法可以是进程专用的,与操作系统的调度算法无关
  • 用户级线程的实现与操作系统平台无关,因为对于其的管理是属于用户程序的一部分。

缺点

  • 大多数系统调用会阻塞进程,因此当线程执行一个系统调用时,不仅该线程被阻塞,该进程内的所有线程都会被阻塞。
  • 多线程不能利用多处理机进程多重处理的优点。内核每次分配给一个进程的只有一个CPU,因此只有一个线程能执行,其他线程必须等待。

用户态与核心态

进程的执行在系统上的两个级别:用户级和核心级,也称为用户态和系统态。

程序的执行一般是在用户态下执行的,但当程序需要使用操作系统提供的服务时,比如说打开某一设备、创建文件、读写文件等,就需要向操作系统发出调用服务的请求,这就是系统调用

当进程发出系统调用申请的时候,会产生一个软中断。产生这个软中断以后,系统会去对这个软中断进行处理,这个时候进程就处于核心态了。

那么用户态和核心态之间的区别是什么呢?

  • 用户态的进程能存取它们自己的指令和数据,但不能存取内核指令和数据(或其他进程的指令和数据)。然而,核心态下的进程能够存取内核和用户地址
  • 某些机器指令是特权指令,在用户态下执行特权指令会引起错误

死锁

死锁:多个进程因循环等待资源而造成无法执行的现象。

产生死锁的原因

  • 竞争资源
  • 进程在运行过程中,请求和释放资源的顺序不当,就有可能产生死锁

产生死锁的必要条件

  • 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
  • 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
  • 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
  • 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

处理死锁的几个方式:

  • 预防死锁:设置某些限制条件来破坏产生死锁的四个必要条件中的一个或者几个。
    • 资源一次性分配,破坏“请求和保持条件”:规定进程在运行之前,都必须一次性地申请其在整个运行过程中需要的全部资源。这样进程在运行期间就不会申请其他的资源。
    • 资源可剥夺,破坏“可剥夺资源”:当一个已经保持了某些资源的进程,再提出新的资源请求而不能得到满足时,必须立刻释放它已经保持的资源,待以后需要时再申请
    • 资源有序分配,破坏“环路等待”:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反
  • 避免死锁:该方法同样是属于事先预防的策略,但是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。比如银行家算法
  • 检测死锁:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
  • 解除死锁:与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行

调度算法

  1. 先来先服务FCFS:从就绪队列中选择一个最先进入该队列的进程来分配处理机。
    FCFS比较有利于长作业。、非抢占、不适合交互式。

  2. 短作业优先SJF:最短的作业最先调度。SJF可以保证最小的平均等待时间。

  3. 优先权调度:每个任务关联一个优先权,调度优先权最高的任务。
    注意:优先权太低的任务一直就绪,得不到运行,出现“饥饿”现象。

  4. 时间片轮转调度:设置一个时间片,按时间片来轮转调度(“轮叫”算法)
    优点: 定时有响应,等待时间较短;缺点: 上下文切换次数较多;
    如何确定时间片?
    时间片太大,响应时间太长;吞吐量变小,周转时间变长;当时间片过长时,退化为FCFS。

  5. 多级队列调度:按照一定的规则建立多个进程队列
    不同的队列有固定的优先级(高优先级有抢占权)
    不同的队列可以给不同的时间片,高优先级的时间片较小。

  6. 多级反馈队列:在多级队列的基础上,任务可以在队列之间移动,更细致的区分任务。

Windows内存管理的方式(页式、段式、段页式)

页式:将一个进程的逻辑地址空间分成若干大小相等的片,称为。相应地也罢物理内存空间分成与页面相同大小的存储快,称为物理块。在为进程分配内存时,以块为单位将进程中的若干页分别装入到多个可以不相邻接的物理块中。

段式:将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。

二者都采用离散分配方式,分页和分段的主要区别有:

  • 页是信息的物理单位,分页是为了实现离散分配以消减内存的外零头,提高内存利用率。分页仅仅是由于系统管理的需要而不是用户的需要。
    段则是信息的逻辑单位,含有一组意义相对完整的信息,目的是为了满足用户需要。

  • 页的大小固定且由系统决定
    段的长度不固定,决定于用户程序

  • 页的作业地址空间是一维的
    段的作业地址空间是二维的:段名+段内地址

除此之外,还有将段式和页式结合起来的段页式:分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。

内存连续分配

连续分配指为一个用户程序分配一个连续的内存空间。

  • 单一连续分配:只能由于单用户、单任务的操作系统中。内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式无需进行内存保护。

  • 固定分区分配:固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。

  • 动态分区分配:动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的。

虚拟存储器

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

之所以将其称为虚拟存储器,是因为这种存储器实际上并不存在,只是由于系统提供了部分装入、请求调入和置换功能后(对用户完全透明),给用户的感觉是好像存在一个比实际物理内存大得多的存储器。虚拟存储器的大小由计算机的地址结构决定,并非是内存和外存的简单相加。

实现方式

  • 分页请求系统:在分页系统的基础上,增加了请求调页功能和页面置换功能。
  • 请求分段系统:在分段系统的基础上,增加了请求调段和分段置换功能。

页面置换算法

若要访问的页面不在内存而需要把它们调入内存,但是内存已经没有空闲空间时,需要从内存中调出一页程序。

  • 最佳置换算法Optimal:选择的被淘汰页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
    但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。

  • 先进先出FIFO:淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。

  • 最近最久未使用LRU:选择最近最长时间未访问过的页面予以淘汰。
    该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。
    需要配合栈来实现:
    这里写图片描述

在访问页面6的时候产生了缺页,此时将最近最久未被访问的页4置换出去。

LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;
FIFO算法实现简单,但性能差。

  • Clock置换算法:为每页设置一个访问位,再将内存中的左右页面都通过指针链接成一个循环队列。
    • 当某页被访问时,其访问页被置为1
    • 在需要淘汰某页时
      • 如果页的访问位是0则换出
      • 如果为1则重新置为0,暂不换出,再按照FIFO算法检查下一个页面。当检查到队列中最后一个页面时若其访问位仍为1,则返回队首去检查第一个页面。

可以看出这个算法使循环地检查各页的使用情况。

  • 最少使用LFU:使用一个移位寄存器来记录页面被访问的频率,选择最近最少使用的页面来淘汰。
  • 页面缓冲算法PBA
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值