操作系统面试会问到的知识点
进程
是资源分配的基本单位。
组成:PCB,程序段,数据段。
PCB:进程标识符,进程当前状态,优先级,程序段和数据段地址,资源清单。
linux进程组成:BSS段,代码段,堆、栈段,数据段
BSS段(Block Started by Symbol),存放程序中的未初始化或初始化为0的全局变量。静态内存分配区。
数据段,通常存放已经初始化的全局变量。静态内存分配区。
代码段,存放程序执行的代码。在程序运行前就确定,并通常为只读,但某些架构也能变为可修改。也会存放一些只读的常量。
堆,堆是用于存放动态分配数据的内存段。大小不固定。
栈,用户存放程序临时创建的局部变量,不包括static声明变量。先进后出。

父子进程出了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.进程状态
- 创建
- 就绪
- 运行
- 阻塞
- 结束

只有就绪态和运行态可以相互转换,其它的都是单向转换。
创建->就绪:申请PCB,并写入控制和管理的信息。分配运行时所需资源。
就绪->运行:进程获得CPU运行时间,得到调度。
运行->就绪:进程时间片用完,或更高优先级任务出现,等待调度。
运行->阻塞:进程等待运行资源(不包括CPU运行资源)或等待某一事件完成,如I/O中断。
阻塞->就绪:进程阻塞获得了所需资源(不包括CPU运行资源)或事件完成。
运行->结束:进程运行完毕,或异常或手动终止。
4.外中断和异常中断
外中断是CPU执行指令以外的事件引起,比如I/O中断、时钟中断、控制台中断等。
异常中断是CPU执行指令内部事件引起,比如非法操作码、地址越界、算数溢出等。