常见面试题

1. 什么是操作系统

操作系统是运行在计算机.上最重要的一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层。

通常情况下,计算机上会运行着许多应用程序,他们都需要对内存和CPU进行交互,操作系统就是为了保证这些访问和交互能够准确无误的进行。

2. 操作系统的主要目的是什么

操作系统是-种软件,它的主要目的有三种

  • 管理计算机资源,这些资源包括CPU、内存、磁盘驱动器、打印机等。
  • 提供一种图形界面,就像我们前面描述的那样,它提供了用户和计算机之间的桥梁。
  • 为其他软件提供服务,操作系统与软件进行交互,以便为其分配运行所需的任何必要资源。

3. 什么是按需分页

在操作系统中,进程是以页为单位加载到内存中的,按需分页是一种虛拟内存的管理方式。在使用请求分页的系统中,只有在尝试访问页面所在的磁盘并且该须面尚未在内存中时,也就发生了缺页异常,操作系统才会将磁盘页面复制到内存中。

4. 多处理系统的优势

随着处理器的不断增加,我们的计算机系统由单机系统变为了多处理系统,多处理系统的吞吐量比较高,多处理系统拥有多个并行的处理器,这些处理器共享时钟、内存、总线、外围设备等。

5. 什么是内核

在计算机中,内核是-个计算机程序,它是操作系统的核心,可以控制操作系统中所有的内容。内核通常是在boot loader装载程序之前加载的第一个程序。

boot loader又被称为引导加载程序,它是一个程序,能够将计算机的操作系统放入内存中。在电源通电或者计算机重启时,BIOS 会执行一-些初始测试,然后将控制权转移到引导加载程序所在的主引导记录(MBR)。

6. 什么是实时系统

实时操作系统对时间做出了严格的要求,实时操作系统分为两种:硬实时和软实时
硬实时操作系统规定某个动作必须在规定的时刻内完成或发生,比如汽车生产车间,焊接机器必须在某一时刻内完成焊接,焊接的太早或者太晚都会对汽车造成永久性伤害。
软实时操作系统虽然不希望偶尔违反最终的时限要求,但是仍然可以接受。并且不会引起任何永久性伤害。比如数字音频、多媒体、手机都是属于软实时操作系统。
你可以简单理解硬实时和软实时的两个指标:是否在时刻内必须完成以及是否造成严重损害。

7. 什么是虚拟内存

虛拟内存是一种内存分配方案,是一项可以用来辅助内存分配的机制。我们知道,应用程序是按页装载进内存中的。但并不是所有的页都会装载到内存中,计算机中的硬件和软件会将数据从RAM临时传输到磁盘中来弥补内存的不足。如果没有虚拟内存的话,一旦你将计算机内存填满后,计算机会对你说呃,不,对不起,您无法再加载任何应用程序,请关闭另一个应用程序以加载新的应用程序。对于虚拟内存,计算机可以执行操作是查看内存中最近未使用过的区域,然后将其复制到硬盘上。虚拟内存通过复制技术实现了妹子,你快来看哥哥能装这么多程序的资本。复制是自动进行的,你无法感知到它的左在。

8. 什么是进程和进程表

进程就是正在执行程序的实例,比如说Web程序就是一个进程,shell 也是一个进程,文章编辑器typora也是一个进程。
操作系统负责管理所有正在运行的进程,操作系统会为每个进程分配特定的时间来占用CPU,操作系统还会为每个进程分配特定的资源。
操作系统为了跟踪每个进程的活动状态,维护了一个进程表。在进程表的内部,列出了每个进程的状态以及每个进程使用的资源等。
http://courses.cs.vt.edu/csonline/OS/Lessons/Processes/index.html这个网站上面有一个关于进程状态轮转的动画,做的真是太好了。

9. 什么是线程,线程和进程的区别

这又是一道老生常谈的问题了,从操作系统的角度来回答一下吧。
我们上面说到进程是正在运行的程序的实例,而线程其实就是进程中的单条流向,因为线程具有进程中某些属性,所以线程又被称为轻量级的进程。浏览器如果是一个进程的话,那么浏览器下面的每个tab页可以看作是一个个的线程。
下面是线程和进程持有资源的区别

image-20200813222928103

