---
url: https://sugarat.top/offer/experience/os.md
---

# 前端备战之操作系统

内容根据[春招面经](./index.md)整理,文末有面试遇到的相关问题

笔者文笔有限,如有不足之处还请斧正

**文字内容较多,请细细品读,有些点可能有赘述之处,品完此文,面试与此相关的问题,就能得心应手的对付了,还能总结出一套自己的结论**

## 进程

> 进程是一种抽象的概念，从来没有统一的标准定义

### 各式各样的定义

* `进程是可并发执行的程序在一个数据集合上的运行过程`
* `进程是指进程实体的运行过程`
* 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程
* 操作系统进行资源分配和调度的一个独立单位
* 行为的一个规则叫做程序，程序在处理机上执行时所发生的活动称为进程
* 具有一定功能的程序在某个数据集合上的一次活动
* 进程是一个程序与其数据一道通过处理机的执行所发生的活动

### 两个基本属性

* 进程是一个资源分配的基本单位
* 进程是一个可独立调度和分派的基本单位

### 特点

1. 结构性:由程序(段),数据(段),进程控制块(PCB)三部分组成
   * 程序：描述进程要完成的功能
   * 数据：程序执行时所需数据和工作区
   * 进程控制块：进程唯一标识，包含描述信息与控制信息
     * OS感知进程存在的唯一标志
2. 动态性:进程是程序的执行过程
   * 临时产生的，动态产生/消亡
3. 并发性:多个进程可同时存在于内存中,能在一段时间内同时运行
4. 独立性:独立运行的基本单位,独立获得资源与调度的基本单位
   * 进程是系统进行资源分配和调度的一个独立单位
5. 异步性:各自的进程独立的按不可预知的速度推进

### 状态

