初识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

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

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

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

相关文章

初识Java并发,一问读懂Java并发知识文集(4)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

智能标志桩:防盗防外物入侵_图像监测_态势感知_深圳鼎信

智能标志桩是一种新型的智能化标志设备,主要用于标识地下管道的位置、类型等,起警示作用。这与传统的标志桩大不相同,物联网的高速发展赋予了智能标志桩科技的力量,使它可以连接互联网,还具备图像监控的功能&#xff0…

2024年P气瓶充装证考试题库及P气瓶充装试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证考试题库及P气瓶充装试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的P气…

C++Qt6 多种排序算法的比较 数据结构课程设计 | JorbanS

一、 问题描述 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式排列的算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜索算法与合…

Linux系统操作常用指令

打开终端: ctrlshiftt:切换标签 ctrlshiftn:新增窗口 Linux命令大全(超详细版)_第二范式的博客-CSDN博客 VMware运行时以管理员身份运行,可以避免许多问题。 输入法切换 ctrl 空格 放大终端:ctrlshift"" 缩小终端:ctrl“…

【深度学习-基础学习】Transformer 笔记

本篇文章学习总结 李宏毅 2021 Spring 课程中关于 Transformer 相关的内容。课程链接以及PPT:李宏毅Spring2021ML这篇Blog需要Self-Attention为前置知识。 Transfomer 简介 Transfomer 架构主要是用来解决 Seq2Seq 问题的,也就是 Sequence to Sequence…

web前端——clear可以清除浮动产生的影响

clear可以解决高度塌陷的问题&#xff0c;产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…

【已解决】打印PDF文件,如何跳过不需要的页面?

打印PDF文件的时候&#xff0c;有时候我们只需要打印其中的几页&#xff0c;并不需要全部打印&#xff0c;那如何在打印时跳过那些不需要的页面呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 如果你是通过网页打开PDF文件&#xff0c;那么可以在页面中找到并点击“打…

[每周一更]-(第53期):Python3和Django环境安装并搭建Django

Python和Django 的安装 Python和Django 兼容情况 django 1.11.x python 2.7 3.4 3.5 3.6 LTS python 目前在用版本 Python 3.6.5 2018-03-28 更新Python 2.7.15 2018-05-01 更新Python 2.7.5 2013-05-12 更新 python和python3安装pip 同时安装上 python2.7.18、python3.11…

c语言结构体学习上篇

文章目录 前言一、结构体的声明1&#xff0c;什么叫结构体?2&#xff0c;结构体的类型3,结构体变量的创建和初始化4&#xff0c;结构体的类型5&#xff0c;结构体的初始化 二、结构体的访问1&#xff0c;结构体成员的点操作符访问2&#xff0c;结构体体成员的指针访问 前言 昨…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】

一、插件安装 1.1 搜索插件 mybatis 安装 1.2 接受安装 1.3 再次进入&#xff0c;说明安装好了 1.4 与鱼皮不同点 1&#xff09;mybatis 版本不一致 鱼皮&#xff1a; 本人&#xff1a; 2&#xff09;鱼皮需重启安装 本人不需要 1.5 【需完成 三、步骤&#xff0c;再来看】 …

Git - 强制替换覆盖 master 分支解决方案

问题描述 在版本迭代中&#xff0c;通常会保持一个主分支 master&#xff0c;及多个 dev 分支&#xff0c;但是因为 dev 分支的开发周期过长&#xff0c;迭代太多而没有及时维护 master &#xff0c;导致后来发版上线的大部分代码都在 dev 分支上&#xff0c;如果将代码在 mas…

LiveGBS流媒体平台GB/T28181功能-用户管理通道权限管理关联通道支持只看已选只看未选添加用户备注角色

LiveGBS功能用户管理通道权限管理关联通道支持只看已选只看未选添加用户备注角色 1、用户管理2、添加用户3、关联通道3.1、只看已选3.2、只看未选 4、自定义角色5、搭建GB28181视频直播平台 1、用户管理 LiveGBS支持用户管理&#xff0c;添加用户&#xff0c;及配置相关用户权…

promise.prototype.finally重写和兼容火狐低版本浏览器

一、finally()方法用于指定不管 Promise 对象最后状态如何&#xff0c;都会执行的操作。该方法是 ES2018 引入标准的 let promise new Promise() promise .then(result > {}) .catch(error > {}) .finally(() > {})finally方法的回调函数不接受任何参数;finally方法…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的&#xff0c;并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 先看效果 Tree 树形控件 保留过滤值的子级 <el-treeclass"filter-t…

直观从零理解 梯度下降(Gradient descent) VS 随机梯度下降 (Stochastic gradient descent) 函数优化

首发于Data Science 单变量微分(Differentiation) 常用基本微分有&#xff1a; 四则运算法则&#xff1a; 链式法则(Chain-rule) 极大值(maxima)与极小值(minima) 向量微分 梯度下降(Gradient descent):几何直觉 学习率&#xff08;Learning Rate&#xff09;的直观理解…

笔记中所得(已删减)

1.交流电的一个周期内电压/电流的平均值都为0 2.电动势:电池将单位正电荷由负极搬到正极所做的功 5.额定能量:电池的额定容量乘以标称电压,以Wh为单位 6.500mAh意义是可以以500mA的电流放电1小时 7.电池容量的单位是mAh 13.实际电流源不能串联 14. 15. 16. 17. 18. 19.电…

C++ 二进制图片的读取和blob插入mysql_stmt_init—新年第一课

关于二进制图片的读取和BLOB插入一共包含五步 第一步&#xff1a;初始化 MYSQL_STMT* stmt mysql_stmt_init(&mysql); 第二步&#xff1a;预处理sql语句 mysql_stmt_prepare(stmt,sql,sqllen); 第三步&#xff1a;绑定字段 mysql_stmt_bind_param(stmt,bind); 第四…

车规级芯片NCV4275CDT50RKG LDO线性电压调节器 原理、参数及应用

关于车规级芯片&#xff08;Automotive Grade Chip&#xff09;&#xff0c;车规级芯片是专门用于汽车行业的芯片&#xff0c;具有高可靠性、高稳定性和低功耗等特点&#xff0c;以满足汽车电子系统的严格要求。这些芯片通常用于车载电子控制单元&#xff08;ECU&#xff09;和…

用ChatGPT方式编程!GitHub Copilot Chat全面开放使用

全球著名开源分享平台GitHub在官网宣布&#xff0c;经过几个月多轮测试的GitHub Copilot Chat&#xff0c;全面开放使用&#xff0c;一个用ChatGPT方式写代码的时代来啦&#xff01; 据悉&#xff0c;Copilot Chat是基于OpenAI的GPT-4模型&#xff0c;再结合其海量、优质的代码…