【Linux】第十二站:进程

编程入门 行业动态 更新时间:2024-10-11 01:14:25

【Linux】第十二站:<a href=https://www.elefans.com/category/jswz/34/1771450.html style=进程"/>

【Linux】第十二站:进程

文章目录

    • 1.windows和linux中的进程
    • 2.先描述
    • 3.在组织
    • 4.具体的Linux系统是如何做的?
      • 1.基本概念
      • 2.描述进程-PCB
      • 3.task_struct和PCB的关系
      • 4.task_struct内容分类
      • 5.linux具体如何做的?
      • 6.查看进程

1.windows和linux中的进程

一个已经加载到内存的程序,叫做进程

进程也叫做任务

比如在windows中,这个任务管理器就可以看到进程

而在linux中,我们使用

ps axj

就可以看到我们的进程了

2.先描述

我们先使用如下代码

如下所示,就可以查看到进程了

在这个过程中,我们的这个可执行程序就会从磁盘中加载到内存中,然后经过CPU,最终输出到显示器上。

这个加载到内存中的程序就是一个进程

像我们电脑的操作系统开机的时候也一样,开机的时候,就是操作系统加载到内存的时候。这也是进程

这些加载到内存,其实就是将这些二进制数据(代码和一些数据)从磁盘中搬到内存中

如下图所示,当一个程序要运行的时候,他需要先将这些二进制文件从磁盘中搬到操作系统中。

但是常识告诉我们,一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程

所以说,操作系统必须将这些进程给管理起来

那么应该如何管理进程呢?

当然还是先描述,在组织

所以任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程属性的结构体对象----PCB(process ctrl block 进程控制块)

这就是类似于人是怎么样辨别认识一个事情或者对象的

当然是都是通过属性认识的。

当属性够多,这一堆属性的集合,就是目标对象

这个PCB就是进程属性的集合

而在C语言中,我们可以用struct结构体来描述这个集合。

这个结构体里面就有进程编号、进程的状态、优先级、相关的指针信息…等等信息

然后根据进程的PCB属性,就可以为该进程创建对应的PCB对象了

不过我们的操作系统除了创建一个PCB对象之外,还要去将代码和数据加载到内存中

就好比我们现在是一个学生,那么PCB就是我们的档案,代码和数据就是我们本人。只有当这两部分都在学校的时候,我们才是这个学校的学生。

所以描述进程的PCB的结构体和该进程的代码和数据合起来才称作进程

所以所谓的进程 = 内核PCB数据结构对象 + 你自己的代码和数据

内核PCB数据结构对象是描述你这个进程的的所有的属性值

所以操作系统要做管理的时候,不需要对我们自己做出管理,只需要对我们这个内核PCB数据结构对象做出管理即可

这个PCB对象里面是有相关的指针信息的,所以可以通过这个PCB对象直接找到我们的

上面这个过程就是一个进程的描述的过程,即先描述

3.在组织

可是我们操作系统经常要持续很多个进程的。所以这就需要组织起来了,从而达到对我们的进程做出管理

为了能够将这些数据组织起来,所以我们可以在每一个PCB对象中加上一个相应的指针,用来找到下一个PCB对象,即如同链表的结构

所以在操作系统中,对于进程的管理,就变成了对于这个单链表的增删查改了

这个PCB就好比我们每个人的简历一样,在我们找工作的时候,HR都是直接对我们的简历做出管理的。当我们投递简历以后,我们会看到在排队中,这个排队就指的是这个PCB在排队。而不是我们本人在排队

4.具体的Linux系统是如何做的?

1.基本概念

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

2.描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

3.task_struct和PCB的关系

  • task_struct 是PCB具体的一种

  • 在Linux中描述进程的结构体叫做task_struct。

  • task_struct是Linux内核的一种数据结构类型(自定义类型),它会被装载到RAM(内存)里并且包含着进程的信息

4.task_struct内容分类

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

5.linux具体如何做的?

在linux中PCB 就是task_struct 结构体,里面包含进程的所有属性

Linux中如何组织进程呢?,linux内核中,最基本的组织进程task_struct的方式,是采用双向链表的

不过要注意的是,有可能这个task_struct既是属于一个双链表,又是属于一个队列的。他是比较复杂的

6.查看进程

我们在前面所演示这个命令就是一个查看进程的命令

ps ajx | head -1 && ps ajx | grep  myprocess

如下所示,我们可以看到两个进程了

前面两个是这个可执行程序由于跑了两份,所以的两份进程。

下面的第三个进程是grep本身的进程,因为它本身也带有myprocess,所以就把它自己的进程过滤出来了。而之前的那些指令的进程早就已经结束了,所以不会显示出来。这里是因为正好grep执行的时候把他自己给过滤出来了

注意看

注意这个ID值,虽然这两个程序是一样的,但是他们的ID是不一样的,虽然将同一个程序执行了两遍,但是它还是两个进程,因为他们创建了两个不同的PCB

除了上面这种方法还有这样一种方法

ls /proc

这个是linux系统中比较重要的,也比较奇怪的一个目录

它在关机的时候数据就全没了,在开机的时候就又会创建这个目录文件

这个其实因为因为操作系统用文件系统的方式把内存当中的文件,包括进程全部可视化出来了

它这上面的数据都是内存级的

我们可以来证明一下

我们先关掉一个进程

当我们再次使用这个

ls /proc

这个指令的时候

对于这些蓝色的数字,我们知道它一定是目录,而对于黑色的我们先不管

而这些蓝色的数字就是当前进程的PID,所以在创建进程的时候,操作系统会创建一个与PID一样名字的文件夹,这个目录里面保存这个进程的大部分属性

我们可以通过这个找到我们这个进程的目录

然后我们可以查看一下这里面的内容

如果我们将我们这个进程之间结束掉,那么我们这里就用这种方法找不到这个进程了,这个目录就自动删除了

如果我们重启一个进程,那么就又出来了

不过这个PID也被改变了。

所以说每一个程序结束以后在重新启动,PID就会变化了,所以他是系统当中动态运行的相关信息。

我们可以进入到它里面就可以看到这个东西,这就足以证明这个就是我们的这个可执行程序的进程

对于这个cwd,就是我们当前进程的工作目录(current work dir)

对于这个cwd,这个是很有用的

比如说当我们使用touch命令创建一个test.c文件的时候,它是如何找到当前的目录呢?

就是进程启动的时候已经记录了当前的目录。所以才找到的

就好比我们之前的文件操作的时候,为什么文件可以创建在当前目录呢?

就是因为进程有这个cwd,记录了当前工作目录,所以可以直接拼接上去。这就是当前路径

更多推荐

【Linux】第十二站:进程

本文发布于:2023-11-16 11:13:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1620076.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进程   Linux

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!