![](https://img.cdn.sugarat.top/mdImg/MTU4NDMyOTQ0ODQ1OA==584329448458)

* 运行(Running):占用CPU且正在CPU上运行
* 就绪(Ready):已具备运行条件(获取了除CPU以外的其它所需资源),但CPU没有空闲
* 等待/阻塞/睡眠(Waiting/Blocked):因等待某一事件而不能运行

### 低级调度

> 低级调度又称为`进程调度`、微观调度或短程调度

* 非抢占式调度:不允许某进程抢占已经分配出去的处理机。
* 抢占式调度:允许调度程序根据某种原则，暂停正在执行的进程，将处理\*机重新分配给另一进程。
  * 抢占原则
    * 优先权原则
    * 短作业（进程）优先原则
    * 时间片原则

### 进程调度时机

* 一个进程运行完毕，或因某种错误而终止运行
* 当一个进程在运行时变为等待状态（等待I/O）
* 分时系统中时间片到
* 当有一个优先级更高的进程就绪（抢占式）
* 在进程通信中，执行中的进程执行了某种原语操作（P操作，阻塞原语）

### CPU调度过程

即进程**切换步骤**

为了控制进程的执行，内核必须有能力挂起正在CPU上执行的进程，并恢复以前挂起的某个进程的执行，这叫做进程切换、任务切换、上下文切换

* 保存现场：顺序保存，最后一步保存PSW
* 选择要运行的程序
* 恢复现场：最后一步恢复选中进程的PSW

### 通信

* 管道:匿名/具名管道
* 信号量
* 共享内存
* 消息队列
* 套接字

## 线程

* 将进程的两个基本属性分开，线程作为调度的基本单位，不同时作为独立分配资源的单位
* 线程会被频繁调度和切换
* 进程作为拥有资源的单位，不进行频繁切换

### 定义

* 是进程中的一个实体，是被系统独立调度的基本单位

### 好处

* 建一个新线程花费时间少
* 线程的终止时间比进程短
* 同进程内的线程切换时间比进程短
* 因为同一进程内的线程共享内存和文件，因此它们之间相互通信无须调用内核

### 属性

* 轻型实体:基本不拥有资源
* 独立调度的基本单位
* 可以并发执行
* 共享进程资源

### 线程的特征

* 结构性
  * TCB：标识、现场信息(寄存器、PC、栈指针)、调度信息(状态、优先级)
  * 数据块：过程参数、数据、系统与用户堆栈
* 并发性
  * 同一进程中的各线程在同一主存空间，可以共享进程中的所有资源（数据、设备、文件），线程间通信方便
* 共享性
  * 同一进程的各线程
* 动态性
  * 有生命周期，有状态变化，可创建子线程
* 在引入线程的OS中，线程是进程中的一个实体，是被系统独立调度和分派的基本单位
* 线程自己基本不拥有系统资源，只拥有少量必不可少的资源：程序计数器PC、一组寄存器、栈
* 线程可与同属一个进程的其它线程共享进程所拥有的全部资源
* 一个线程可以创建和撤消另一个线程；同一进程中的多个线程之间可以并发执行
* 系统调度的基本单位是线程而不是进程,每当创建一个进程时，至少要同时为该进程创建一个线程，否则该进程无法被调度执行

### 线程间通信方式

* 线程间的通信可以通过共享进程级全局变量

### 通信

* 共享进程级全局变量
* 自定义消息

### 同步方式

* 事件
* 信号量
* 互斥量
* 临界区

## 进程与线程的区别

* 引入进程的目的是为了使多个程序更好的并发执行，改善资源利用率、提高系统效率
* 引入线程则是为了减少并发执行时所付出的时空开销，使并发粒度更细、并发性更好

### 关系

* 一个线程属于一个进程
* 一个进程至少有一个线程
* 资源分配给进程,线程共享其中的资源
* 处理机分配给线程

### 定义

* 进程:可并发执行的程序在一个数据集合上的运行过程
* 线程:是进程中的一个实体，是被系统独立调度的基本单位

### 调度

* 传统OS中，拥有资源、独立调度的基本单位是进程
* 引入线程的系统中，线程是调度和分派的基本单位，而进程是拥有资源的基本单位
* 在同一个进程内线程切换不会产生进程切换，由一个进程内的线程切换到另一个进程内的线程时，将会引起进程切换

### 并发性

在引入线程的系统中，进程之间可并发，同一进程内的各线程之间也能并发执行。因而系统具有更好的并发性

### 资源

无论是传统OS，还是引入线程的OS，进程都是拥有资源的独立单位，线程一般不拥有系统资源，但它可以访问隶属进程的资源。即一个进程的所有资源可供进程内的所有线程共享

### 系统开销

* 进程创建和撤消的开销远大于线程创建和撤消的开销
  * 进程切换时，当前进程的CPU环境要保存，新进程的CPU环境要设置
  * 线程切换时只须保存和设置少量寄存器，并不涉及存储管理方面的操作
* 同一进程内的各线程由于它们拥有相同的地址空间，它们之间的同步和通信的实现也比较容易

### 目的

* 进程:为了使多个程序更好的并发执行，改善资源利用率、提高系统效率
* 线程:为了减少并发执行时所付出的时空开销，使并发粒度更细、并发性更好

### 差异

#### 进程

* 拥有独立的地址空间:一个进程崩溃后，在保护模式下不会对其它进程产生影响

#### 线程

* 只是进程中的不同执行路径
* 有独立的堆栈与局部变量
* 没有单独的地址空间
* 一个线程死掉等于整个进程死掉

#### 小总结

* 多进程程序比多线程程序健壮
* 进程切换时耗费资源更大,效率较差
* 线程执行开销小，但不利于资源的管理和保护
* 要求同时进行又要共享某些变量的并发操作，只能用线程，不能用进程
* 多个线程共享内存，从而极大地提高了程序的运行效率
* 进程在执行过程中拥有独立的内存单元

## 死锁

死锁是指两个或两个以上的进程在执行过程中，由于竞争资源而造成阻塞的现象，若无外力作用，它们都将无法继续执行

### 产生原因

* 竞争资源引起进程死锁
* 可剥夺和非剥夺资源
* 竞争非剥夺资源
* 竞争临时性资源
* 进程推进顺序不当

### 产生条件

1. 互斥条件：涉及的资源是非共享的
   * 涉及的资源是非共享的,一段时间内某资源只由一个进程占用,如果此时还有其它进程请求资源，则请求者只能等待，直至占有资源的进程用毕释放
2. 不剥夺条件：不能强行剥夺进程拥有的资源
   * 进程已获得的资源，在未使用完之前，不能被剥夺，只能在使用完时由自己释放
3. 请求和保持条件：进程在等待一新资源时继续占有已分配的资源
   * 指进程已经保持至少一个资源，但又提出了新的资源请求，而该资源已被其它进程占有，此时请求进程阻塞，但又对自己已获得的其它资源保持不放
     环路等待条件：存在一种进程的循环链，链中的每一个进程已获得的资源同时被链中的下一个进程所请求
     在发生死锁时，必然存在一个进程——资源的环形链

### 解决办法

只要打破四个必要条件之一就能有效预防死锁的发生

## 面试相关问题

> 能力有限,这里就没有留下个人的回答了,避免带入误区,影响到读者的总结,我相信读者可以根据上文中知识点的描述,能总结出自己的结论

### 1.线程与进程的概念?

### 2.线程与进程的区别?

### 3.线程如何工作的?

### 4.进程如何工作的?

### 5.进程与线程是如何通信的?

### 6.进程/线程之间如何进行切换的?

### 7.线程和进程的关系?

### 8.什么是死锁?为什么会出现?如何避免?
