【Linux】第十二站:进程

文章目录

    • 1.windows和linux中的进程
    • 2.先描述
    • 3.在组织
    • 4.具体的Linux系统是如何做的?
      • 1.基本概念
      • 2.描述进程-PCB
      • 3.task_struct和PCB的关系
      • 4.task_struct内容分类
      • 5.linux具体如何做的?
      • 6.查看进程

1.windows和linux中的进程

一个已经加载到内存的程序,叫做进程

进程也叫做任务

比如在windows中,这个任务管理器就可以看到进程

image-20231105143905414

而在linux中,我们使用

ps axj

就可以看到我们的进程了

image-20231105144017060

2.先描述

我们先使用如下代码

image-20231105145022218

image-20231105145038489

如下所示,就可以查看到进程了

image-20231105145346868

在这个过程中,我们的这个可执行程序就会从磁盘中加载到内存中,然后经过CPU,最终输出到显示器上。

这个加载到内存中的程序就是一个进程

像我们电脑的操作系统开机的时候也一样,开机的时候,就是操作系统加载到内存的时候。这也是进程

这些加载到内存,其实就是将这些二进制数据(代码和一些数据)从磁盘中搬到内存中

如下图所示,当一个程序要运行的时候,他需要先将这些二进制文件从磁盘中搬到操作系统中。

image-20231105151143404

但是常识告诉我们,一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程

所以说,操作系统必须将这些进程给管理起来

那么应该如何管理进程呢?

当然还是先描述,在组织

所以任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程属性的结构体对象----PCB(process ctrl block 进程控制块)

这就是类似于人是怎么样辨别认识一个事情或者对象的

当然是都是通过属性认识的。

当属性够多,这一堆属性的集合,就是目标对象

这个PCB就是进程属性的集合

而在C语言中,我们可以用struct结构体来描述这个集合。

这个结构体里面就有进程编号、进程的状态、优先级、相关的指针信息…等等信息

然后根据进程的PCB属性,就可以为该进程创建对应的PCB对象了

不过我们的操作系统除了创建一个PCB对象之外,还要去将代码和数据加载到内存中

image-20231105154122240

就好比我们现在是一个学生,那么PCB就是我们的档案,代码和数据就是我们本人。只有当这两部分都在学校的时候,我们才是这个学校的学生。

所以描述进程的PCB的结构体和该进程的代码和数据合起来才称作进程

image-20231105154613845

所以所谓的进程 = 内核PCB数据结构对象 + 你自己的代码和数据

内核PCB数据结构对象是描述你这个进程的的所有的属性值

所以操作系统要做管理的时候,不需要对我们自己做出管理,只需要对我们这个内核PCB数据结构对象做出管理即可

这个PCB对象里面是有相关的指针信息的,所以可以通过这个PCB对象直接找到我们的

上面这个过程就是一个进程的描述的过程,即先描述

3.在组织

可是我们操作系统经常要持续很多个进程的。所以这就需要组织起来了,从而达到对我们的进程做出管理

为了能够将这些数据组织起来,所以我们可以在每一个PCB对象中加上一个相应的指针,用来找到下一个PCB对象,即如同链表的结构

image-20231105155647588

所以在操作系统中,对于进程的管理,就变成了对于这个单链表的增删查改了

这个PCB就好比我们每个人的简历一样,在我们找工作的时候,HR都是直接对我们的简历做出管理的。当我们投递简历以后,我们会看到在排队中,这个排队就指的是这个PCB在排队。而不是我们本人在排队

4.具体的Linux系统是如何做的?

1.基本概念

课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体

2.描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

3.task_struct和PCB的关系

  • task_struct 是PCB具体的一种

  • 在Linux中描述进程的结构体叫做task_struct。

  • task_struct是Linux内核的一种数据结构类型(自定义类型),它会被装载到RAM(内存)里并且包含着进程的信息

4.task_struct内容分类

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

5.linux具体如何做的?

在linux中PCB 就是task_struct 结构体,里面包含进程的所有属性

Linux中如何组织进程呢?,linux内核中,最基本的组织进程task_struct的方式,是采用双向链表的

不过要注意的是,有可能这个task_struct既是属于一个双链表,又是属于一个队列的。他是比较复杂的