线程不像进程那样具有很强的独立性,线程之间会共享数据。
创建线程的开销要比进程小很多,因为创建线程仅仅需要堆栈指针和程序计数器就可以了,而创建进
程需要操作系统分配新的地址空间,数据资源等,这个开销比较大。

10 什么是RR调度算法

RR(round-robin)调度算法主要针对分时系统,RR的调度算法会把时间片以相同的部分并循环的分配给每个进程,RR调度算法没有优先级的概念。这种算法的实现比较简单,而且每个线程都会占有时间片,并不存在线程饥饿的问题。

11 导致系统出现死锁的情况

死锁的出现需要同时满足下面四个条件

  • 互斥(Mutual Exclusion) : 一次只能有一个进程使用资源。如果另一个进程请求该资源,则必须延迟请求进程,直到释放该资源为止。
  • 保持并等待(Hold and Wait) :必须存在一个进程,该进程至少持有一个资源,并且正在等待获取其他进程当前所持有的资源。
  • 无抢占(No Preemption) :资源不能被抢占,也就是说,在进程完成其任务之后,只能由拥有它的进程自动释放资源。
  • 循环等待(Circular Wait) :必须存在一组 {p0,p1, …. pn}的等待进程,使p0等待p1持有的资源,p1等待由p2持有的资源,pn-1 正在等待由pn持有的资源,而pn正在等待由p0持有的资源。

12 什么是DMA

DMA的中文名称是直接内存访问,它意味着CPU授予I/O模块权限在不涉及CPU的情况下读取或写入内存。也就是DMA可以不需要CPU的参与。这个过程由称为DMA控制器(DMAC) 的芯片管理。由于DMA设备可以直接在内存之间传输数据,而不是使用CPU作为中介,因此可以缓解总线上的拥塞。DMA通过允许CPU执行任务,同时DMA系统通过系统和内存总线传输数据来提高系统并发性。

13 多线程编程的好处是什么

为了提高程序的并行能力了。多线程在某些情况下能够使你程序运行的更快,这也是为什么多核CPU会出现,但是多核CPU的出现会导致数据的一致性问题,不过这些问题程序员就能解决。另一个角度来说,多线程编程能够提高程序员的编程能力和编程思维。同时也能提高程序员的管理能力。

Doug Lea大佬开发的JUC工具包。

14 进程间的通信方式

通信概念
进程间的通信方式比较多,首先你需要理解下面这几个概念

  • 竞态条件:即两个或多个线程同时对一共享数据进行修改,从而影响程序运行的正确性时,这种就被称为竟态条件(race condition)

  • 临界区:不仅共享资源会造成竞态条件,事实上共享文件、共享内存也会造成竞态条件、那么该如何避免呢?或许一句话可以概括说明:禁止一个或多个进程在同一时刻对共享资源(包括共享内存、共享文件等)进行读写。换句话说,我们需要一种互斥(mutual exclusion) 条件, 这也就是说,如果一个进程在某种方式下使用共享变量和文件的话,除该进程之外的其他进程就禁止做这种事(访问统一资源)。
    一个好的解决方案,应该包含下面四种条件

    1. 任何时候两个进程不能同时处于临界区
    2. 不应对 CPU的速度和数量做任何假设
    3. 位于临界区外的进程不得阻塞其他进程
    4. 不能使任何进程无限 等待进入临界区
  • 忙等互斥:当一个进程在对资源进行修改时,其他进程必须进行等待,进程之间要具有互斥性,我们讨论的解决方案其实都是基于忙等互斥提出的。

image-20200813230006014
  • 消息传递:消息传递是进程间实现通信和同步等待的机制,使用消息传递,进程间的交流不需要共享变量,直接就可以进行通信;消息传递分为发送方和接收方
  • 先进先出队列:先进先出队列指的是两个不相关联进程间的通信,两个进程之间可以彼此相互进程通信,这是一种全双工通信方式
  • 管道:管道用于两个相关进程之间的通信,这是一种半双工的通信方式,如果需要全双工,需要另外一个管道。
  • 直接通信:在这种进程通信的方式中,进程与进程之间只存在一条链接,进程间要明确通信双方的命名。
  • 间接通信:间接通信是通信双方不会直接建立连接,而是找到一个中介者,这个中介者可能是个对象等等,进程可以在其中放置消息,并且可以从中删除消息,以此达到进程间通信的目的。
  • 消息队列:消息队列是内核中存储消息的链表,它由消息队列标识符进行标识,这种方式能够在不同的进程之间提供全双工的通信连接。
  • 共享内存:共享内存是使用所有进程之间的内存来建立连接,这种类型需要同步进程访问来相互保护。

