进程(2)进程概念与基本操作

本章目标

1.进程组成与课本上的对比

2.Linux描述进程信息的数据结构PCB/tast_struct

3.查看进程

4.通过系统调用获取进程的唯一标识符

1.进程组成与课本上的对比

在学校中大多数教材给进程的定义是运行中的程序.

但在实际的一款操作系统当中一个进程要有以下几个部分构成

1.描述进程信息的pcb

2;进程地址空间

3.页表

4.数据和代码

5.一个或者多个执行流(线程)

这个几个概念我们全部放在一起来说过于复杂.

我们今天刚开始.我们就将进程当为是

只有一个执行流的进程

它的构成是内核数据结构(pcb)+代码和程序

我们在这里统一概念,我们在刚才讲述了什么是进程

那么什么不是进程

在我们电脑中所有软件在没启动的时候,所有数据和代码都保存在磁盘当中

它在我们的路径下有特定的路径

我们管这种没有启动的二进制可执行文件,我们统一下说法,管它叫程序

当一个程序启动的时候我们就要为他创建内核数据结构pcb去描述它的信息,将它的代码与数据加载到内存当中,我们能够通过pcb去找到它的代码与数据

进程一旦创建就需要从操作系统处获取资源,内存,时间片等等

所以进程在内核角度来看,它是承载操作系统分配资源的基本实体

2.Linux描述进程信息的数据结构PCB/tast_struct

在操作系统当中我们管描述进程信息的数据结构叫做pcb,process control block

不过操作系统学科为了保持它的正确性,它的观点要放在所以操作系统都是正确的

但是实际上各个操作系统对于pcb的描述各有差异

我们今天介绍下在Linux下描述进程的数据结构task_struct

以下所有内核代码主要有两个版本的内核代码提供

0.11和2.6.0

操作系统通过pcb对进程进行管理,pcb里面保存的就是该进程的信息

下面我们先笼统的介绍以下

1.标识符

在操作系统中,进程是通过结构体和结构体内部自身类型的指针串联在一起的

为了区分每一个进程,操作系统给每一个进程分配了一个唯一标识符,pid,它的类型是pid_t


在我们层层跳转pid的类型实际上就是整型.它是最后被操作系统进行了封装

2.运行状态

在操作系统当中,为了将进程正在进行的动作进行区分.以及当进程退出时的进行进行描述操作系统通过位图的方式将各种运作中以及退出时的状态以比特位的方式保存到pcb中,这么做最大的好处就是节省空间.

进程有的是正在运行,有的因为正在等待输入输出而状态为阻塞,也可能被挂起



3.优先级

因为操作系统中,我们可能有上百个进程,而大多数电脑的cpu只有一个寄存器只有一套

这就造成资源有限,资源有限造成的后果就是我们需要让重要的进程有限执行.

这就催生出了优先级的概念.在后面我们关于优先级的话题还会涉及到nice值以及在linux的调度算法(o(1))等话题,在今天我们只先在task_struct中先简单看一眼

4.程序计数器

当我们将一个程序启动变为进程,我们的代码不是一次性全部执行完的.

它回因为各种原因.

时间片轮转,系统调用进入内核态.软中断,时钟中断等待原因,而导致进程切出去了我们为了记住当前程序正在运行时运行到了哪里,我们通过一个寄存器eip将当前正在执行代码的下一行进行保存.方便我们下一次切换回来的时候从当前行继续执行.

不过这种方案也有问题,在多线程的情况下,会导致数据不一致的问题.需要加锁

不过这都是后话了

这个东西和下面的上下文数据我们全部选用0.11内核的代码.

在2点几以上的内核将这个东西从task_struct移除了需要通过里面的指针间接找到它.

第87行.

5.内存指针

在文章最开始的时候我们介绍了一个进程的组成.我们通过pcb找到它的代码与数据.

毕竟不能直接执行pcb,那里面并没有我们的代码,它只是一段信息.

而内存指针则指向了进程地址空间的开始与结束,通过指针.这里面涉及的话题有点多.

虚拟内存,页表等.

我们放到后面逐个介绍.我们今天可以对他进行简单理解.我们需要通过这个东西找到代码与数据

我们在这里用的指针并不是一个真正意义上的指针.它是一个整型,它同样的保存着一段地址.

2.6.0内核是

6.上下文数据

所谓的上下文数据就是在代码在运行时产生的临时数据,这些临时数据一般由寄存器保存,我们在上文中提到了,程序并不是一口气执行完的,它可能会在中途被切换走.

而在切换时产生的临时数据就要被保存到pcb,在task_struct中我们单独开了一个结构体去保存这些数据.

寄存器里保存的数据和寄存器是两个概念,寄存器只有一套,而寄存器里的数据则有多个.我们可以将他们理解成语言层面上的左右值.

寄存器是左值,而寄存器里面的数据我们叫做上下文数据.

它则是右值.

右值可不可修改,左值是能够进行修改的.

7.io信息

io状态信息:包括显⽰的I/O请求,分配给进程的io设备和被进程使⽤的⽂件列表。

在早期的操作系统中,能够进行io设备极其有限.我们通过一个整型即可表示

8.记账信息

这个说通俗点理解就是你电脑运行了多长的时间.

在window中我们可以拿一个例子举例

这个cpu的正常运行时间就是记账时间

在linux中也可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号

3.查看进程

我们一般查看进程可以通过ps命令进行查看

powershell 复制代码
ps axj| head -1;ps axj |grep 进程名/pid

或者直接查看/proc这个文件夹,两种方式

powershell 复制代码
ls /proc

4.通过系统调用获取进程的唯一标识符

我们的进程是一般可以分为两个部分,用户空间内核空间,当我们执行代码的时候,我们一般实在用户空间,我们想要获取到当前进程的pid,就需要到pcb里面拿,可是在用户空间的的代码时不能直接访问内核空间的内容.pcb是在内核空间里面的.我要从中获取信息就需要通过系统调用

而获取当前进程的pid的系统调用是getpid();

我们现在实际用一下

我们通过查看当前进程的pid和在程序内部调用的pid是一致的.

相关推荐
超级大只老咪2 小时前
数组的正向存储VS反向存储(Java)
java·开发语言·python
Lime-30902 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
pr_note2 小时前
Vim 常用快捷键速查
shell·tcl
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 基于JSP的物流信息网的设计与实现为例,包含答辩的问题和答案
java·开发语言
leo__5202 小时前
基于LDA的数据降维:原理与MATLAB实现
开发语言·matlab·信息可视化
asdfg12589632 小时前
JS中的闭包应用
开发语言·前端·javascript
CloudJourney2 小时前
从Unix到OpenEuler及其关键协议解析
服务器·unix
百年渔翁_肯肯2 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix
胡闹542 小时前
Linux查询防火墙放过的端口并额外增加需要通过的端口命令
linux·运维·windows