【Linux】进程探秘

文章目录

  • 一、什么是进程?
    • 1.1写一个进程
  • 二、操作系统是如何管理的进程的呢?
    • 2.1描述进程-PCB
    • 2.2组织进程
  • 三、Linux下是怎么做的?
    • 3.1task_struct-PCB的一种
    • 3.2task_ struct内容分类
    • 3.3linux中组织进程
    • 3.4查看进程的相关属性
  • 🍀小结🍀

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

🎉博客主页:小智_x0___0x_

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

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

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


一、什么是进程?

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

ps axj
#或者
top

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

1.1写一个进程

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

#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("我是一个进程\n");sleep(1);}return 0;
}

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

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

在这里插入图片描述

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

在这里插入图片描述

我们平时写的代码,编译成可执行程序之后都是通过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

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

🍀小结🍀

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125137.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud Alibaba - Seata 四种分布式事务解决方案(XA、AT)+ 实践部署(上)

目录 一、Seata 分布式事务解决方案 1.1、XA 模式 1.1.1、XA模式理论 第一阶段&#xff1a; 第二阶段&#xff1a; 1.1.2、Seata 框架中的 XA 模式 第一阶段&#xff1a; 第二阶段&#xff1a; 1.1.3、XA 模式的优缺点 1.2.4、实现Seata 的 XA 模式 a&#xff09;修改…

数组结构与算法

文章目录 数据结构与算法稀疏数组sparse队列单向链表双向链表单向环形列表&#xff1a;CircleSingleLinkedList栈递归排序算法快速排序思路 树赫夫曼树 &#xff08;HuffmanTree&#xff09;二叉排序树&#xff08;Binary sort tree&#xff09;构建二叉树遍历二叉树 平衡二叉树…

1300*B. Sort the Array(排序构造)

题意&#xff1a; 一个无重复数字的序列&#xff0c;能否反转一个区间使其成为单增序列。 解析&#xff1a; 记录每个点的值和初始下标&#xff0c;然后排序。 对于排好序的序列进行遍历&#xff0c;找出第一段和原序列下标不同的区间并且标记&#xff08;此区间即为翻转的区…

便携式脑卒中检测仪是不是离现实不远了?

摘要&#xff1a;本文介绍一个轻量级人工智能的应用--基于tinyML的便携式低成本脑部微波成像系统。参考资料为DOI&#xff1a; 10.1109/ISCAS46773.2023.10181746 医疗资源从来都是稀缺资源。 我们都经历过在医院CT和核磁共振室外排队的情况。即使您万分紧急&#xff0c;也只能…

计算机网络(六):应用层

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 应用层概述 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分 早期基于文本的应用 (电子邮件、远程登…

逐步解决Could not find artifact com:ojdbc8:jar:12

Could not find artifact com:ojdbc8:jar:12 in central (https://repo.maven.apache.org/maven2) 原因&#xff1a; ojdbc8:jar:12 属于Oracle 数据库链接的一个程序集&#xff0c;缺失的话很有可能会影响数据库链接&#xff0c;蝴蝶效应产生不可预测的BUG&#xff01;但是版…

新手学习Python用哪个软件比较好?

对于新手学习Python&#xff0c;有几个常用的集成开发环境&#xff08;IDE&#xff09;可以选择。以下是一些受欢迎的选择&#xff0c;可供题主参考下载使用。 集成开发环境&#xff08;IDE&#xff09; 1. PyCharm&#xff1a; PyCharm 是一款功能强大的 Python IDE&#x…

【软件测试】软件测试的基础概念

一、一个优秀的测试人员需要具备的素质 技能方面&#xff1a; 优秀的测试用例设计能力&#xff1a;测试用例设计能力是指&#xff0c;无论对于什么类型的测试&#xff0c;都能够设计出高效的发现缺陷&#xff0c;保证产品质量的优秀测试用例。这就需要我们掌握设计测试用例的方…

(四)正点原子STM32MP135移植——u-boot移植

一、概述 u-boot概述就不概述了&#xff0c;u-boot、kernel、dtb三件套&#xff0c;dddd 经过国庆艰苦奋战&#xff0c;已经成功把所有功能移植好了 二、编译官方代码 进入u-boot的目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf u-boot-stm32mp-v2022.10-stm32mp-r1-r0.…

手动实现BERT

本文重点介绍了如何从零训练一个BERT模型的过程&#xff0c;包括整体上BERT模型架构、数据集如何做预处理、MASK替换策略、训练模型和保存、加载模型和测试等。 一.BERT架构   BERT设计初衷是作为一个通用的backbone&#xff0c;然后在下游接入各种任务&#xff0c;包括翻译…

反素数

198. 反素数 - AcWing题库 最大的反素数也就是约数个数最多的数中最小的那个数&#xff0c;可以考虑分解质因子形式 2、3、5、7、11、13、17、19、23、29这些&#xff0c;还有每个质因子的指数一定大于等于下一个质因子的指数&#xff0c;这样可以保证约数最多的时候数字尽可能…

力扣 -- 873. 最长的斐波那契子序列的长度

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int lenLongestFibSubseq(vector<int>& nums) {int nnums.size();unordered_map<int,int> hash;for(int i0;i<n;i){hash[nums[i]]i;}int ret2;vector<vector<int>> dp(n,v…