Skip to content
Permalink
Browse files

添加僵尸进程

Change-Id: I49c784162bdb11c5efd7be45c963c9d3e36b35cf
  • Loading branch information...
liuxiguang
liuxiguang committed Sep 21, 2019
1 parent 7c75e8d commit 8fdc70fbdf9a119538e284cce4c10d7b81790cd0
@@ -0,0 +1 @@
.DS_Store
@@ -5,6 +5,8 @@

## 文章

[僵尸进程](./src/md/2019-09-21-僵尸进程.md)

[时间轮](./src/md/2019-09-20-时间轮.md)

[时间宝贵 宁静致远](./src/md/2019-07-21-时间宝贵-宁静致远.md)
Binary file not shown.
@@ -0,0 +1,86 @@
---
layout: post
title: "僵尸进程"
date: 2019-09-21 21:00:05 +0800
categories: Linux
---

## 什么是僵尸进程

僵尸进程的概念我看了N次,但总记不住,所以通过本文来加强我的肌肉记忆。

Concept: *Zombie process is child process had beed dead, and its parent is still alive.*

## 僵尸进程有什么危害

僵尸进程其实是一个已经死了的进程,绝大部分资源已经被操作系统回收了,但是其还在占用pid和进程表。如果僵尸进程数量过多,导致操作系统无法创建新的进程(极限情况下pid被用光了,在64位操作系统下几乎不需要担心这个问题)。

## 如何查看僵尸进程

通过 top 命令查看:

![linux check zombie process](../img/top_check_zombie_process.png)

## 为什么会存在僵尸进程

操作系统需要提供一个方法供父进程查看子进程的处理结果(典型的是exit_status),所以操作系统需要维护子进程的信息,即使其已经结束了。

下面我们来简单地创建一个会产生僵尸进程的代码:

```c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define MAX_COUNT 200
#define MAX_SIZE 100
int main(void)
{
pid_t pid;
pid_t child_pid;
child_pid = fork();
pid = getpid();
printf("child_pid: %d pid: %d\n", child_pid, pid);
if (child_pid > 0)
{
printf("parent sleep\n");
usleep(100000000);
}
}
```

僵尸进程的存在不一定是程序的bug,有可能子进程结束了,但是父进程还没调用wait,在某些逻辑下是一个正常的场景。即使父进程没有调用wait,在父进程退出时,操作系统也会回收其下的僵尸进程。

不会长时间存在僵尸进程的代码:

```c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_COUNT 200
#define MAX_SIZE 100
int main(void)
{
pid_t pid;
pid_t child_pid;
child_pid = fork();
pid = getpid();
printf("child_pid: %d pid: %d\n", child_pid, pid);
if (child_pid > 0)
{
waitpid(child_pid, 0, 0);
printf("parent sleep\n");
usleep(10000000);
}
}
```
@@ -0,0 +1,28 @@
---
layout: post
title: "时间轮"
date: 2019-09-20 21:00:05 +0800
categories: 算法
---

## 打日志

## 线上排查问题checklist

atop

load

ioswait

openstack/k8s计算

1. System load:描述队列中等待CPU的进程数量
2. Load average:1,5,15分钟System load的平均值

Linux会将处于等待网络、磁盘IO、系统调用的process也算进其中

这里指的process是指线程还是进程?

zombie process is actually dead.

0 comments on commit 8fdc70f

Please sign in to comment.
You can’t perform that action at this time.