6.查看进程

我们在前面所演示这个命令就是一个查看进程的命令

ps ajx | head -1 && ps ajx | grep  myprocess

如下所示,我们可以看到两个进程了

前面两个是这个可执行程序由于跑了两份,所以的两份进程。

下面的第三个进程是grep本身的进程,因为它本身也带有myprocess,所以就把它自己的进程过滤出来了。而之前的那些指令的进程早就已经结束了,所以不会显示出来。这里是因为正好grep执行的时候把他自己给过滤出来了

image-20231105165724516

注意看

注意这个ID值,虽然这两个程序是一样的,但是他们的ID是不一样的,虽然将同一个程序执行了两遍,但是它还是两个进程,因为他们创建了两个不同的PCB

image-20231105170443776

除了上面这种方法还有这样一种方法

ls /proc

image-20231105170748841

这个是linux系统中比较重要的,也比较奇怪的一个目录

它在关机的时候数据就全没了,在开机的时候就又会创建这个目录文件

这个其实因为因为操作系统用文件系统的方式把内存当中的文件,包括进程全部可视化出来了

它这上面的数据都是内存级的

我们可以来证明一下

我们先关掉一个进程

image-20231105171607930

当我们再次使用这个

ls /proc

这个指令的时候

image-20231105171711143

对于这些蓝色的数字,我们知道它一定是目录,而对于黑色的我们先不管

而这些蓝色的数字就是当前进程的PID,所以在创建进程的时候,操作系统会创建一个与PID一样名字的文件夹,这个目录里面保存这个进程的大部分属性

我们可以通过这个找到我们这个进程的目录

image-20231105172115374

然后我们可以查看一下这里面的内容

image-20231105172159326

如果我们将我们这个进程之间结束掉,那么我们这里就用这种方法找不到这个进程了,这个目录就自动删除了

image-20231105172307246

如果我们重启一个进程,那么就又出来了

image-20231105172419200

不过这个PID也被改变了。

所以说每一个程序结束以后在重新启动,PID就会变化了,所以他是系统当中动态运行的相关信息。

我们可以进入到它里面就可以看到这个东西,这就足以证明这个就是我们的这个可执行程序的进程

image-20231105173035832

对于这个cwd,就是我们当前进程的工作目录(current work dir)

image-20231105173156072

对于这个cwd,这个是很有用的

比如说当我们使用touch命令创建一个test.c文件的时候,它是如何找到当前的目录呢?

就是进程启动的时候已经记录了当前的目录。所以才找到的

就好比我们之前的文件操作的时候,为什么文件可以创建在当前目录呢?

就是因为进程有这个cwd,记录了当前工作目录,所以可以直接拼接上去。这就是当前路径

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

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

相关文章

洛谷P1102 A-B数对 详细解析及AC代码

P1102 A-B数对 前言题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码经典二分(O(nlgn))酷炫哈希(O(n)) 后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 酷&…

生成式人工智能的“经济学”,The Economic Case for Generative AI#a16z

a16z召集了行业精英,为我们带来了有关生成式AI的洞察。在创造力方面,生成式AI带来了3-4倍量级的成本优势,更多新的需求将诞生。 AI REVOLUTION The Economic Case for Generative AI Martin Casado MixCopilot 大家好,欢迎来到本期…

遇到python程序是通过sh文件启动的,如何调试

说明 下载的源码总会遇到这样启动的: 并且发现shell文件内容很多,比较复杂,比如: 解决方案 这时候想要调试,可以通过端口连接的方式调试,具体方法如下: 在vscode调试按钮中添加远程附加调试…

【kubernetes】pod的生命周期

文章目录 1、概述2、pod的生命期3、pod阶段4、容器状态5、容器重启策略6、pod状况6.1 Pod就绪态6.2 Pod就绪态的状态6.3 Pod网络就绪 7、容器探针7.1 检查机制7.2 探测结果7.3 探测类型 8、Pod的终止8.1 强制终止Pod8.2 Pod的垃圾收集 1、概述 pod遵循预定义的生命周期&#x…

【MogDB/openGauss误删未归档的xlog日志如何解决】

