该文章参考宋宝华老师的进程视频课程,详细可以去听阅码场宋老师的课程。
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状态的概念。


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

1179

被折叠的 条评论
为什么被折叠?