15 进程间状态模型

1
cat chapter1 chapter2 chapter3 I grep tree

第一个进程是cat ,将三个文件级联并输出。第二个进程是grep ,它从输入中选择具有包含关键字tree的内容,根据这两个进程的相对速度(这取决于两个程序的相对复杂度和各自所分配到的CPU时间片),可能会发生下面这种情况,grep 准备就绪开始运行,但是输入进程还没有完成,于是必须阻塞grep进程,直到输入完毕。
当一个进程开始运行时,它可能会经历下面这几种状态

image-20200813230402249
  1. 运行态 ,运行态指的就是进程实际占用CPU时间片运行时
  2. 就绪态,就绪态指的是可运行,但因为其他进程正在运行而处于就绪状态
  3. 阻塞态,除非某种外部事件发生,否则进程不能运行

逻辑上来说,运行态和就绪态是很相似的。这两种情况下都表示进程可运行,但是第二种情况没有获得CPU时间分片。第三种状态与前两种状态不同的原因是这个进程不能运行,CPU空闲时也不能运行。

三种状态会涉及四种状态间的切换,在操作系统发现进程不能继续执行时会发生状态1的轮转,在某些统中进程执行系统调用,例如pause ,来获取一个阻塞的状态。在其他系统中包括UNIX,当进程从管道或特殊文件(例如终端)中读取没有可用的输入时,该进程会被自动终止。

转换2和转换3都是由进程调度程序(操作系统的一部分)引起的,进程本身不知道调度程序的存在。转换2的出现说明进程调度器认定当前进程已经运行了足够长的时间,是时候让其他进程运行CPU时间片了。当所有其他进程都运行过后,这时候该是让第一个进程重新获得CPU时间片的时候了,就会发生转换3。

程序调度指的是,决定哪个进程优先被运行和运行多久,这是很重要的一点。已经设计出许多算法来尝试平衡系统整体效率与各个流程之间的竞争需求。

当进程等待的一个外部事件发生时(如从外部输入-些数据后),则发生转换4。如果此时没有其他进程在运行,则立刻触发转换3,该进程便开始运行,否则该进程会处于就绪阶段,等待CPU空闲后再轮到它运行。

16 调度算法都有哪些

调度算法分为三大类:批处理中的调度、交互系统中的调度、实时系统中的调度

批处理中的调度

  1. 先来先服务
  2. 最短作业优先
  3. 最短剩余时间优先

交互系统中的调度

  1. 轮询调度
  2. 优先级
  3. 最短进程调度

17 页面置换算法

  • FIFO先进先出
  • LRU 最少使用
  • 时钟

18 影响调度程序的指标是什么

会有下面几个因素决定调度程序的好坏

  • CPU使用率:
    CPU正在执行任务(即不处于空闲状态)的时间百分比。
  • 等待时间
    这是进程轮流执行的时间,也就是进程切换的时间
  • 吞吐量
    单位时间内完成进程的数量
  • 响应时间
    这是从提交流程到获得有用输出所经过的时间。
  • 周转时间
    从提交流程到完成流程所经过的时间。

19 什么是僵尸进程

僵尸进程是已完成且处于终止状态,但在进程表中却仍然存在的进程。僵尸进程通常发生在父子关系的进程中,由于父进程仍需要读取其子进程的退出状态所造成的。

20 用户态和内核态是什么,切换的方式

内核态(Kernel Mode):运行操作系统程序,操作硬件

用户态(User Mode):运行用户程序

特权级别

特权指令:只能由操作系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机

非特权指令:用户程序可以使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)

特权级别

特权环:R0、R1、R2和R3

R0相当于内核态,R3相当于用户态;

不同级别能够运行不同的指令集合;

1)用户态切换到内核态的3种方式

a. 系统调用

​ 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

b. 异常

​ 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

c. 外围设备的中断

​ 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。