进程的概念 | PCB的认识

进程是一个执行中的程序实例,包含程序代码、数据和PCB。PCB是进程存在的标识,其中存储了进程的属性如PID和PPID。操作系统通过调度PCB来管理进程,进行上下文切换以分配CPU时间。当时间片结束,进程会保存上下文并重新排队,等待被调度。在Linux中,可以使用`ps`命令查看进程,`getpid()`和`getppid()`获取PID和PPID。
摘要由CSDN通过智能技术生成

进程的定义

进程最经典的定义:进程是一个正在执行的程序的实例

系统中的每一个程序运行在进程的上下文中,上下文由程序正在运行的各种状态组成。

进程实体包含几个元素:程序代码 + 程序数据 + 描述进程的数据集合
在这里插入图片描述
【注意】进程是动态的,而进程实体是静态的。

这个描述进程的数据集合,使用结构体封装起来,这些结构体被称为PCB(进程控制块,是process control block的缩写),PCB在进程形成的时候由系统自动创建的,里面存放着进程的各种属性信息,每个进程都拥有自己的PCB,它是进程存在的唯一标识,会被装载到内存里。

struct PCB
{
  //该进程的各种属性信息
};

Linux系统下的PCB是叫做task_struct.

struct task_struct
{
   //描述进程的各种属性信息
};

操作系统管理进程的实质是对PCB进行管理,一个系统中可能会存在大量的PCB,为了更好地管理且有效地利用CPU的资源,系统会把将这些PCB组织起来,就像链表中的节点那样,不同的系统会以不同的方式组织。
在这里插入图片描述

PCB里包含的内容

在这里插入图片描述

关于进程的标识符,每个进程都有唯一的标识符,用于区分其他进程。

在大学里,对于老师点名大部分都采用学号ID,这是因为其他的单个信息不足以标识你,就比如说名字有可能重名,年龄有可能相同……而ID是唯一标识你的。而在系统中可能存在大量进程,为了精准的找到某进程,就需要一个能够唯一标识某个进程的标识符,那就是进程ID,简称PID(process ID)。而创建该进程的进程称为父进程,父进程的ID称为PPID。

获得PID、PPID的系统调用有:
在这里插入图片描述
注明:
1】要使用这两个函数需要包含头文件<sys/types.h>和<unistd.h>
2】getpid函数返回的是该进程的PID,getppid:返回的是其父进程的PID
3】pid_t 实际上是typedef出来的无符号整型
4】这两个函数总是执行成功的。

//例如
1 # include <stdio.h>
2 # include <sys/types.h>                                                                                                                                         
3 # include <unistd.h>
4 int main(void)
5 {
6   printf("hello,PID: %d \n", getpid());
7   printf("hello PPID: %d\n", getppid());
8   return 0;
9 }

在这里插入图片描述
而用户标识符,则是判断当前是哪个用户拥有该进程。

这里还要谈及一些事情
在这里插入图片描述
每个进程在使用CPU资源的时候,都会有一个时间限制,能占据CPU的最大时间限度被称为时间片,进程单次时间片到了,如果还没有执行完,那么就继续排队,等待进程的调度(调度,平常指的是调动的意思,所以这里的调度是指调动进程),如果已经结束了那么就直接退出。
我们需要考虑进程单次时间片没有执行完的情况,
在这里插入图片描述
我用黄色标识的PCB,现在正在使用CPU……
然而它还未执行完,但是时间已经到了
所以黄色PCB继续排队,等待着被调度,以便继续完成执行。
在这里插入图片描述
现在CPU的各种寄存器里面保存了黄色PCB执行的部分信息

在这里插入图片描述
如果直接调度绿色的PCB,那么刚才黄色PCB执行的部分信息,就被覆盖了。
当黄色PCB再次被调度的时候,上次执行的信息都没有了,那么是不是又该重新来呢?

所以需要把刚才CPU里的所有寄存器信息,拷贝一份到刚才被调度的进程里。然后才调度另一进程。CPU里的所有寄存器信息,可以理解为就是进程上下文,而切换一个进程,则可以理解为上下文切换。所以进程需要把它的上下文信息保存在PCB里面。

查看进程

在Linux系统中如何查看一个进程?
当一个程序运行起来的时候,会形成进程,
查看进程的命令:pa axj

如果你仅仅使用这个样子则会出现很多个你认识或者不认识的进程信息。
所以可以过滤:
ps axj | grep 文件名

查看的时候就可以过滤掉其他的进程信息了
运行以下程序

//文件mycode.c
1 # include <stdio.h>
2 # include <unistd.h>
3 # include <sys/types.h>
4 
5 int main(void)
6 {
7   while(1)
8   {
9    printf(" hello, pid:%d ,ppid:%d\n", getpid(), getppid());
10    sleep(2);
11                                                                                                                                     
12   }
13   return 0;
14 }

可以另开一个窗口,使用如下命令查看

[YDY@VM-0-2-centos day2]$ ps axj | grep "mycode"
27686 30624 30624 27686 pts/0    30624 S+    1000   0:00 ./mycode
30138 30660 30659 30138 pts/1    30659 R+    1000   0:00 grep --color=auto mycode

但是各种没有提示,是因为提示在第一行,而我们把它过滤掉了

[YDY@VM-0-2-centos day2]$ ps axj | head -1 && ps axj | grep "mycode"
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
27686 32082 32082 27686 pts/0    32082 S+    1000   0:00 ./mycode
30138 32194 32193 30138 pts/1    32193 R+    1000   0:00 grep --color=auto mycode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小酥诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值