操作系统面试会问到的知识点


进程

是资源分配的基本单位。

组成:PCB,程序段,数据段。

PCB:进程标识符,进程当前状态,优先级,程序段和数据段地址,资源清单。

linux进程组成:BSS段,代码段,堆、栈段,数据段

BSS段(Block Started by Symbol),存放程序中的未初始化或初始化为0的全局变量。静态内存分配区。

数据段,通常存放已经初始化的全局变量。静态内存分配区。

代码段,存放程序执行的代码。在程序运行前就确定,并通常为只读,但某些架构也能变为可修改。也会存放一些只读的常量。

,堆是用于存放动态分配数据的内存段。大小不固定。

,用户存放程序临时创建的局部变量,不包括static声明变量。先进后出。

PSTATE

父子进程出了PID外,其他都一样,共享全部数据。

1.进程创建

进程有两种创建方式,操作系统创建和父进程创建的。

从计算机启动到终端执行程序的过程为:

0号进程 -> 1号内核进程 -> 1号用户进程(init进程) -> getty进程-> shell进程 -> 命令行执行进程

所有用户进程都是shell的子进程。

2.进程通信

管道

(1)无名管道(内存文件)

是一种半双工的通信方式,数据只能单向流动,而且只能父子进程或兄弟进程间使用。

(2)有名管道(FIFO文件,系统文件)

同样是半双工的通信方式,允许无亲缘关系的进程通信,且先进先出。

共享内存

映射一段能被其他进程所访问的内存,这段内存由一个进程创建,但多个进程都可以访问。共享内存是最快的进程通信(IPC)方式,针对进程通信方式运行效率低而设计的。一般和信号量配合来实现进程同步和通信。

消息队列

消息队列是有消息的链表,存放在内核中,并由消息队列标识符标识。克服了信号传输信息量少、管道只能承载无格式字节流、缓冲区大小限制等问题。

套接字(Socket)

适用于不同机器间进程的通信,同样也能作为本地进程的通信。

信号

用于通知接收进程某个事件已经发生,例如ctrl+C就是信号的一种。

信号量

是一个计数器,用来控制多进程对临界区资源的访问。是锁机制,实现进程、线程对临界区资源的同步互斥访问。

3.进程同步

Linux中

POSIX信号量:用于进程和线程同步。

POSIX互斥锁+条件变量:只能用于线程同步。

同步方法

临界区

定义:对临界资源访问的那段代码叫临界区。

为了互斥访问,进入临界区前需要进行检查。

同步与互斥

同步:多个进程因为合作,需要有一定的执行先后顺序。

互斥:多个进程在同一时刻只有一个进入临界区。

信号量

是一个整型变量,操作时可以增加减少。即P,V操作。

P操作,若信号量大于0,则信号量-1,否则等待信号量大于0。

V操作,释放资源,信号量增加1。

如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。

消费者和生产者问题:

使用一个缓冲区来保存物品,只有缓冲区没有满,生产者才可以放入物品;只有缓冲区不为空,消费者才可以拿走物品。

管程

将控制信号量的代码单独独立出来,不容易出错,且调用更容易。

在一个时刻只能有一个进程使用管程,而进程在无法继续执行的时候,不能一直占用管程

4.进程、线程、协程区别

区别 进程 线程 协程
定义 资源分配的基本单位 程序执行的基本单位 用户态的轻量级线程,线程内部调度的基本单位
切换情况 进程CPU环境(栈、寄存器、页表、文件句柄等)的保存及新调度的进程CPU环境的设置 保存和设置程序计数器、少量寄存器和栈的内容 先将寄存器上下文和栈保存,等切换回来再恢复
切换者 操作系统 操作系统 用户
过程 用户态->内核态->用户态 用户态->内核态->用户态 用户态(无内核)
调用的栈 内核栈 内核栈 用户栈
拥有资源 CPU、内存、文件句柄资源 程序计数器、寄存器、栈、状态字 拥有自己的寄存器上下文和栈
并发性 不同进程之间切换实现并发,各自占有CPU实现并行 一个进程内部的多个线程并发执行 同一时间只能执行一个协程,其他协程处于休眠,适合分时处理
系统开销 切换虚拟地址空间,切换内核栈和硬件,CPU高速缓存失效,页表切换,开销很大 切换时保存和设置少量寄存器,开销小 不用加锁范文全局变量,切换非常快
通信 需要借助操作系统 线程可以直接读写进程数据段进行通信(全局变量) 共享内存、消息队列

