【Linux进程篇】——从零开始:进程初始化与PCB精粹

 W...Y的主页 😊

代码仓库分享💕


 

前言: 上一篇文章中,我们学习了计算机的冯诺依曼体系结构以及操作系统的底层原理,今天就让我们从进程开始学习。

目录

进程

 基本概念

描述进程-PCB

task_struct-PCB的一种

task_ struct内容分类

组织进程

查看进程

通过系统调用获取进程标示符


进程

由冯诺依曼体我们知道所有的文件信息都是必须先经过内存的,一些应用也就是我们所说的可执行程序,它是先转化为二进制文件,然后再加载到内存中去的。

我们的电脑中是否在同一时间只能运行一个软件呢?当我们在使用浏览器时我们也可以听音乐,聊微信……这就证明我们可以同时运行多个.exe文件。

 基本概念

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

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

那这些程序加载到内存中去后,操作系统是如何管理这些程序呢?操作系统会定义一个结构体进行描述每一个进程的所有信息。

描述进程-PCB

当我们将可执行程序都加载到内存中去后,操作系统并不认识每一个执行程序是什么,就好比两个陌生人来到一所不属于他们的大学,当校长知道两个人来的时候就会问你们两是谁,这就证明学校没有这两个人的信息。

所以操作系统再开到加载到内存的二进制程序后,会给予他们一个结构体变量,将其中的属性进行填写即可,这就是PCB进程控制块——process ctrl block。

概念:为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。

Linux系统下的PCB为——task_struct

task_struct-PCB的一种

在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

操作系统对进程的管理,转化成了对PCB的管理,也就是对链表的增删查改。

所以:进程 = 内核数据结构 + 可执行程序

未来对所有进程的控制和操作都只和进程的PCB有关,和进程的可执行程序无关!!!如果愿意,我们可以将PCB放到任何一种数据结构中进行管理。

task_ struct内容分类

那task_ struct进程管理块中里面有什么属性呢?

上图是task_struct的源码,在这里我只截取了一小部分,里面的属性非常多,今天我们来看几个有代表性的:

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

查看进程

 指令:

ps  + ajx :查看当前Linux下所有运行的进程。

 上图是我的当前进程。

我们可以写一段程序来进行运行,来查看一下当前进程的状态:

上述程序为myprocess.c,编译后的可执行程序为myprocess,我们进行监视如下图:

证明:我们执行的程序、指令……都是进程。操作系统内部数据都是进程!!!

通过系统调用获取进程标示符

进程id(PID)
父进程id(PPID)

我们在任务管理器中可以看出每一个进程中都有一个PID唯一标识符——进程id,还有起进程的父进程id——PPID,我们怎么可以获取他们呢?

在系统指令(man 2中)有一条指令getpid,它可以获取对应的进程PID,返回值为pid_t。我们可以写一段程序进行查看:

 

 

获取PPID与或取PID的方法类似,getPPID函数。

我们可以编写代码进行查看:

 我们可以通过监视窗口看打印出来的PID与PPID和Linux监视窗口打印出来的一样!

但是我们每次重新启动一个进程时,他的PID一直会变,但是PPID一直不变,所以我们启动的所有程序都是bash的子进程,bash是我们的命令行解释器。


以上就是本次全部内容,感谢大家观看!!!

  • 18
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

W…Y

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

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

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

打赏作者

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

抵扣说明:

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

余额充值