【Linux取经路】进程的奥秘

在这里插入图片描述

文章目录

  • 1、什么是进程?
    • 1.1 自己写一个进程
  • 2、操作系统如何管理进程?
    • 2.1 描述进程-PCB
    • 2.2 组织进程
    • 2.3 深入理解进程
  • 3、Linux环境下的进程
    • 3.1 task_struct
    • 3.2 task_struct内容分类
    • 3.3 组织进程
    • 3.4 查看进程属性
  • 4、结语

1、什么是进程?

在上一篇文章【Linux取经路】冯诺依曼结构体系与操作系统的碰撞中提到过,任何一个程序想要运行,必须先加载到内存中。一个已经加载到内存中的程序(正在运行的程序),就叫进程。在很多教材里进程一杯叫做任务。

W i n d o w s Windows Windows操作系统下,我们可以通过任务管理器来查看计算机当前正在运行的进程。

在这里插入图片描述
L i n u x Linux Linux操作系统下,可以通过下面的指令来查看当前正在运行的进程信息

ps axj
top
//这两条指令都可以查看进程

在这里插入图片描述

1.1 自己写一个进程

进程就是加载到内存中的可执行程序,因此我们自己写一个.c源代码,通过编译就可以得到一个可执行程序。

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

我们写的这个源代码是存储在磁盘上的,编译得到的可执行程序也是存储在磁盘上的,只有通过./mycode去执行 mycode 这个可执行文件,才能把它加载到内存中。加载到内存之后,此时就会得到一个名为 mycode 的进程,可以通过下面这条指令来查看该进程

ps axj | grep mycode
//ps axj 是查看当前的所有进程
//通过管道和grep将mycode进程的信息过滤出来

在这里插入图片描述
小Tips:我们写的源代码,最终一定是由CPU来运行,而CPU只能从内存中拿数据,这就决定了我们的可执行程序和代码一定要先加载到内存当中。此外,CPU在不运行我们代码的时候,他可能在检查计算机的各种状态,释放计算机的各种资源,将操作系统中的数据刷新到磁盘等日常管理工作,这说明操作系统本身也一定要在内存当中,我们平时开机本质上其实就是把操作系统从外设搬到内存当中。

在这里插入图片描述
小Tips:一个可执行程序本质上就是一个二进制文件,我们将一个可执行程序加载到内存,本质上就是将一个二进制文件加载到内存,这个二进制文件是由代码和数据两部分组成,无论是数据还是代码归根结底都可以被叫做数据,代码最终交给控制器去执行,数据最终交给运算器去运行。

根据上面的截图可以看出,一个计算机可以同时存在多个进程,给用户的主观感受就是,可以同时使用多个软件,即在我们的计算机上,聊天、听歌、打游戏可以同时进行。现在我们把这种可以同时运行多个进程的操作系统叫做多道操作系统。

2、操作系统如何管理进程?

操作系统中可以有多个进程就类似于学校中有不同年级的学生,学校会将不同年级的学生统统管理起来,操作系统也一样,它需要把多个进程管理起来。

操作系统如何对进程做管理呢?还记得上一篇文章中介绍的操作系统对软硬件资源的是如何管理的嘛👀?忘了的小伙伴可以走传送门回去看看。操作系统对进程的管理也一定是先描述、在组织。即先定义一个结构体,里面有进程的各种属性,用一个结构体对象来表示一个进程,再将这些结构体对象用一种数据结构组织起来,组织的目的是为了更好的管理。此后,操作系统对进程的管理就变成了对某种数据结构的增删查改。

2.1 描述进程-PCB

任何可执行程序,在加载到内存,形成真正的进程时,操作系统要先创建描述进程的结构体对象。这个对象中存储了进程的各类信息,这个对象也被叫做进程控制块,本质上就是进程属性的集合。在课本上称之为 PCB (process control block),因为操作系统是由C语言写的,所以 PCB 本质上一定是一个 struct 结构体,Linux操作系统下的PCB是:task_struct

小Tips:所有操作系统中的进程控制块都被叫做PCB。在不同的平台下,PCB的具体实现是有差异的。

2.2 组织进程

上面介绍了操作系统是如何描述进程的,接下来操作系统需要把多个进程给组织起来。所有运行在系统里的进程都以 PCB 对象链表的形式存在内核里。所以最终操作系统对进程的管理就变成了对链表的增删查改。

2.3 深入理解进程

此时再来看一个进程需要具备的东西。首先可执行程序必须先加载到内存,本质是将代码和数据加载内存,这说明一个进程一定有它所对应的代码和数据。其次,操作系统为了管理好进程,需要为该进程创建一个 PCB 对象用来描述该进程。总结:PCB + 代码和数据就是一个进程必须具备的两个东西。

在这里插入图片描述
小Tips:虽然进程由两部分组成,但是操作系统管理进程只关心进程的 PCB 对象,它根本不关心该进程的代码和数据。

