常见面试题

常见面试题


1.操作系统的概念、功能、特性和提供的服务

    操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。操作系统是计算机系统中最基本的系统软件。

操作系统的特性:

  1. 并发
    并发是指两个或多个事件在同一时间间隔内发生。

  2. 共享

    资源共享即共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。

  3. 虚拟

    虚拟是指把一个物理上的实体变为若干逻辑上的对应物。

  4. 异步

    多道程序环境允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停的,它以不可预知的速度向前推进,这就是进程的异步性。

操作系统的功能:

  1. 操作系统作为计算机系统资源的管理者

    1. 处理机管理

      处理机管理可归结为对进程的管理。主要功能包括:进程控制、进程同步、进程通信、死锁处理、处理机调度等。

    2. 存储器管理

      存储器管理是为了给多道程序的运行提供良好的环境,方便用户使用以及提高内存的利用率,主要包括:内存分配与回收、地址映射、内存保护与共享和内存扩充等功能。

    3. 文件管理

      计算机中的信息都是以文件的形式存在的,操作系统中负责文件管理的部分称为文件系统。文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护等。

    4. 设备管理

      设备管理的主要内容是完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率,主要包括缓冲管理、设备分配、设备处理和虚拟设备等功能。

  2. 操作系统作为用户与计算机硬件系统之间的接口

    • 命令接口
    • 程序接口
  3. 操作系统实现了对计算机资源的扩充

2.中断和异常的概念

  • 中断(Interruption)也称外中断,是指来自CPU执行指令外部的事件,通常用于信息输入/输出,如设备发出的I/O结束中断,表示设备输入/输出处理已经完成。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。
  • 异常(Exception)也称内中断,是指来自CPU执行指令内部的事件,如程序的非法操作码、地址越界、运算溢出、虚存系统的缺页及专门的陷入指令等引起的事件。异常不能被屏蔽,一旦出现,就应立即处理。

3.为什么区分核心态和用户态

用户态:

    内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;

核心态:

    当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

两种状态的主要区别:

处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的 ; 而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的。

为啥要区别?

是为了区别执行 特权指令 与非特权指令

在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。

两者之间如何切换?

  • 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
  • 中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
  • 异常
CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。 

4.区分线程和进程及其概念、线程的组成、进程特征

为什么引入进程的概念?

从理论角度看,是对正在运行的程序过程的抽象;
从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统地内在规律,有效管理和调度进入计算机系统主存储器运行的程序。

什么是进程?

狭义定义:进程就是一段程序的执行过程。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统进行资源分配和调度的一个独立单位。

进程有怎么样的特征?

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生的,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行。
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
结构特征:进程由程序、数据和进程控制块三部分组成。

线程的基本概念?

引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

线程是进程中的一个实体,是被系统独立调度和分配的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。

线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。

线程与进程的比较

1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

5.进程的状态转换

1)运行态。进程正在处理机上运行。在单处理机中,每个时刻只有一个进程处于运行态。
2)就绪态。进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
3)阻塞态,又称等待态。进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因的不同,设置多个阻塞队列。
4)创建态。进程正在被创建,尚未转到就绪态。创建进程需要多个步骤:首先申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后把该进程转入就绪态并插入就绪队列。但是,如果进程所需的资源尚不能得到满足,如内存不足,则创建工作尚未完成,进程此时所处的状态称为创建态。
5)结束态。进程正从系统中消失,可能是进程正常结束或其他原因退出运行。进程需要结束运行时,系统首先将该进程置为结束态,然后进一步处理资源释放和回收等工作。
就绪->运行  被调度
运行->就绪  时间片用完或者被抢占
运行->阻塞  请求某一资源(如外设)  (主动)
阻塞->就绪  等待的事件来了(如I/O操作结束或中断结束)  (被动且需要其他相关进程的协助)

6.进程间的通信实现方法

  1. 共享存储
    在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。
  1. 消息传递
    在消息传递系统中,进程间的数据交换以格式化的消息(Message)为单位。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。这种方式隐藏了通信实现细节,使通信过程对用户透明,简化了通信程序的设计,是当前应用最广泛的进程间通信机制。
  1. 管道通信(半双工通信)
管道通信是消息传递的一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道;而接收管道输出的接收进程(即读进程)则从管道中接收(读)数据。
管道可以理解为共享存储的优化和发展,因为在共享存储中,若某进程要访问共享存储空间,则必须没有其他进程在该共享存储空间中进行写操作,否则访问行为就会被阻塞。而管道通信中,存储空间进化成了缓冲区,缓冲区只允许一边写入、另一边读出,因此只要缓冲区中有数据,进程就能从缓冲区中读出,而不必担心会因为其他进程在其中进行写操作而遭到阻塞,因为写进程会先把缓冲区写满,然后才让读进程读,当缓冲区中还有数据时,写进程不会往缓冲区写数据。当然,这也决定了管道通信必然是半双工通信。

