• 【Linux】进程探秘


    在这里插入图片描述
    在这里插入图片描述

    🎉博客主页:小智_x0___0x_

    🎉欢迎关注:👍点赞🙌收藏✍️留言

    🎉系列专栏:Linux入门到精通

    🎉代码仓库:小智的代码仓库


    一、什么是进程?

    一个程序想要运行,就必须加载到内存中,那么我们把一个已经加载到内存中的程序,叫做进程!(也可以叫做任务)
    我们在Windows操作系统下,可以通过任务管理器来查看进程Ctrl+Shift+Esc:
    在这里插入图片描述
    在Linux下,我们可以通过下面指令进行查看进程:

    ps axj
    #或者
    top
    
    • 1
    • 2
    • 3

    上面这两个指令都可以用来查看进程>
    在这里插入图片描述

    1.1写一个进程

    我们来写一个C语言程序,通过编译来形成可执行程序。

    #include 
    #include 
    
    int main()
    {
        while(1)
        {
            printf("我是一个进程\n");
            sleep(1);
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编译之后形成可执行程序myprocess:
    在这里插入图片描述
    此时这个myrocess是一个可执行程序,在我们冯诺依曼体系结构来看,这个文件目前存放在磁盘中,属于外设,我们可以通过./myprocess来将这个可执行程序加载到内存中,加载完成运行起来之后它就会变成一个进程。

    ps axj | grep myprocess
    #ps axj查看所有进程通过管道传给grep来过滤出含有myprocess的进程
    
    • 1
    • 2

    在这里插入图片描述

    ps axj| head -1 && ps axj | grep myprocess
    #ps axj使用管道传递给head将表头属性打印出来
    # ps axj查看所有进程通过管道传给grep来过滤出含有myprocess的进程
    # 两个通过&&链接起来
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    我们平时写的代码,编译成可执行程序之后都是通过CPU来运行的,CPU想要拿到这些数据只能通过内存来获取,所以可执行程序先要加载到内存中,我们日常开机的时候就是将操作系统从磁盘中加载到内存,再通过CPU来运行。
    我们再来画图理解一下一个可执行程序变成进程的过成>
    在这里插入图片描述
    一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。操作系统必须将进程管理起来!

    二、操作系统是如何管理的进程的呢?

    通过上篇操作系统是如何进行管理的我们可以知道,操作系统想要管理就必须还是这6个字>先描述,再组织!!!
    操作系统先定义一个进程结构体struct里面包含了进程的各种属性,一个对象表示一个进程,再使用结构体指针将这些对象组织起来,这样就能完成对进程的管理,其实就是对链表数据的增删查改!

    2.1描述进程-PCB

    在计算机中,进程是由一个或多个线程执行的计算机程序实例。它包含程序代码和当前活动。进程由操作系统内核管理,为每个进程创建和维护一个称为进程控制块(PCB)的数据结构。PCB 包含有关进程的信息,例如其进程 ID、状态、优先级、内存使用情况、指针信息和其他相关细节。操作系统使用此信息来高效地管理和调度进程。
    课本上称之为PCB(process control block),

    2.2组织进程

    操作系统将所有PCB对象通过链表组织起来存储在内核里,将对进程的管理,变成了对PCB单链表的管理。
    在这里插入图片描述

    三、Linux下是怎么做的?

    Linux操作系统下的PCB是: task_struct.

    3.1task_struct-PCB的一种

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

    3.2task_ struct内容分类

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

    3.3linux中组织进程

    Linux内核中最基本的组织进程task_struct的方式,采用的是双链表组织的,在Linux中,PCB不仅仅在双链表中,还存在于内核用于管理进程的其他数据结构中。例如,每个进程都有一个称为进程ID(PID)的唯一标识符,存储在PCB中,并由内核用于识别和管理进程。 PCB还包含有关进程状态、优先级、内存使用情况和其他相关细节的信息。

    3.4查看进程的相关属性

    进程的信息可以通过 /proc 系统文件夹查看
    在这里插入图片描述
    proc 是 Linux 系统下的一个目录,关机后,目录里面的信息全都没了,开机的时候操作系统会帮我们创建对应的目录和文件。proc 目录下的所有信息都是 Linux 操作系统用文件系统的方式把内存中的文件包括进程信息给我们展现出来,其中蓝色的数字表示一个目录,该数字就是进程的唯一标识 PID。该目录里面保存了进程的所有属性。

    • 如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。
      在这里插入图片描述
      大多数进程信息同样可以使用 top和ps这些用户工具来获取。
      比如我们的myprocess进程:
      在这里插入图片描述
      这里我们发现除了./myprocess进程,这里还有一个grep -- color=auto myprocess的进程,这是因为我们在使用grep过滤内容的时候,首先先要将grep加载入内存中运行,成为一个进程被CPU调度才能进行过滤,而这个进程名中也包含了myprocess所以最终过滤会出现两个进程。我们也可以通过-v选项来去除掉包含grep的进程。
    head -1 && ps axj | grep myprocess |grep -v grep
    
    • 1

    在这里插入图片描述
    我们再来查看一下myprocess这个进程在/proc目录下的内容
    在这里插入图片描述在一个进程中,当前工作目录(cwd)是进程当前正在执行的目录。它是进程的一个属性。比如我们使用touch创建一个文件,在只写文件名的情况下,touch这个进程就会默认在当前目录下查找文件或者将创建的文件放在当前目录下。exe 是一个链接文件,它就指向当前进程所对应的可执行程序的路径。
    我们来举个例子:
    在这里插入图片描述
    重新编译跑起来之后我们可以看到在当前目录下创建了一个log.txt
    在这里插入图片描述
    我们没在程序中写我们的当前目录,程序确能在我们的根目录下创建文件,是因为程序执行时,会将cwd中的目录拼接在log.txt之前fopen("cwd/log.txt","w");

    🍀小结🍀

    今天我们学习了"Linux进程探秘"相信大家看完有一定的收获。种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!
    在这里插入图片描述

  • 相关阅读:
    java枚举中写抽象方法
    【JAVA】关于接口你又了解多少呢?
    【机器学习、python】线性回归
    Spring Cloud项目(八)——使用gateway作为服务网关
    如何在WPF网格中隐藏行
    Kubernetes 学习总结(38)—— Kubernetes 与云原生的联系
    Python抽象类和接口类型
    【WPF应用31】WPF基本控件-ListView的详解与示例
    IPsec_SSL VPN身份鉴别过程简要
    如何准备面试流程需要做什么
  • 原文地址:https://blog.csdn.net/xz2935117143/article/details/133463559