进程线程(一)进程生命周期(就绪、运行、睡眠、停止、僵死)

本文介绍了Linux系统中进程和线程的概念,强调进程作为资源的封装单位,包括内存、文件系统资源等。提到了进程控制块PCB、进程的创建、状态转换,如就绪、运行、睡眠,并讨论了进程间的通信。还提及了如何通过waitpid函数监控子进程状态,以及僵尸进程的产生和清理。此外,讨论了Linux中限制进程资源的方法,如pid限制,并提及了内存泄漏检测和CPU利用率控制。

该文章参考宋宝华老师的进程视频课程,详细可以去听阅码场宋老师的课程。

1、进程控制块(PCB)

进程是一个 资源 的封装单位,用 task_struct 结构体来描述这些资源,比如,进程的内存啊,文件系统资源(这个进程都打开了哪些文件),

进程 = 资源 , (内存资源,文件系统资源)

线程 = 调度

在Linux 中,"/" 路径是一个进程的概念,并不是一个系统的概念。两个进程打开的同一个路径的文件,可能并不是一个文件。

 每个进程都知道自己的根路径和相对路径

struct files 记录了这个进程所打开的所有文件, 这也是进程的资源。

singal 信号也是进程的资源

pid是有限制的

 :(){:|:&};:

:是一个函数名,{}内是函数体,调用: , 然后建立一个管道,再后台调用:,最后的: 是调用函数。

id 的id 数量是有限的,每个用户能创建的pid也是有限的 ulimit -a 可以查看,

 

linux 跑起来的时候 有很多进程,那有很多 task_struct 怎么连接呢?

linux里面有三种数据结构来连接task_struct ,  链表(方便遍历的时候用),树(方便找父进程),哈希表(方便从pid 找到task_struce)。

 三态图可能更好理解一点,

就绪是在等CPU

运行是 已经拿到CPU

睡眠是在等资源或者是信号

linux 把睡眠分为深度睡眠和浅度睡眠

浅度睡眠:可被两个东西唤醒,信号 signal 来了(有人敲门),或资源 resource 来了(IO等资源)。

深度睡眠:只能被资源唤醒(IO等资源)。

TASK_STOPPED  这个状态,是程序暂停的状态,是不占CPU资源的,就是被一棒子打晕了。

 给程序发一个 SIGSTOP(ctrl + z ) ,程序就会暂停下来(此时可能占用资源很大,暂停之后资源就空闲出来了),此时你可以去干别的事情,干完了之后再恢复SIGCONT (fg/bg)  fg前台运行,bg是后台运行

linux 进程是如何创建的呢?形象点的过程如下图

 父进程 知道 子进程 是否死亡是非常重要的。下面举一个例子

#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
	pid_t result, wait_pid;
	int status;

	result = fork();

	if(result == -1){
		perror("can not create new process");
		exit(1);
	}else if (result == 0){
			printf("child process id: %ld\n", (long)getpid());
			pause();
			exit(0);
	}else{	
			printf("parent process id:%d\n", getpid());
#if 0
			/* define 1 to make child process always a zomie */

			while(1);
#endif
			printf("parent process wait for child...\n");
			do {
				wait_pid = waitpid( result, &status, WUNTRACED | WCONTINUED);

				if (WIFEXITED(status))
						printf("child process exites, status=%d\n", WEXITSTATUS(status));
			
				if (WIFSIGNALED(status))
						printf("child process is killed by signal %d\n", WTERMSIG(status));
			
				if (WIFSTOPPED(status))
						printf("child process is stopped by signal %d\n", WSTOPSIG(status));

				if (WIFCONTINUED(status))
						printf("child process resume running...\n");
			} while( !WIFEXITED(status) && !WIFSIGNALED(status));
			
			exit(0);
	}



	return 0;
}

这个程序,子进程一直在pause, 什么都不做,父进程一直在等待回收子进程(waitpid),此时可以得知是由于什么原因死掉的。

 此时如果将父进程中的waitpid 去掉,则子进程就会变成一个僵尸进程。

 从子进程退出,到父进程waitpid回收,这段时间子进程就是一个僵尸状态,一旦父进程waitpid回收了,僵尸状态就没了

 

 此时要想清理僵尸进程,只能杀死 父进程

 

 

 检测内存泄漏的方法是 连续多点采样法

 

在linux 中有一条命令,cpulimit 来限制cpu的利用率,这个就是早期控制cpu利用率的一个方法,但是现在一般很low了,都是用cgroup. 这里只是拓展看下 进程的 stop状态的概念。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值