初识Linux下进程

🌎初识进程


初识进程

    简单认识一下进程

    如何管理进程

    进程属性信息

    内核运行队列

    查看进程

    通过系统调用获取进程标识符
      父子进程
      查看运行中的进程

    总结


前言

  我们在电脑上点开的一个个应用,其实就是一个个进程,进程仅仅如此吗?今天我们就来认识一下进程,那么话不多说,开启我们今天的话题!

在这里插入图片描述


🚀简单认识一下进程

  打开任务管理器,管理器上显示的所有应用都是进程,例如:

在这里插入图片描述
  这些打开的应用程序,都是进程,这也说明了操作系统可以同时运行多个进程,我们上次学习了操作系统的管理工作,那么os是如何对加载到内存的程序做管理的呢?

  还是那六个字: 先描述再组织

  那么在我们Linux系统下,是如何描述进程的?众所周知,Linux大部分是用C语言写的,而描述进程就会用到struct结构体:

struct XXX{
	//状态
	//优先级
	//内存指针字段
	//标识符
	//..包含进程几乎所有的属性字段
	
	struct XXX *next; 
}; 

  先描述,就是将进程的属性信息放在结构体当中。


🚀如何管理进程

  可执行程序被加载到内存的时候,仅仅是 将可执行程序的代码和数据加载进来 了,但是os并不认识你:

在这里插入图片描述

  这就好比,你跟你的好朋友小明是室友,今天你们去蹭陌生人的席,但是不巧的是被主人发现了,主人一脸奇怪的看着你俩。这个时候,因为主人没有对应的信息,所以主人并不认识你。
  但是你急中生智,你告诉主人家:我们是你七大姑的八大姨家的孩子,他是我弟弟。然后你就拿出了500块钱,说:刚才忘记上账了。这个时候主人家也不管你是不是亲戚了:“来了就是客人,钱我就收着了,你去登记吧~,一人250。”

  对于操作系统也是如此,既然你已经加载进来了,os为了 更好的管理这些程序,就需要把你的信息交给操作系统。

  所以就需要将可执行程序的结构体变量实例化,也就是创建 结构体对象 !所以 每一个 可执行程序都有对应的描述其结构体的对象。

  进程全称为:Process Control Block进程控制块),简称:PCB

struct PCB{
	//状态
	//优先级
	//内存指针字段
	//标识符
	//..包含进程几乎所有的属性字段
	
	struct PCB *next; //链式结构,指向下一个PCB对象
}; 

  我们已经描述完了一个结构体对象,那么如何组织呢?其实在进程结构体对象当中,有着一个 next 指针,用来指向下一个PCB对象形成链式结构,这样,所有的进程就都可以关联起来了。

在这里插入图片描述

  那么这个PCB对象就是进程吗?也不是,进程是:进程 = 内核数据结构 + 可执行程序。这里的 内核数据结构 暂时 可以理解为 进程的PCB对象

在这里插入图片描述


🚀进程属性信息

  PCB是进程比较官方的叫法,在Linux下我们的进程实际上叫做:task_struct。其中 task_struct 是 PCB 的一种

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

  这里需要提及的一点就是 程序计数器,我们CPU是如何知道我们当前行代码的下一行代码在哪个位置呢?比如 当我们正在执行一个从1累加到100的程序

在这里插入图片描述
  很多人会误以为CPU很快,所以很聪明,其实 CPU非常 “笨”, 因为CPU的工作内容就是:取指令 ——> 分析指令 ——> 执行指令,执行完成后,一直循环这几个步骤

  就像一个百米运动员,跑的很快,但是给他拿一套高数卷子,可能就让他头大了。

在这里插入图片描述

  那么我们CPU是如何执行指令的呢?其实在CPU内部有一个名为 eip/pc 寄存器,这个寄存器被称为 pc指针(point code),这个pc指针会指向 当前正在执行指令的下一条指令的地址!

  那么也就是说,pc指针指向哪个代码块,哪个进程就会被执行

在这里插入图片描述
  进程里的这些其他属性我们往后会慢慢地接触,目前了解即可,我们可以先看一下在Linux源码当中,task_struct到底是什么样的:

  
  展示的仅仅是task_struct 的 一小段代码,而完整的task_struct 大约有几百行代码,篇幅有限,这里就不多展示了,有兴趣可以自己查阅Linux源码。

  这里我想要说明的是,进程中的属性是非常多的,当然这些属性有着自己的用途,以后我们就会慢慢接触。


🚀内核运行队列

  我们已经初步了解了进程,可是,当CPU想要去运行进程,该如何去运行这么多进程呢?其实在CPU内部,会给这些进程排个队,依次来执行这些进程,也就是所谓的 运行队列

  内核的运行队列也是通过 先描述再组织 的方式来实现的,先描述,将需要的进程数据与信息放在运行队列的结构体当中,再组织,创建结构体对象,对进程信息进行排队管理。