举个例子帮助大家理解:春人今年参加高考,成功的考上了 A 大学。在假期的时候,A 大学来到春人的高中,将春人的的档案从高中拿到大学,再将春人的信息录入学校的教务系统,到了九月份,春人带着录取通知书去大学报道,春人进入校门后,开心的说“我终于是 A 大学的一名学生啦”,旁边的保安大叔也跟着笑,请问旁边的保安大叔是该学校的学生嘛?答案是否定的。虽然保安大叔可能在学校工作了很多年,但是他的信息并没有被录入教务系统,所以保安大叔不是该学校的学生。因此我们可以得出结论:只有人在学校是不足以说明这个人是该校的学生,只有将这个人的信息录入教务系统后,才能说这个人是学校的学生。进程也一样,只把代码和数据加载到内存,是不足以说明它是一个进程,还需要创建描述给进程的 PCB 对象,这二者共同得到了一个进程。

3、Linux环境下的进程

第二小节介绍的是任何一款操作对进程做管理的要求,这一小节我们主要来看看 Linux 环境下的进程管理。

3.1 task_struct

task_struct 是 Linux 操作系统下的 PCB 结构,它是 Linux 内核的一种类型,会被装载到 RAM(内存)里,并且包含着进程的信息。

3.2 task_struct内容分类

  • 标识符:描述一个进程的唯一标识符,用来区分不同进程。

  • 状态:任务状态,退出码,退出信号等。

  • 优先级:相对于其他程序进程的优先级。

  • 程序计数器:程序中即将被执行的下一条指令的地址。

  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。

  • 上下文数据:进程执行时处理器的寄存器中的数据。

  • I / O状态信息:包括显示的 I/O 请求,分配给进程的 I/O 设备和被进程使用的文件列表。

  • 记账信息:可能包括处理时间总和,使用的时钟数总和,时间限制,记账号等。

3.3 组织进程

Linux 内核中,最基本的组织进程 task_struct 的方式是采用双向链表组织。但是一个 task_struct 对象不仅仅属于一个双链表,它可能存在多个数据结构中。对进程的管理,本质上就是将 task_struct 对象放到某个数据结构中。

3.4 查看进程属性

ps axj | head -1 && ps axj | grep mycode
//&&用来连接两个指令操作
//左边是只打印“表头”信息
//右边是将mycode进程的相关信息过滤出来

在这里插入图片描述
小Tips:最后一行显示的其实是 grep 命令的进程。因为 grep 命令的关键字里也有 mycode ,当我们用 grep 命令来过滤操作系统中的进程时,grep 自己首先需要先变成一个进程,然后它才能被 CPU 调度执行,因此最终过滤时会把 grep 自己也带上。

ls /proc

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

在这里插入图片描述
小Tips:当我们终止掉 mycode 进程 proc 目录下的1624目录也会跟着被清理。其次,一个进程终止后再启动,它的 PID 大概率是会变化的。

在这里插入图片描述

mycode 进程目录下的 exe 是一个链接文件,它就指向当前进程所对应的可执行程序的路径,它就是将 task_struct 对象中的内存指针给可视化了出来。cwd 表示该进程的工作目录,即进程所对应可执行程序所在的目录。我们的程序中一般打开一个文件或者创建一个文件,在只写文件名的情况下,程序就会默认在当前目录下查找文件或者将创建的文件放在当前目录下,本质上就是因为进程 PCB 中存的有当前目录的路径信息。


4、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS

FreeRTOS官网&#xff1a;www.freertos.org 调度 实时操作系统 特点&#xff1a;如果有一个任务需要执行&#xff0c;实时操作系统会马上&#xff08;在较短时间内&#xff09;执行该任务&#xff0c;不会有较长的延时。这种特性保证了各个任务的及时执行。 实现方式&#…

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…

详解Kafka分区机制原理|Kafka 系列 二

Kafka 系列第二篇&#xff0c;详解分区机制原理。为了不错过更新&#xff0c;请大家将本号“设为星标”。 点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达 上一篇文章介绍了 Kafka 的基本概念和术语&#xff0c;里面有个概念是 分区(Part…

计算机竞赛 opencv python 深度学习垃圾图像分类系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; opencv python 深度学习垃圾分类系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这是一个较为新颖的竞…

pytest结合 allure 打标记之的详细使用

前言 前面我们提到使用allure 可以生成漂亮的测试报告&#xff0c;下面就Allure 标记我们做详细介绍。 allure 标记 包含&#xff1a;epic&#xff0c;feature, story, title, testcase, issue, description, step, serverity, link, attachment 常用的标记 allure.feature…

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响&#xff0c;这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁&#xff0c;从而使性能下降。为此&#xff0c;可以采取以下几种方式来减缓这种影响&#xff1a; 1. 限制索引的大小&#xff1a;可以…

PHP8定义字符串的方法-PHP8知识详解

