【Linux】进程探秘

news2024/9/19 11:14:45

文章目录

  • 一、什么是进程?
    • 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.coloradmin.cn/o/1061609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【物联网】STM32的中断机制不清楚?看这篇文章就足够了

在嵌入式系统中&#xff0c;中断是一种重要的机制&#xff0c;用于处理来自外部设备的异步事件。STM32系列微控制器提供了强大的中断控制器&#xff0c;可以方便地处理各种外部中断和内部中断。本文将详细介绍STM32中断的结构和使用方法。 文章目录 1. 什么叫中断2. 中断优先级…

Spring Cloud Gateway:打造可扩展的微服务网关

文章目录 什么是微服务网关&#xff1f;Spring Cloud Gateway的优势使用Spring Cloud Gateway构建微服务网关步骤1&#xff1a;添加依赖步骤2&#xff1a;创建路由配置步骤3&#xff1a;创建过滤器步骤4&#xff1a;运行应用程序 进一步探索结论 &#x1f389;欢迎来到架构设计…

Ubuntu Server CLI专业提示

基础 网络 获取所有接口的IP地址 networkctl status 显示主机的所有IP地址 hostname -I 启用/禁用接口 ip link set <interface> up ip link set <interface> down 显示路线 ip route 将使用哪条路线到达主机 ip route get <IP> 安全 显示已登录的用户 w…

一看就懂系列:阿里云服务器ECS和轻量云服务器对比

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…

【小沐学前端】Windows下搭建WordPress(nginx1.25、PHP8.2、WordPress6.3、MySQL5.7)

文章目录 1、简介1.1 Nginx1.2 PHP1.3 WordPress1.4 MySQL 2、下载2.1 Nginx2.2 PHP2.3 WordPress2.4 MySQL 3、搭建环境3.1 Nginx3.2 PHP3.3 WordPress3.4 MySQL 4、配置WordPress4.1 选择语言4.2 配置数据库4.3 登录界面4.4 常规设置4.5 写作操作 结语 1、简介 WordPress是基…

波奇学C++:AVL树

AVL解决二叉搜索树退化成链表&#xff0c;保证左右子树高度不差过1&#xff0c;尽可能接近满二叉树 AVL树的性质&#xff1a;高度差&#xff08;平衡因子&#xff09;的绝对值不超过1&#xff08;-1/0/1&#xff09; 平衡因子&#xff1a;右子树高度-左子树高度 用平衡因子控…

Netron可视化深度学习网络结构

有时候&#xff0c;我们构建网络模型想要直观的查看网络详细结构图&#xff0c;但是苦于没有办法。但是有了Netron以后&#xff0c;我们就可以将对应的onnx模型直接可视化&#xff0c;这样不仅可以观察网络的详细结构图&#xff0c;还可以查看网络每一层的具体参数&#xff0c;…

【算法练习Day12】树的递归遍历非递归遍历

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 递归遍历前序遍历中序遍历后…

23.3 Bootstrap 框架4

1. 轮播 1.1 轮播样式 在Bootstrap 5中, 创建轮播(Carousel)的相关类名及其介绍: * 1. carousel: 轮播容器的类名, 用于标识一个轮播组件. * 2. slide: 切换图片的过渡和动画效果. * 3. carousel-inner: 轮播项容器的类名, 用于包含轮播项(轮播图底下椭圆点, 轮播的过程可以显…

[论文必备]最强科研绘图分析工具Origin(2)——简单使用教程

本篇将介绍Origin的简单使用教程。 安装教程见上篇&#xff1a;[论文必备]最强科研绘图分析工具Origin&#xff08;1&#xff09;——安装教程 目录 &#x1f4e2;一、工具栏介绍 &#x1f4e3;1.1 行 1.1.1 标准栏 1.1.2 导入栏 1.1.3 工作表数据 1.1.4 图表数据 &a…

第二章 线性表

线性表 线性表的基本概念线性表的顺序存储线性表顺序存储的类型定义线性表基本运算在顺序表上的实现顺序表实现算法的分析 线性表的链接存储单链表的类型定义线性表的基本运算在单链表上的实现 其他运算在单链表上的实现建表删除重复结点 其他链表循环链表双向循环链表 顺序实现…

【Docker】搭建 Docker 镜像仓库

文章目录 前言&#xff1a;公有仓库和私有仓库公共镜像仓库私有镜像仓库 一、搭建 Docker 镜像仓库1.1 搭建简化版的镜像仓库1.2 搭建带有图形化界面的镜像仓库1.3 配置 Docker 信任地址 二、向私有镜像仓库推送和拉取镜像2.1 推送本地镜像到私有仓库2.2 拉取私有仓库中的镜像 …

【Redis】基础数据结构-skiplist跳跃表

有序集合Sorted Set zadd zadd用于向集合中添加元素并且可以设置分值&#xff0c;比如添加三门编程语言&#xff0c;分值分别为1、2、3&#xff1a; 127.0.0.1:6379> zadd language 1 java (integer) 1 127.0.0.1:6379> zadd language 2 c (integer) 1 127.0.0.1:6379…

Swift 5.9 与 SwiftUI 5.0 中新 Observation 框架应用之深入浅出

0. 概览 Swift 5.9 一声炮响为我们带来全新的宏&#xff08;Macro&#xff09;机制&#xff0c;也同时带来了干霄凌云的 Observation 框架。 Observation 框架可以增强通用场景下的使用&#xff0c;也可以搭配 SwiftUI 5.0 而获得双剑合璧的更强威力。 在本篇博文&#xff0c…

计算机网络笔记3 数据链路层

计算机网络系列笔记目录&#x1f447; 计算机网络笔记6 应用层计算机网络笔记5 运输层计算机网络笔记4 网络层计算机网络笔记3 数据链路层计算机网络笔记2 物理层计算机网络笔记1 概述 文章前言 &#x1f497; 站在巨人的肩膀上&#xff0c;让知识的获得更加容易&#xff01…

给列起别名(关键字:as)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1 as 别名1, 列名2 as 别名2, 列名n as 别名n from 表名; 说明&#xff1a;可以省略as&#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…

关于内存对齐你需要了解的事

简介 这篇文章的目的是带你了解什么是内存对齐&#xff0c;具体的内存对齐的细节、处理方式、不同架构则不会去详细讲解&#xff0c;只做科普文用。 1、什么是内存对齐 内存对齐和数据在内存中的位置有关。内存对齐以字节为单位进行&#xff0c;一个变量的内存地址如果正好等于…

集合(容器)-List接口及实现类

容器的特征&#xff1a;①数据长度可变&#xff1b;②数据保存方式不同。 集合体系概述&#xff1a;JAVA的集合框架是由很多接口、抽象类、具体类组成。都位于java.util包中。 Java中集合类中默认可以存储任意数据类型&#xff0c;Java中的集合提供泛型机制&#xff0c;在定义…

mysql5.7停止维护时间

mysql5.7将于2023年10月停止官网支持和更新&#xff1b;老项目要准备升级&#xff0c;新项目的mysql必须是mysql8.0&#xff08;2023-10&#xff09; 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…