struct runqueue//内核运行队列
{
	int count;//进程计数
	PCB *head;//指向进程的头指针,以便于能够执行
	//...其他属性信息
}

在这里插入图片描述
  所以教材上所谓的 CPU让进程排队,就是让进程的PCB排队,而不是让进程的可执行程序去排队!


🚀查看进程

  我们知道了进程的概念,那么我们想看看进程到底长什么样子,如何操作呢?我们可以使用:

ls /etc #在etc目录下查看进程

在这里插入图片描述
  使用 ls 命令在 etc 目录下查看进程即可,当然也可以使用 ps 命令:

ps#查看当前正在运行的进程有哪些

在这里插入图片描述

  可以看到当前运行的进程就是 bashps 命令,我们也可以查看更多进程,使用ps命令时,带上 ajx 或者 aux 选项:

ps ajx#或者ps aux都可

在这里插入图片描述
  当然还有其他的查看进程的方法,这里就不再赘述了,有兴趣可以自己查资料。


🚀通过系统调用获取进程标识符

✈️父子进程

  在开始上手实操之前,我们需要了解一下什么是父子进程:

  在我们用ps命令查看系统的进程的时候,上面的属性信息就写着一个进程的父子进程的id:

在这里插入图片描述

  其中的 PID就是该进程自己的idPPID指的是该进程的父进程id,这也就是该进程的进程标识符,每个进程都有自己的 唯一标识符

✈️查看运行中的进程

  首先我们要先创建一个C的源文件,编译生成可执行程序:

在这里插入图片描述
再配置makefile文件:

在这里插入图片描述

再形成可执行程序:

在这里插入图片描述

我们运行程序,当程序在执行的时候,这个可执行程序就变为了一个 进程

在这里插入图片描述

  我们可以使用如下指令 显示出进程的状态

ps ajx | head -1 && ps ajx | grep 可执行程序 #使用命令行管道,将前面得到的信息向后传递

在这里插入图片描述
  我们可以看到,当程序在运行时,我们可以看到,./mybin 出现在了进程状态栏里面,此时我们进程的 pid为13133ppid为12693。当进程结束时,这个进程也就消失了。

  不对啊,我不记得我们在写程序的时候有写父进程啊?这个父进程id是怎么来的?我们不妨对该父进程 ppid 进行 ps 一下:

ps 进程id#显示id进程的信息

在这里插入图片描述

  其实 这个程序的 默认父进程是bash,这是因为:

  bash是大多数 Linux 系统的登录 shell。当您登录到系统时,bash shell 会启动并等待输入命令。输入命令时,bash shell 会将其解析为一个可执行文件和一组参数,然后在bash上执行该可执行程序

  注意./mybin下面的那个进程是grep的进程,因为在运行的时候,grep命令也变成了一个可执行程序,也是一个进程


📒✏️ 总结

  •  电脑上启动的一个个程序就是进程,更详细点:进程=内核数据结构+可执行程序
  •  我们大部分人的电脑CPU只有一个,所以操作系统需要将很多进程进行管理,用到了运行队列
  •  一个原始进程的父进程是bash

在这里插入图片描述
  如果这篇文章对你有帮助的话,还望三连支持呀~~

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

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

相关文章

【输入npm install express出现的报错】

目录 输入:npm install express,出现如下的报错 分析原因 方法1:用管理员的身份进行安装 方法2:更改文件夹的权限 输入:npm install express,出现如下的报错 分析原因: npm在执行安装过程中…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

vscode中增加参数的一个方法

1 在settings.json 文件中增加参数 2. 在参数中配置 这里也是ok的

VMware 虚拟机 ubuntu 20.04 硬盘扩容方法

前言 最近由于需要编译 【RK3568】的 Linux SDK&#xff0c;发现 虚拟机默认的 200G 空间不足了&#xff0c;因此想增加这个 200G 空间的限制&#xff0c;通过网络上查找了一些方法&#xff0c;加上自己亲自验证&#xff0c;确认 硬盘扩容 正常&#xff0c;方法也比较的容易&a…

MySQL--安装与配置与向日葵的基本操作使用

一.MySQL介绍 1.1 MySQL简介 MySQL是一个开源的关系型数据库管理系统&#xff0c;最早由瑞典MySQL AB公司开发。这个数据库系统有着高可靠性、高性能和易用性的特点&#xff0c;在互联网上得到了广泛的应用。MySQL支持SQL语言&#xff0c;可以运行在多种操作系统上&#xff0c…

draw流程图工具导入云原生(CNCF)相关控件

目录 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 2、引用自己的资源链接&#xff1a; 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 导入资源图库&#xff0c;资源放在下方&#xff0c;大家可以下载&#xff1a; 2、引用自己的资源链接&#xff1a;…

C#中汉字转区位码

