【Linux课程学习】:进程描述---PCB(Process Control Block)

🎁个人主页:我们的五年

🔍系列专栏:Linux课程学习

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

1.基本概念:

🥝进程的概念

🥝进程描述的引入

🥝PCB的概念:

[PCB(Process Control Block)](#PCB(Process Control Block))

🍒Linux最早版本的task_struct有那些属性:

​编辑

🍒查看进程的信息:

方法一:

方法二:

​编辑🍒进程里的两个重要信息:

[cwd(current work dir):可以更改](#cwd(current work dir):可以更改)

exe:

进程的分类

⚽️常驻进程:

⚽️非常驻程序:

[PCB中标识符---pid(Process Identifier):](#PCB中标识符---pid(Process Identifier):)

🏀pid的引入:

🏀如何在程序中获得pid:

🏀如何通过进程pid杀死一个进程:

PCB---ppid:


1.操作系统OS也是一个软件,在开机的时候被加载到内存进行运行,到这里才能让操作系统帮我们去运行其他的程序。

2.为什么要有PCB?(先描述,再组织)

因为操作系统要管理进程,管理系统之前就必须对进程进行描述。

3.命令也是一个进程,过滤查看的时候能查到。

4.让程序运行起来,本质就是启动了一个进程。命令也是系统中的一个命令,所以我们执行命令的时候,也是启动了一个进程。

5.ps查看进程的信息其本质也是去/proc目录下查找。

6./proc不是磁盘级的文件,是内存级的。

7.命令行执行,都是bash进程创建子进程,然后通过子进程程序替换达到要运行程序的目的。

这样当执行的程序发生错误,也不影响bash进程。

8.(void)取消编译器对不用变量的警告。

9.Linux进程时树形结构。


1.基本概念:

🥝进程的概念

进程的概念
课本概念 程序的一种执行实例,正在执行的程序。
内核观念 担当分配系统资源的实体(CPU,内存)。

🥝进程描述的引入

我们写的程序(code.c)首先要编译成二进制程序(code.exe)。这两个程序都是文件,保存在磁盘中。

要想让code.exe文件运行,首先code.exe要加载到内存中,加载的本质是拷贝,也就是把code.c拷贝到内存中。(input)

在计算机中,会有很多的进程,要管理进程,就要对进程进行描述。把对应的文件加载到内存中,不单单要加载它的代码和属性,还有为它创建一个struct进行描述。进程的描述有进程的一系列属性。

🥝PCB的概念:

进程信息会放到一个叫进程控制块的数据结构中,可以理解为进程属性的集合。包含进程的属性。

在Linux操作系统中的PCB是task_struct。

每一个进程都会有一个PCB进行管理。

进程=PCB(task_struct)+代码和数据。

所以一个进程被加载到内存,最本质的操作系统为其在进程管理列表中创建了一个PCB(task_struct)。

进程在等待被运行,其也是task_struct在进行等待。task_struct中有属性信息,可以根据这些信息进行先后排队。


PCB(Process Control Block)

🍒Linux最早版本的task_struct有那些属性:

🍒查看进程的信息:

方法一:

ps ajx | grep (进程名):查看此时进程信息。

ps ajx |head -1:打印属性名称,

;或者&&:可以执行多条命令。

ps ajx | head -1 && ps ajx | grep code | grep -v grep :只查看./code的信息。

ps的底层就是去/proc中查找。

为什么我们查code程序的时候,会有code?

上面我们执行的命令也是一个进程,执行到code命令的时候,也是一个进程,它的关键字也有code,所以也过滤出来了。

方法二:

在更目录下的proc目录中查看进程的信息:

ls /proc:查看所有进程的信息。

每一个目录代表一个进程,目录里面就是该进程的信息。

每次我们新建一个进程,就会在这个文件夹中新建一个以该进程pid为名称的文件夹,这个文件夹存放我们新建进程的信息。

当我们删掉这个进程时,刚刚新建的文件被删除了,所以这个文件的信息是动态更新的。(所以它是内存级的)

🍒进程里的两个重要信息:

cwd(current work dir):可以更改

表示当前的工作路径,如果我们不表示路径,直接新建一个文件,会用cwd的路径进行文本拼接,就让新建的文件在当前的目录。

当进程启动的时候,就会记录当前所在的路径。

改变cwd

chdir:可以改变进程的cwd路径

通过这样的方法,可以验证程序是根据cwd路径进行创建文件的。

 #include <stdio.h>                                                                                                                                                                                             
 #include <unistd.h>
 #include <stdlib.h>
 
 int main()
 {
     chdir("/home/kym/linux-code");
     FILE* fp=fopen("log.text","w");
 
     while(1)
     {
         printf("我的pid是:%d\n",getpid());
         sleep(1);
     }
     fclose(fp);
     return 0;
 }

exe:

表示该可执行程序在磁盘的哪个位置。当程序启动的时候,如果我们根据这个路径去删除可执行文件。此时刚刚执行的文件不会停止。因为当程序运行,它会拷贝到内存中,而我们删除的是磁盘中的文件。

此时的exe显示文件被delete


进程的分类

⚽️常驻进程:

用户不主动关闭,就一直存在。比如我们启动的应用。

⚽️非常驻程序:

执行完就会退出的程序。比较一系列的指令:ls,pwd指令。


PCB中标识符---pid(Process Identifier):

🏀pid的引入:

我们使用的系统中,会有很多的进程,但是靠进程的名字字符串去区分不同的进程有点不方便,而且可能还会有相同名字的进程,这样就更不好区分了。所以给每个进程都引入了一个唯一的标识符pid。

标识符(pid):描述本进程的唯一标识符,用于区分别的进程。

🏀如何在程序中获得pid:

通过函数getpid获得,返回值就是该进程的pid值。一个程序只要不是重新被加载到内存进行运行,它的pid是不变的,所以只要getpid一次,保存好pid就可以了。

pid_t定义的一种类型,其本质就是整数。

头文件:

#include <sys/types.h>
#include <unistd.h>

函数原型:

pid_t getpid(void);
pid_t getppid(void);

🏀如何通过进程pid杀死一个进程:

kill -9 (进程pid):-9表示SIGKILL

通过信号进行杀死进程。


PCB---ppid:

ppid代表父进程的pid值。

新建的进程都是由父进程创建的,每一个进程都会有父进程,bash进程除外。

当我们每次运行同样一个程序,发现每次的ppid都是一样的。然后我们通过ps查的这个pid是bash进程的pid。

相关推荐
周末不下雨2 分钟前
win11+ubuntu22.04双系统 | 联想 24 y7000p | ubuntu 22.04 | 把ubuntu系统装到1T的移动固态硬盘上!!!
linux·运维·ubuntu
Beau_Will16 分钟前
数据结构-树状数组专题(1)
数据结构·c++·算法
哎呦喂-ll42 分钟前
Linux进阶:环境变量
linux
耗同学一米八44 分钟前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题四
运维·网络
Rverdoser44 分钟前
Linux环境开启MongoDB的安全认证
linux·安全·mongodb
hunandede1 小时前
av_image_get_buffer_size 和 av_image_fill_arrays
c++
PigeonGuan1 小时前
【jupyter】linux服务器怎么使用jupyter
linux·ide·jupyter
东华果汁哥1 小时前
【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录
linux·运维·服务器
咖喱鱼蛋2 小时前
Ubuntu安装Electron环境
linux·ubuntu·electron