7.各种调用算法的特点及其优缺点

  1. 先来先服务(FCFS)调度算法
FCFS调度算法是一种最简单的调度算法,它既可用于作业调度,又可用于进程调度。
FCFS调度算法属于不可剥夺算法。从表明上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面的许多短作业等待很长事件,因此,它不能作为分时系统和实时系统的主要调度策略。但它常被结合在其他调度策略中使用。例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。
特点:
算法简单,但效率低;
对长作业比较有利,但对短作业不利;
有利于CPU繁忙型作业,而不利于I/O繁忙型作业。(一访问I/O就得放弃CPU,排到后面等待去!)
  1. 短作业优先(SJF)调度算法
短作业优先(SJF)调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行;
短进程优先(SPF)调度算法从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发送某事件而阻塞时,才释放处理机。
优点:
平均等待时间、平均周转时间最少。
缺点:
该算法对长作业不利。
该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。
由于作业的长短是根据用户所提供的估计执行时间而定的,而用户又可能会有意无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
  1. 优先级调度算法
该算法中的优先级用于描述作业的紧迫程度。
  1. 高响应比优先调度算法

Rp=+

根据公式可知:
1)作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业,因而类似于SJF。
2)要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而类似于FCFS。
3)对于长作业,作业的响应比可以随等待时间的增加而提高,当其等待时间足够长时,也可获得处理机,克服了“饥饿”现象。
  1. 时间片轮转调度算法
时间片大->一个进程内完全执行完->先来先服务
时间片小->频繁切换->处理机开销增大
影响时间片长短的因素:系统的响应时间、就绪队列中的进程数目和系统的处理能力。
  1. 多级队列调度算法
设置多个就绪队列,同一队列中的进程可设置不同的优先级,这样就能根据用户需求将多个线程分配到一个或多个处理机上运行。
  1. 多级反馈队列调度算法

总结常见进程调度算法表:

先来先服务 短作业优先 高响应比优先 时间片轮转 多级反馈队列
能否是可抢占 队列内算法不一定
能否是不可抢占 队列内算法不一定
优点 公平,实现简单 平均等待时间最少,效率最高 兼顾长短作业 兼顾长短作业 兼顾长短作业,有较好的响应时间,可行性强
缺点 不利于短作业 长作业会饥饿,估计时间不易确定 计算响应比的开销大 平均等待时间较长,上下文切换浪费时间
适用于 作业调度,批处理操作系统 分时系统 相当通用
默认决策模式 非抢占 非抢占 非抢占 抢占 抢占

8.进程间的制约关系

临界资源

虽然多个进程之间可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所用,我们将一次仅允许一个进程使用的资源称为临界资源。
临界资源的访问分为四个部分
1)进入区。为了进入临界区使用临界资源,在进入区要检查可否进入临界区,若能进入临界区,则应设置正在访问临界区的标志,以阻止其他进程同时进入临界区。
2)临界区。进程中访问临界资源的那段代码,又称临界段。
3)退出区。将正在访问临界区的标志清除。
4)剩余区。代码中的其余部分。

同步

直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调工作次序而等待、传递信息所产生的制约关系。
例如,输入进程A通过单缓冲向进程B提供数据。当该缓冲区空时,进程B不能获得所需数据而阻塞,一旦进程A将数据送入缓冲区,进程B就被唤醒。反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲数据时,才唤醒进程A

互斥

间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。
例如,在仅有一台打印机的系统中,有两个进程A和进程B,若进程A需要打印时,系统已将打印机分配给进程B,则进程A必须阻塞。一旦进程B将打印机释放,系统便将进程A唤醒,并将其由阻塞态变为就绪态。

9.进程同步机制应遵循的原则

为禁止两个进程同时进入临界区,同步机制应遵循以下准则:
1)空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
2)忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
3)有限等待。对请求访问的进程,应保证能在有限的时间内进入临界区。
4)让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。

10.什么是管程

代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,称为管程。
管程由4部分组成:
1)管程的名称;
2)局部于管程内部的共享数据结构说明;
3)对该数据结构进行操作的一组过程(或函数);
4)对局部于管程内部的共享数据设置初始值的语句
管程很像一个类,把对共享资源的操作封装起来。

11.什么是死锁,产生死锁的原因、死锁的四个必要条件

所谓死锁,是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外来作用,这些进程都将无法向前推进。
产生死锁的原因:
1)系统资源的竞争
2)进程推进顺序非法
死锁产生的必要条件(若其中任意一个条件不成立,死锁就不会发生)
1)互斥条件:进程要求对所分配的资源(如打印机)进行排他性使用,即在一段时间内某资源仅为一个进程所占有。
2)不剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
3)请求并保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4)循环等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。

12.内存管理的功能

内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。

