Skip to content

Commit

Permalink
zombie process
Browse files Browse the repository at this point in the history
  • Loading branch information
wolverinn committed Dec 3, 2019
1 parent fcac8be commit b9232e7
Showing 1 changed file with 52 additions and 2 deletions.
54 changes: 52 additions & 2 deletions Operating Systems.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急
- 互斥:多个进程在同一时刻只有一个进程能进入临界区
</details>

##### 并发、并行、异步的区别?

### 进程有哪几种状态?

![Process State](_v_images/20191202090217863_1873.png)
Expand All @@ -138,7 +140,7 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急

### 进程调度策略有哪些?

1. 批处理系统:
1. **批处理系统**

<details>
<summary>先来先服务 first-come first-serverd(FCFS)</summary>
Expand Down Expand Up @@ -170,7 +172,7 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急
响应比 = 1+ 等待时间/处理时间。同时考虑了等待时间的长短和估计需要的执行时间长短,很好的平衡了长短进程。非抢占,吞吐量高,开销可能较大,提供好的响应时间,无饥饿问题。
</details>

2. 交互式系统
2. **交互式系统**
交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。

<details>
Expand Down Expand Up @@ -206,6 +208,24 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急
- 优先级继承(priority inheritance):当任务A申请共享资源S时,如果S正在被任务C使用,通过比较任务C与自身的优先级,如发现任务C的优先级小于自身的优先级,则将任务C的优先级提升到自身的优先级,任务C释放资源S后,再恢复任务C的原优先级。
</details>

### 什么是僵尸进程?
一个子进程结束后,它的父进程并没有等待它(调用wait或者waitpid),那么这个子进程将成为一个僵尸进程。僵尸进程是一个已经死亡的进程,但是并没有真正被销毁。它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程表中保留一个位置,记载该进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)供父进程收集,除此之外,僵尸进程不再占有任何内存空间。这个僵尸进程可能会一直留在系统中直到系统重启。

危害:占用进程号,而系统所能使用的进程号是有限的;占用内存。

以下情况不会产生僵尸进程:
- 该进程的父进程先结束了。每个进程结束的时候,系统都会扫描是否存在子进程,如果有则用Init进程接管,成为该进程的父进程,并且会调用wait等待其结束。
- 父进程调用wait或者waitpid等待子进程结束(需要每隔一段时间查询子进程是否结束)。wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。waitpid则可以加入```WNOHANG```(wait-no-hang)选项,如果没有发现结束的子进程,就会立即返回,不会将调用waitpid的进程阻塞。同时,waitpid还可以选择是等待任一子进程(同wait),还是等待指定pid的子进程,还是等待同一进程组下的任一子进程,还是等待组ID等于pid的任一子进程;
- 子进程结束时,系统会产生```SIGCHLD```(signal-child)信号,可以注册一个信号处理函数,在该函数中调用waitpid,等待所有结束的子进程(注意:一般都需要循环调用waitpid,因为在信号处理函数开始执行之前,可能已经有多个子进程结束了,而信号处理函数只执行一次,所以要循环调用将所有结束的子进程回收);
- 也可以用```signal(SIGCLD, SIG_IGN)```(signal-ignore)通知内核,表示忽略```SIGCHLD```信号,那么子进程结束后,内核会进行回收。

##### 什么是孤儿进程?
<details>
<summary>展开</summary>

一个父进程已经结束了,但是它的子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程会被Init(进程ID为1)接管,当这些孤儿进程结束时由Init完成状态收集工作。
</details>

### 线程同步有哪些方式?

> 为什么需要线程同步:线程有时候会和其他线程共享一些资源,比如内存、数据库等。当多个线程同时读写同一份共享资源的时候,可能会发生冲突。因此需要线程的同步,多个线程按顺序访问资源。
Expand All @@ -222,6 +242,36 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急
互斥量是可以命名的,可以用于不同进程之间的同步;而临界区只能用于同一进程中线程的同步。创建互斥量需要的资源更多,因此临界区的优势是速度快,节省资源。
</details>

### 什么是死锁?

在两个或者多个并发进程中,每个进程持有某种资源而又等待其它进程释放它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁(deadlock)。

### 死锁产生的必要条件?
- 互斥:一个资源一次只能被一个进程使用;
- 占有并等待:一个进程至少占有一个资源,并在等待另一个被其它进程占用的资源;
- 非抢占:已经分配给一个进程的资源不能被强制性抢占,只能由进程完成任务之后自愿释放;
- 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系,该环路中的每个进程都在等待下一个进程所占有的资源。

### 死锁有哪些处理方法?
<details>
<summary>鸵鸟策略</summary>

直接忽略死锁。因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。
</details>

<details>
<summary>死锁预防</summary>

基本思想是破坏形成死锁的四个必要条件:
- 破坏互斥条件:允许某些资源同时被多个进程访问。但是有些资源本身并不具有这种属性,因此这种方案实用性有限;
- 破坏占有并等待条件:
- 实行资源预先分配策略(当一个进程开始运行之前,必须一次性向系统申请它所需要的全部资源,否则不运行);
- 或者只允许进程在没有占用资源的时候才能申请资源(申请资源前先释放占有的资源);
- 缺点:很多时候无法预知一个进程所需的全部资源;同时,会降低资源利用率,降低系统的并发性;
- 破坏非抢占条件:
- 破坏循环等待条件:
</details>

### 参考
- [进程间通信IPC -- 简书](https://www.jianshu.com/p/c1015f5ffa74)
- [面试/笔试第二弹 —— 操作系统面试问题集锦 - CSDN博客](https://blog.csdn.net/justloveyou_/article/details/78304294)
Expand Down

0 comments on commit b9232e7

Please sign in to comment.