【面试笔记】操作系统一

237 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

操作系统

什么是操作系统?

操作系统是管理计算机硬件和软件资源的计算机程序,提供一个计算机用户与计算机硬件系统之间的接口。向上对用户程序提供接口,向下接管硬件资源。操作系统本质上也是一个软件,作为最接近硬件的系统软件,负责处理器管理、存储器管理、设备管理、文件管理和提供用户接口。

操作系统有哪些分类?

操作系统常规可分为单道批处理操作系统、多道批处理操作系统、分时操作系统、实时操作系统。若一个操作系统兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能,则称该系统为通用操作系统。常见的通用操作系统有:Windows、Linux、MacOS等。

什么是内核态、用户态?

为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。

1、内核态是操作系统管理程序执行时处理器所处的状态,能够执行包含特权指令在内的一切指令(特权指令(不允许用户程序使用)+ 非特权指令),能够访问系统内所有的存储空间。

2、用户态是用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间。

用户程序运行在用户态,操作系统内核运行在内核态。

什么是系统调用?

我们运行的程序基本都是运行在用户态,如果我们调用操作系统提供的系统态级别的子功能咋办呢?那就需要系统调用了!

也就是说在我们运行的用户程序中,凡是与内核态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。

系统调用按功能大致可以分为:

  • 文件管理。完成文件的读、写、创建及删除等功能。
  • 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
  • 进程通信。完成进程之间的消息传递或信号传递等功能。
  • 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。

如何实现内核态和用户态的切换?

处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。

(1)系统调用,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。

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

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

并发和并行

(1)并发(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,在单个周期内只运行了一个指令

(2)并行(parallelism):指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令

阻塞和非阻塞

(1)阻塞是指调用线程或者进程被操作系统挂起。
(2)非阻塞是指调用线程或者进程不会被操作系统挂起。

同步与异步

(1)同步是阻塞模式,异步是非阻塞模式。
(2)同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
(3)异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时,系统会通知进程进行处理,这样可以提高执行的效率。

什么是进程?

进程是资源分配的基本单位,是独立运行的基本单位,是一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文(context)中。

上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用寄存器、程序计数器等。

进程(进程实体、进程映像)一般由以下的部分组成:PCB(进程控制块)、程序段、数据段

PCB是什么?(常考)

  • PCB主要包含下面几部分的内容:

    • 进程的描述信息,比如进程的名称,标识符,
    • 处理机的状态信息,当程序中断时,保留此时的信息,以便 CPU 返回时能从断点执行
    • 进程调度信息,比如阻塞原因,状态,优先级等等
    • 进程控制和资源占用,同步通信机制,链接指针(指向队列中下一个进程的 PCB 地址)
  • PCB 的作用

    • PCB是进程实体的一部分,是操作系统中最重要的数据结构

    • 由于它的存在,使得多道程序环境下,不能独立运行的程序成为一个能独立运行的基本单位,使得程序可以并发执行

    • 系统通过 PCB 来感知进程的存在。(换句话说,PCB 是进程存在的唯一标识)

    • 进程的组成可以用下图来表示,PCB 就是他唯一标识符。

      图片说明

进程的基本操作

1、进程的创建:fork

2、回收子进程:waitpid

3、加载并运行程序:execve

进程和线程创建和撤销的过程中发生了什么事情?

进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还。

此外,撤销父进程,则必须撤销所有的子进程。(撤销的过程实际上就是对这棵家族树进行后序遍历的过程)
在应用中创建一个子进程的过程如下:

  • 申请空白的PCB
  • 初始化进程描述信息
  • 为进程分配资源以及地址空间
  • 将其插入就绪队列中

当进程完成后,系统会回收占用的资源,撤销进程,而引发进程撤销的情况有:进程正常结束或者异常结束,外界的干预(比如我们在任务管理器中强制停止某个进程的运行)。

  • 查找需要撤销的进程的 PCB
  • 如果进程处于运行状态,终止进程并进行调度
  • 终止子孙进程 - 归还资源
  • 将它从所在的队列中移除

进程的五种状态

面试在答的时候这么答:有创建状态、就绪状态、运行状态、阻塞状态、结束状态。

  • 其中只有就绪状态和运行状态能互相转化,当进程为就绪态时,等待 CPU 分配时间片,得到时间片后就进入 运行状态
  • 运行状态在使用完 CPU 时间片后,又重回就绪态。
  • 阻塞状态是进程在运行状态时,需要等待某个资源比如打印机资源,而进入一个挂起的状态,等资源拿到后会回到就绪状态,等待 CPU 时间片。(进程用系统调用的方式请求系统资源或请求等待某个事件发生)