地址转换。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储器管理必须提供地址变换功能,把逻辑地址转换成
相应的物理地址。

内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。

内存共享。指允许多个进程访问内存的同一部分。例如,多个合作进程可能需要访问同一块数据,因此必须支持对内存共享区域进行受控访问。

存储保护。保证各道作业在各自的存储空间内运行,互不干扰。

13.由源程序到可执行文件的过程

编译。由编译程序将用户源代码编译成若干目标模块。
链接。由编译程序将编译后形成的一组目标模块及它们所需的库函数链接在一起,形成一个完整的装入模块。
装入。由装入程序将装入模块装入内存运行。

14.分段和分页的区别

1.目的
页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页是出于系统管理的需要而不是用户需要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了更好地满足用户的需要。

2.长度
页的大小固定而且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面。
段的长度不固定,决定于用户所编写的程序,通常由编译程序在对程序进行编译时,根据信息的性质来划分。

3.地址空间
页的地址空间是一维的,即单一的线形地址空间,程序员只要利用一个记忆符就可以表示一个地址。
作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需给出段内地址。


4.碎片
分页有内部碎片无外部碎片
分段有外部碎片无内部碎片

内部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

5.绝对地址

处理器使用页号和偏移量计算绝对地址
处理器使用段号和偏移量计算绝对地址

15.虚拟内存的概念、作用、实现方式

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

三个主要特征:
1)多次性。是指无须在作业运行时一次性地全部装入内存,而允许被分成多次调入内存运行。
2)对换性。允许不使用地调出去,正是对换性,才使得虚拟存储器得以正常运行。
3)虚拟性。指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量。

实现方式:
请求分页存储管理。
请求分段存储管理。
请求段页式存储管理。

16.什么是局部性原理

1)时间局部性。程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问过,不久后该数据可能再次被访问。产生的原因使程序中存在着大量的循环操作。
2)空间局部性。一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。

17.页面置换算法

1.最佳(OPT)置换算法
被淘汰页面是最长时间内不再被访问的页面。

2.先进先出(FIFO)页面置换算法
优先淘汰最早进入内存的页面。

3.最近最久未使用(LRU)置换算法
选择最近最长时间未访问的页面予以淘汰。

4.时钟(CLOCK)置换算法
 (1)简单的CLOCK置换算法
 	时钟转圈,设置访问位,又称最近未用算法。
 (2)改进型的时钟置换算法
	在选择页面换出时,优先考虑既未使用过又未修改过的页面。

18.覆盖技术、交换技术

1)覆盖
把用户空间分成一个固定区和若干覆盖区。将经常活跃的数据部分放在固定区,其余部分按调用关系分段。首先将那些即将访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
2)交换
把处于等待状态的程序从内存移到辅存,把内存空间腾出来,这一过程又称换出;
把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称换入。

19.文件的概念

文件(File)是以硬盘为载体的存储在计算机上的信息集合,文件可以是文本文档、图片、程序等。
在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位。

20.文件共享的方法

1.基于索引结点的共享方式(硬链接)
2.利用符号链实现文件共享(软链接)

21.磁盘地址由什么决定?

磁盘安装在一个磁盘驱动器中,它由磁头臂、用于旋转磁盘的主轴和用于数据输入/输出的电子设备组成。
扇区是磁盘可寻址的最小单位,磁盘上能存储的物理块数目由扇区数、磁道数及磁盘面数决定,磁盘地址用“柱面号、盘面号、扇区号”表示。

22.磁盘文件是如何减少寻找时间、减少延迟时间的

目前常用的磁盘调度算法有以下几种:
1)先来先服务
2)最短寻找时间优先
3)电梯调度算法
4)循环扫描算法

23.I/O控制方式(外围设备和内存之间的输入/输出方式)

1)程序直接控制方式:由CPU通过程序不断查询I/0设备是否己做好准备,从而控制I/0设备与主机交换信息。程序直接控制方式虽然简单且易于实现,但是由于CPU和I/0设备只能串行工作,导致CPU的利用率相当低。

(2)中断驱动方式:只在I/O设备准备就绪并向CPU发出中断请求时才予以响应。

(3)DMA方式:主存和I/0 设备之间有一条直接数据通路,当主存和I/O设备交换信息时,无须调用中断服务程序。

(4)通道方式:在系统中设有通道控制部件,每个通道都挂接若干外设,主机在执行I/O 命令时,只需启动有关通道,通道将执行通道程序,从而完成I/O操作。

24.在设备管理子系统中,缓冲区的作用

    (1)缓和CPU与I/O设备之间速度不匹配的矛盾。

    (2)减少对 CPU 的中断频率,放宽对CPU中断响应时间的限制。

    (3)解决基本数据单元大小(即数据粒度)不匹配的问题。

    (4)提高CPU和I/O设备之间的并行性。
posted @   迟意  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示