在使用MogDB/openGauss数据库的过程中,有时候大量业务,或者导数据会导致pg_xlog下的日志数量持续增长,此时如果xlog的产生频率太快,而来不及自动清理,极有可能造成pg_xlog目录的打满。如果对数据库的xlog不太了解的时候…

解决Java中https请求接口报错问题

1. 解决SSLException: Certificate for <域名> doesn‘t match any of the subject alternative报错问题 1.1 问题描述 最近在做一个智能问答客服项目,对接的是云问接口,然后云问接口对接使用的是https方式,之前一直…

git push超过100MB大文件失败(remote: fatal: pack exceeds maximum allowed size)

push代码的时候,有时会出现如下问题 remote: fatal: pack exceeds maximum allowed size error: failed to push some refs to ‘git.n.xiaomi.com:fuzheng1/nl2sql.git’ 解决方案: 将本地 http.postBuffer 数值调整到GitHub服务对应的单次上传大小配置…

凭什么不让使用外键!?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 434 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) MySQL 外键(Foreign Key)是用于建立表之间关系的,它定义了一个表中的一列或一组…

IDEA JAVA项目 导入JAR包,打JAR包 和 JAVA运行JAR命令提示没有主清单属性

一、导入JAR包 1、java项目在没有导入该jar包之前,如图:2、点击 File -> Project Structure(快捷键 Ctrl Alt Shift s),点击Project Structure界面左侧的“Modules”如图:3.在 “Dependencies” 标签…

Javaweb之javascript的详细解析

JavaScript html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习JavaScript,这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演示&…

使用Kotlin与Unirest库抓取音频文件的技术实践

目录 摘要 一、Kotlin与Unirest库概述 二、使用Kotlin和Unirest抓取音频文件 1、添加Unirest依赖 2、发送HTTP请求获取音频文件 3、保存音频文件 三、完整代码示例 四、注意事项 结论 摘要 本文详细阐述了如何使用Kotlin编程语言与Unirest库抓取网络上的音频文件。首…

kimera论文阅读

功能构成: Kimera包括四个关键模块: Kimera-VIO的核心是基于gtsam的VIO方法[45],使用IMUpreintegration和无结构视觉因子[27],并在EuRoC数据集上实现了最佳性能[19]; Kimera-RPGO:一种鲁棒姿态图优化(RPGO)方法,利用现代技术进…

伦敦金周末可以交易吗,黄金休市时间是那些?

伦敦金是国际性投资产品,主要交易中心有亚洲、欧洲和美洲,在时差的作用下,三大市场相互连接,形成了全天24小时几乎不间断的交易时间,也为炒金者们提供了充分的操作机会。即便如此,在一些特定的时间段内&…

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …

电脑发热发烫,具体硬件温度达到多少度才算异常?

环境: 联想E14 问题描述: 电脑发热发烫,具体硬件温度达到多少度才算异常? 解决方案: 电脑硬件的温度正常范围会因设备类型和使用的具体硬件而有所不同。一般来说,以下是各种硬件的正常温度范围: CPU:正…

【10套模拟】【2】

关键字: 哈希函数解决问题、进栈、无向图边与度、双向链表插入新结点、折半查找判定树ASL、孩子兄弟表示法、树变二叉、快排partiction划分

如何获取HuggingFace的Access Token;如何获取HuggingFace的API Key

Access Token通过编程方式向 HuggingFace 验证您的身份,允许应用程序执行由授予的权限范围(读取、写入或管理)指定的特定操作。您可以通过以下步骤获取: 1.首先,你需要注册一个 Hugging Face 账号。如果你已经有了账号…

jenkins展示html报告样式需要注意的要点

一、jenkins展示html报告样式需要注意的要点 最后:

Docker 持久化存储和数据共享_Volume

有些容器会自动产生一些数据,为了不让数据随着 container 的消失而消失,保证数据的安全性。例如:数据库容器,数据表的表会产生一些数据,如果我把 container 给删除,数据就丢失。为了保证数据不丢失&#xf…

【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成

文章目录 一、监控有哪些指标二、prometheus、grafana架构Prometheus 组件Grafana 组件架构优点 三、安装prometheus和node-exporter1. docker pull镜像2. 启动node-exporter3. 启动prometheus 四、promql基本语法五、grafana的安装和使用1. 新建空文件夹grafana-storage&#…