目录 一、关于区位码 1.区位码定义 2.算法 二、实例 三、生成效果 四、程序中的知识点 1.byte[] GetBytes(string s) 2.字节数组转short类型 一、关于区位码 1.区位码定义 区位码是一个4位的十进制数&#xff0c;每个区位码都对应着一个唯一的汉字&#xff0c;区位码…

小白综述:深度学习 OCR 图片文字识别

文章目录 1. OCR 算法流程1.1 传统 OCR 方法1.2 深度学习 OCR 方法1.2.1 two-stage方法&#xff1a;文字检测识别1.2.2 端到端方法 2. 文本检测算法3. 文本识别算法3.1 基于分割的单字符识别方法3.2 基于序列标注的文本行识别方法 1. OCR 算法流程 OCR (Optical Character Rec…

opencv期末练习题(3)附带解析

创建黑色画板&#xff0c;并支持两种画图功能 import mathimport cv2 import numpy as np """ 1. 创建一个黑色画板 2. 输入q退出 3. 输入m切换画图模式两种模式&#xff0c;画矩形和画圆形。用户按住鼠标左键到一个位置然后释放就可以画出对应的图像 "&qu…

Blender:从新手到专家的全方位指南

Blender&#xff0c;这款强大的开源3D建模和渲染软件&#xff0c;已经成为了CG行业的标准工具之一。它不仅拥有丰富的教程资源&#xff0c;而且还在不断发展和完善中。尽管Blender的教程主要集中在国外网站和YouTube上&#xff0c;但其全面的功能和易用性使它成为许多人的首选工…

基于深度卷积神经网络的猴痘分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细介绍了一基于深度卷积神经网络的猴痘分类识别系统。采用TensorFlow和Keras框架&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测&#xff0c;利用迁移学习中的…

【ESP-NOW Web 服务器传感器仪表板 (ESP-NOW + Wi-Fi)】

【ESP-NOW Web 服务器传感器仪表板 &#xff08;ESP-NOW Wi-Fi&#xff09;】 1. 前言2. 同时使用 ESP-NOW 和 Wi-Fi3. 项目概况4. 先决条件4.1 环境配置4.2 DHT 库4.3 ESPAsyncWebSrv服务器库4.4 Arduino_JSON4.5 所需零件4.6 获取接收板 MAC 地址4.7 ESP32 发送电路 5. ESP3…

Linux使用yum命令安装postgrepsql

1.检查安装源 yum search postgresql 2.安装 yum install postgresql-server 3.启动数据库 service postgresql start 4.查看启动状态 service postgresql status 5.登陆测试 su - postgrep psql \l6.远程连接 6.1修改配置文件 在pg_hba.conf增加host all all 0.0.0…

微服务整合:构建高效灵活的分布式系统

随着软件开发的不断演进和业务的复杂性增加&#xff0c;微服务架构已经成为一种流行的解决方案。然而&#xff0c;当涉及到多个微服务之间的整合时&#xff0c;我们需要谨慎考虑如何实现高效、灵活的分布式系统。 微服务架构的流行使得软件开发变得更加灵活和可扩展。然而&…

JDK、JRE、JVM的联系与区别

JDK、JRE、JVM的联系与区别 一、JDK,JRE,JVM定义 JDK(Java Development Kit),包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JRE(Java Runtime Environment)&#xff0c;包含Java虚拟机、库函数、运行Java应用程序所必须的文件。 JVM(Java Virtual Machine)是一个虚…

学习Go语言Web框架Gee总结--上下文Context(二)

学习Go语言Web框架Gee总结--上下文Context context/go.modcontext/main.gocontext/gee/context.gocontext/gee/router.gocontext/gee/gee.go 学习网站来源&#xff1a;Gee 项目目录结构&#xff1a; context/go.mod module examplego 1.21.5require gee v0.0.0 replace gee…

JVM是如何基于虚拟机栈运行的

众所周知&#xff1a;JVM执行Java代码是靠执行引擎实现的。执行引擎有两套解释器&#xff1a;字节码解释器、模板解释器。字节码解释器比较简单&#xff0c;不多说&#xff0c;看图。本篇文章咱们讨论模板解释器执行Java代码的底层原理。 早些年研究模板解释器看到R大用汇编写的…

ArkTS - @Prop、@Link

一、作用 Prop 装饰器 和Link装饰器都是父组件向子组件传递参数&#xff0c;子组件接收父组件参数的时候用的&#xff0c;变量前边需要加上Prop或者Link装饰器即可。&#xff08;跟前端vue中父组件向子组件传递参数类似&#xff09; // 子组件 Component struct SonCom {Prop…

基于JAVA的高校宿舍调配管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

HTTPS网站安全证书

随着互联网的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;而HTTPS网站安全证书作为一项关键技术&#xff0c;正成为保护用户隐私和数据安全的不可或缺的手段之一。本文将介绍HTTPS网站安全证书的定义、作用、种类及部署过程&#xff0c;以帮助读者更好地理解和应用这…