006 Linux 进程的概念 | 获取进程的PID

前言

本文将会向您进程的概念,程序与进程的区别,如何获取进程的标识符-pid

文章重点

1.描述进程------PCB

进程与程序的区别

CPU对进程列表的处理

2.获取进程PID

描述进程-PCB

进程概念

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

区分程序和进程

1.程序:程序本质上就是一个文件,是静态的,存储在磁盘中
2.进程:程序运行起来之后,就叫做进程,进程是动态的,由操作系统进行管理
1 . 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
2. 课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct。

c 复制代码
struct data
{
//id 标识符 
//代码/函数地址 
//状态(是否被CPU处理)
//优先级
struct data* next 
}

这个进程属性的结构体被称为PCB,也叫做进程控制块

进程具体的属性如下:

标示符: 描述本进程的唯一标示符,用来区别其他进程。 状态: 任务状态,退出代码,退出信号等。 优先级: 相对于其他进程的优先级。

程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。 I/O状态信息:

包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。 记账信息:

可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。 其他信息

CPU对于进程列表的处理

进程被链接到链表中会等待CPU去PCB找数据做处理,那么CPU怎么知道要处理哪些数据呢?

进程排队:把对应的PCB从链表中提取到队列中排队,PCB中的数据不会一次性被CPU处理完,它有时被处理,有时在等待被处理


结论

进程 = 可执行程序+内核数据结构(PCB)

进程标识符

每一个进程都有自己对应的pid,查看当前进程的信息:

什么是进程的pid呢?

进程的pid是指进程的唯一标识符,即进程ID(ProcessID)。每个正在运行的进程都有一个唯一的pid,用于操作系统在管理和跟踪进程时进行标识和区分。

c 复制代码
ps ajx

这种方式将全部的进程信息打印了出来,不太好观察学习

可以利用死循环来观察

c 复制代码
 #include<stdio.h>  
 #include<unistd.h>  
 int main()  
 {
     while(1) //死循环
     {
         printf("我已经是一个进程了\n");
         sleep(1); //休眠一秒                                                                                                                                         
     }                                       
     return 0;                           
 }

我们可以使用以下命令来获取进程的标识符pid

c 复制代码
在所有进程中搜索刚写的可执行程序并将进程的第一行打印:
ps ajx | head -1 && ps ajx | grep target | ps ajx | head -1

getpid、getppid

PPID:父进程的标识符

观察到图中两个红色的target行处,第一行是我们启动的进程,第二行是grep这个命令的进程

我们也可以选择另外一种方式来获取进程的pid

man手册中记录了getpid,getppid的使用

我们使用的getpid和getppid是系统调用函数

而在冯诺依曼体系中讲到,如何用户想要访问

底层的数据必须经过系统调用

c 复制代码
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/types.h>
 int main()
 {
	pid_t id = getpid();
	while(1)
	{
		printf("我已经是一个进程了,我的pid是:%d\n",id);
		sleep(1);
	}
 	return 0;
 }


获取父进程pid

c 复制代码
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/types.h>
 int main()
 {
	pid_t id = getpid();
	pid_t parid = getppid();
	while(1)
	{
		printf("我已经是一个进程了,我的pid是:%d...我的ppid是:%d\n",id,parid);
		sleep(1);
	}
 	return 0;
 }

然后我们再运行程序

观察到每一次的运行子进程的pid都会发生改变,而父进程的pid却不会变化

原因是每次运行时,操作系统会为每个新的子进程分配一个唯一的进程标识符(PID)。这是因为PID是一个用于标识进程的数字,它是在操作系统内部维护的一个计数器。当一个进程终止后,其PID就会被释放,并可以被其他新的进程重新使用。
在命令行中,父进程一般是命令行解释器:bash

小结

今日的分享就到这里啦,本文仅仅是对进程的概念进行了描述,后续将会持续更新fork、进程状态等相关知识点,如果本文存在疏漏或错误的地方还请您能够指出!

相关推荐
许白掰1 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
longze_75 小时前
Ubuntu连接不上网络问题(Network is unreachable)
linux·服务器·ubuntu
Dirschs5 小时前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
qianshanxue115 小时前
ubuntu 操作记录
linux
AmosTian8 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
这我可不懂10 小时前
Python 项目快速部署到 Linux 服务器基础教程
linux·服务器·python
车车不吃香菇11 小时前
java idea 本地debug linux服务
java·linux·intellij-idea
tan77º11 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
kfepiza12 小时前
Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709
linux·服务器·笔记·bash
CodeWithMe12 小时前
【Note】《深入理解Linux内核》 第十九章:深入理解 Linux 进程通信机制
linux·运维·php