字符串&#xff0c;顾名思义&#xff0c;就是将一堆字符串联在一起。字符串简单的定义方法是使用英文单引号&#xff08; &#xff09;或英文双引号&#xff08;" "&#xff09;包含字符。另外&#xff0c;还可以使用定界符定义字符串。本文还介绍了字符串的连接符。…

数据结构和算法三(排序)

列表排序 排序类型&#xff1a; 一、冒泡排序&#xff1a; 屏幕录制2023-07-25 13.05.12 def bubble_sort(li):exchangeFalseif len(li)<1:return lifor i in range(len(li)-1):for j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]print(li)exchangeT…

mac harbor的安装

harbor的安装 为什么要整这个呢&#xff0c;因为我在学习k8s&#xff0c;但是需要一个自己的镜像仓库。于是&#xff0c;最开始想到的就是在本地直接部署一个&#xff0c;还比较安全、快速。 直接下载了官方的项目&#xff0c;运行脚本发现出了异常&#xff0c;这种异常我已经…

项目知识点记录

1.使用druid连接池 使用properties配置文件&#xff1a; driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…

LiveNVR监控流媒体Onvif/RTSP功能-视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例

LiveNVR视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例 1、介绍2、摄像头OSD设置水印3、前端页面叠加4、视频流水印4.1、图片水印示例4.2、时间戳水印示例 5、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、介绍 监控视频平台播放视频监控的时候&#xff0c;除了满足正…

SpringMVC的架构有什么优势?——控制器(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

CentOS 7中,配置了Oracle jdk,但是使用java -version验证时,出现的版本是OpenJDK,如何解决?

1.首先&#xff0c;检查已安装的jdk版本 sudo yum list installed | grep java2.移除、卸载圈红的系统自带的openjdk sudo yum remove java-1.7.0-openjdk.x86_64 sudo yum remove java-1.7.0-openjdk-headless.x86_64 sudo yum remove java-1.8.0-openjdk.x86_64 sudo yum r…

STM32单片机蓝牙APP宠物自动喂食器定时语音提醒喂食系统设计

实践制作DIY- GC00162---蓝牙APP宠物自动喂食器 一、功能说明&#xff1a; 基于STM32单片机设计---蓝牙APP宠物自动喂食器 二、功能说明&#xff1a; STM32F103C系列最小系统板LCD1602显示器DS1302时钟模块5个按键语音播报模块ULN2003步进电机模块LED灯板HC-05蓝牙模块&#x…

XML方式AOP快速入门XML方式AOP配置详解

目录 1.XML方式AOP快速入门 1&#xff1a;导入AOP相关坐标 2&#xff1a;准备目标类&#xff0c;准备增强类&#xff0c;并配置给Spring管理 3&#xff1a;配置切点表达式&#xff08;那些方法要被增强&#xff09; 4&#xff1a;配置织入&#xff08;切点被哪些方法增强&…

C++初阶语法——类和对象

前言&#xff1a;C语言中的结构体&#xff0c;在C有着更高位替代者——类。而类的实例化叫做对象。 本篇文章不定期更新扩展后续内容。 目录 一.面向过程和面向对象初步认识二.类1.C中的结构体2.类的定义类的两种定义方式 3.类的访问限定符及封装访问限定符说明 4.类的实例化对…

Python中的诡异事:不可见字符!

文章目录 前言1. 起因2. 调查3. 高能4. 释惑 前言 今天分享一件很诡异的事情&#xff0c;我写代码的时候遇到了不可见的字符&#xff01;&#xff01;&#xff01; 1. 起因 今天在使用pipreqs导出项目中所依赖的库时突然报错了&#xff1a; pipreqs . --encodingutf-8 --forc…

Spring项目整合过滤链模式~实战应用

代码下载 设计模式代码全部在gitee上,下载链接: https://gitee.com/xiaozheng2019/desgin_mode.git 日常写代码遇到的囧 1.新建一个类,不知道该放哪个包下 2.方法名称叫A,干得却是A+B+C几件事情,随时隐藏着惊喜 3.想复用一个方法,但是里面嵌套了多余的逻辑,只能自己拆出来…

百川智能发布首个530亿参数闭源大模型,今年追上GPT-3.5

4月官宣创业&#xff0c;6月15日发布第一款7B开源模型&#xff0c;7月11日发布第二款13B、130亿参数开源模型。 平均保持2个月一个版本发布速度&#xff0c;8月8日&#xff0c;百川智能发布了创业以来的首个530亿参数闭源大模型——Baichuan-53B&#xff08;以下简称“53B”&a…

Android Https

本质&#xff1a;在客户端和服务端使用非对称加密协商出一套对称密钥&#xff0c;每次发送数据前加密&#xff0c;收到后解密&#xff0c;达到加密传输 http ssl 在http之下增加了安全层&#xff0c;用于保障http的加密传输 HTTPS连接 TLS连接步骤 1.客户端发送 client h…