线程与进程

进程 线程
资源分配的基本单位(打开文件,堆,静态区,代码段等) CPU调度的基本单位(PC,状态码,通用寄存器,线程栈及栈指针)
拥有系统资源 不拥有系统资源,共享进程的资源,但拥有独立栈空间(属于进程资源),线程之间无法互相访问
切换启动慢 切换启动快,轻量级
开销大 开销小
通信通过操作系统 可直接读取进程数据段

同一个进程内部有多个线程,所有的线程共享同一个进程的内存空间,进程中定义的全局变量会被所有的线程共享,而多个线程被CPU调度的顺序又是不可控的。

线程创建、销毁与切换

创建线程ID,等待主线程调用,调用时会打印线程ID。

无用线程要及时销毁,否则过多线程会使系统浪费时间在线程切换。

线程调度保存线程栈,寄存器数据和PC寄存器(保存下一个执行指令)。

2.进程调度算法

先来先服务(First Come First Serve, FCFS)

非抢占式调度。

定义:按照请求顺序运行。先到来的进程先运行,运行结束后再运行接下来到来的进程。

适用性:利于长作业,不利于短作业,短作业等待时间过长。

短作业优先(Shortest Job First, SJF)

非抢占式调度。

定义:按估计运行时长最短的优先执行。

适用性:长作业可能一直得不到运行。

最短剩余时间优先(Shortest Remaining Time Next, SRTN)

抢占式调度。

定义:短作业优先的抢占式版,新作业到达时,估计剩余最短运行时间运行。

时间片轮转(Round Robin, RR)

抢占式调度。

定义:按照FCFS排成队列,每个进程有一个运行时间片,时间片运行结束而未运行完成,则放到队尾。

适用性:时间片过小,会花费大量开销在进程切换上;时间片过长,则实时性得不到保证。

优先级调度(Priority Scheduling Algorithm, PSA)

抢占式调度。

定义:每个进程分配一个优先级,按优先级进行调度。

适用性:分动态优先级(随等待时间边久而增加程序优先级)和静态优先级(优先级无变化)。

高响应比优先级调度算法(Highest Response Ratio Next, HRRN)

抢占式调度。

定义:是优先级调度算法中的一种,一种计算优先级的方式执行优先级调度算法。

优先级=(等待时间 + 要求服务时间) / 要求服务时间 = 响应时间 / 要求服务时间

多级反馈队列

抢占式调度。

定义:设置多个队列,每个队列时间片都不同,且逐级递增,每个进程首先在一级队列按照时间片调度,若时间片到了没执行完则会被移到下一级队列。队列优先级逐级递减。类似于优先级调度和时间片轮转的结合。

3.进程状态

  • 创建
  • 就绪
  • 运行
  • 阻塞
  • 结束

PSTATE

只有就绪态和运行态可以相互转换,其它的都是单向转换。

创建->就绪:申请PCB,并写入控制和管理的信息。分配运行时所需资源。

就绪->运行:进程获得CPU运行时间,得到调度。

运行->就绪:进程时间片用完,或更高优先级任务出现,等待调度。

运行->阻塞:进程等待运行资源(不包括CPU运行资源)或等待某一事件完成,如I/O中断。

阻塞->就绪:进程阻塞获得了所需资源(不包括CPU运行资源)或事件完成。

运行->结束:进程运行完毕,或异常或手动终止。

4.外中断和异常中断

外中断是CPU执行指令以外的事件引起,比如I/O中断、时钟中断、控制台中断等。

异常中断是CPU执行指令内部事件引起,比如非法操作码、地址越界、算数溢出等。