『 Linux 』进程概念

文章目录

    • 🗞️ 冯诺依曼体系结构 🗞️
      • 📃 为什么在计算机当中需要使用内存充当中间介质而不使CUP与外设直接进行交互?
      • 📃 CPU如何读取数据
    • 🗞️ 操作系统(Operating system) 🗞️
      • 📃 操作系统如何对资源进行管理
    • 🗞️ 进程 🗞️
      • 📃 进程是如何被管理的?
      • 📃 如何观察进程?
      • 📃 以文件目录的形式观察进程
      • 📃 进程标识符
      • 📃 父进程

🗞️ 冯诺依曼体系结构 🗞️

在这里插入图片描述

数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。

存储器:

在当前的计算机组成当中,存储方式分为内存存储与硬盘存储等;

与之不同的是硬盘为非易失性存储器(断电不易失),内存为易失性存储器(断电易失);

输入设备:

在生活当中, 键盘,摄像头,话筒,磁盘(读取文件),网卡等都为输入设备;

输出设备:

显示器,音响,磁盘(写入文件)网卡等都为输出设备;

CPU(中央处理器):

  • 运算器

    算逻运算 - 算术运算(±运算等)与逻辑运算(if,else)

  • 控制器

    CUP是可以相应外部事件的(协调外部就绪事件,例如将数据拷贝至内存当中)


📃 为什么在计算机当中需要使用内存充当中间介质而不使CUP与外设直接进行交互?

在各个存储介质当中,不同类型的存储介质的读取速度也不同

响应速度分别为:

CPU&&寄存器 > 内存 > 磁盘/SSD > 光盘 > 磁带

在最早的计算机当中是不存在内存的;

在这里插入图片描述

也就是外设与CUP之间直接进行交互;

但是实际上在计算机当中,最影响计算机整体速度的并不是计算机中最快的,而是最慢的;

若是使外设直接与CPU直接进行交互将会导致外设的速度大大拖慢CPU的速度导致计算机整体效率变慢;

而若是在计算机当中添加存储器后,可以使得外设中的数据通过操作系统率先load(加载)至存储器中,而又由于存储器与CPU的读写速度相差跨度并不是特别大,所以当数据加载至存储器当中CPU可以直接访问存储器从而加快计算机整体的速度;


📃 CPU如何读取数据

以当前大环境而言,CPU一般读取数据(数据,代码)都是从内存之中进行读取;所以若是以数据的角度进行观察:CPU不和外设直接进行交互;

当CPU需要处理数据时会首先将外设中的数据加载到内存当中(外设只与内存进行交互);

以这种方式可以进行一种分类

  • input

    将数据从外设(输入设备)加载至内存中;

  • output

    将数据从内存加载至外设(输出设备)当中;

当数据需要处理时数据首先会加载至内存,通过CPU读取内存数据并作出相应处理;

当数据处理完毕之后并不会直接从CPU转至外设(输出设备),会先将处理后的数据存放回内存并让外设(输出设备)进行显示;


🗞️ 操作系统(Operating system) 🗞️

在这里插入图片描述

操作系统可以看作一个用来对软硬件资源进行管理的软件;

硬件

硬件是整个计算机之中最基本的,任何操作系统都是基于硬件之上;

而在一个机器当中的所有硬件都是按照冯诺依曼体系结构进行存放,不存在杂乱无章;

驱动程序

而紧接着在硬件之上就是驱动程序,驱动程序也是系统软件部分的一部分,它的主要功能就是对硬件进行操作;

主要提供软件级别的对硬件操作的接口;

操作系统的主要工作分为两个方面:

  • 对上提供良好的使用环境;
  • 对下通过管理软硬件资源使计算机保持更高的稳定性;

📃 操作系统如何对资源进行管理

操作系统对资源进行管理时主要按先描述后组织的概念进行管理;

操作系统在整体中处于一个管理者的位置,而这里的先描述后组织的意思即为:

管理者将所有的被管理者以特定的结构进行描述,由于被管理者类型的不同,所以整体的结构也跟着不同;

由于大部分常见的操作系统都是由C/C++开发,所以可以将这个所谓的结构看成是一个结构体(被管理者可以看成类似实例化);

struct A{/*属性*/
};

而管理者正式通过这些对象的属性,根据需要的条件对资源进行操作和管理;


🗞️ 进程 🗞️

由于操作系统需要对软硬件资源都进行管理,当然这里的资源也包括进程;

从之前的知识点中可以总结出一条结论:当一个程序被运行时,必须将该程序先加载到内存当中,这是因为由于冯诺依曼体系结构规定CPU访问数据时或者要对数据进行对应操作时首先必需从内存中访问;

当然这句话说的并不全面,对于"当一个程序被运行时,必须将改程序先加载到内存当中",事实是如此,但这仅仅只是以硬件的角度进行观察,真正意义上来说,当一个程序被运行之后,将不能叫做程序,应该叫做"进程的一部分";

以Windows11为例,当我Ctrl+Alt+del并选择任务管理器时可以观察到许多进程;

在这里插入图片描述

根据用户的需要,用户可以通过这个任务管理器去结束相应的进程;

本质上操作系统并不具备直接管理程序的能力,但是操作系统中存在着一个进程管理;

当一个程序被运行起来之后,它将被加载进内存成为进程的一部分,而操作系统通过进程管理可以完成对这个进程的资源管理;

在Linux中也是如此,每当运行一个程序或者执行一条命令时都是将程序/命令加载进内存使其成为进程从而对该资源进行对应的管理;


📃 进程是如何被管理的?

在Linux中,可以同时运行多个程序或者同时执行多条命令的,当然这也意味着在Linux是可能同时存在大量的进程;

那么当Linux同时存在大量的进程时,操作系统该如何对进程这个资源进行管理;

其实很简单,在上文中我们提到的一个概念为 “先描述,后组织”;

操作系统对进程的管理也是如此;

在进程种有一种数据结构叫做PCB(Process Control Block),也可以称之为进程控制块,可以理解为进程属性的集合;

而在Linux下描述进程信息的PCB为task_struct,是以结构体的形式进行实现的;

当一个程序加载进内存成为进程时,操作系统将自动为这个进程创建一个PCB结构体对象,实现对这些进程的描述;相应的这个结构体内存着对应进程的所有属性,而操作系统将用某种数据结构将这些结构体对象链接在一起,从而使得能够通过不同的属性对进程进行对应的资源管理;

这就可以理解了为什么说"当程序被加载进内存的时候就成为了进程的一部分",因为只有加载进内存的程序(代码与数据) + 该进程所对应的PCB结构体这个整体才能称为是一个进程;

在这里插入图片描述

在PCB种包含的结构体化的数据属性中包含了:

  • 标识符

    描述本进程的标识符;

  • 状态

    任务状态,退出代码等;

  • 优先级

    程序相对于其他进程的优先级;

  • 程序计数器

    程序中即将被执行的下一条指令的地址;

  • 内存指针

    程序对应的代码以及数据的位置信息;

  • 上下文数据

    进程执行时处理器的寄存器中的数据;

  • I/O状态

  • 记账信息

    可能包括处理器时间总和等各种信息;

  • 其他


📃 如何观察进程?

在上文中我们提到了进程有关的概念,那么在Linux中该如何观察进程?

  • 在Linux一般可以使用ps来观察进程;

在这里插入图片描述

但是ps只能观察当前窗口(终端)的进程;

若是想要观察所有的进程的话需要使用指令ps axj,当然也可以配合管道|grep来查到对应所需要的进程;

在这里插入图片描述

那么该如何更直观的观察到进程?

假设有一个.cpp文件,代码为:

#include<iostream>using namespace std;
int main()
{while(1) cout<<"进程1"<<endl;
}

并执行这段程序;

此时就已经是执行了一个进程,当然可以使用ps命令的方式观察这个进程;

使用ps axj | head -1 && ps axj | grep myproc查询该进程:

在这里插入图片描述

该进程就已经跑了起来;

此时在终端使用ctrl+C结束该进程并再次查询该进程时发现该进程不存在;

在这里插入图片描述


  • 在Linux中除了用ps命令以外还可以使用top命令;

top命令在Linux中可以看作是Windows下的任务管理器;


📃 以文件目录的形式观察进程

  • 除了可以以上面的方式观察进程以外还可以以目录文件的形式观察进程;

以上面的方式我们再次运行那个程序,将进程跑起来;

  1. 先使用ps的方式查看进程的对应信息;

    在这里插入图片描述

    将会看到PID与PPID;

    我们首先观察23460的这个进程(下面的进程为使用grep时的进程,在本次中可以不进行观察);

  2. 再使用ls查看目录/proc;

    在这里插入图片描述

    可以发现/proc目录下的文件就是一些进程;

  3. 再使用ll并使用grep来找当前目录下的PID23460的这个进程(此时进程还在运行当中);

    在这里插入图片描述

    当我们手动使用Ctrl+C将程序结束时再使用该指令查找该进程时将发现该进程已经不存在;

    在这里插入图片描述

但这并不说明进程在Linux中是以目录的形式存在,实际上/proc是Linux中的一个文件系统,而这个文件系统是一个伪文件系统,通过该文件系统可以访问进程的属性信息而已;

使用ll观察23460这个目录下的文件可以发现,在该目录下存在着两个文件;

在这里插入图片描述

这两个文件分别以cwdexe开头;

  • exe 后所跟的路径为,当前进程所对应程序所在的路径;

  • cwd 后所跟的路径为,当前进程的工作目录;

    当一个程序运行时,每个进程都将会有一个属性来保存当前自身所在的工作路径;


📃 进程标识符

在上面提到了关键字PID,而实际上PID即为进程的标识符;

每个进程所对应的PCB都将会存储这个进程标识符;

进程标识符是每个进程中独有的属性;

当然每个进程在每次运行时其PID都将不同;

在程序中也可以使用getpid()函数来进行对当前进程PID的获取;

在这里插入图片描述

其中pid_t为操作系统中的一个数据类型,是一个无符号整型;

#include<iostream>
#include<sys/types.h>using namespace std;
int main()
{while(1) cout<<"进程1 "<<"PID : "<<getpid()<<endl;
}

在这里插入图片描述

从这里可以看到这里所获取的PID与之前观察到的PID都不同,可以验证在上面所说的"每个进程在每次运行时其PID都将不同";

  • 除了以Ctrl+C的形式结束进程以外也可以使用kill -9 'PID'的形式结束进程;

    在这里插入图片描述


📃 父进程

除了进程以外还有父进程,也可以在程序中使用getppid()函数来获取该进程的父进程的PID;

在这里插入图片描述

而实际上PPID即为bash(Bash 是一种命令行解释器和 shell 程序);

Shell通过创建子进程的方式来完成对应的任务;

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

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

相关文章

无人机航拍技术基础入门,无人机拍摄的方法与技巧

一、教程描述 买了无人机&#xff0c;可是我不敢飞怎么办&#xff1f;禁飞区越来越多&#xff0c;到底哪儿才能飞&#xff1f;我的无人机跟你一样&#xff0c;为什么我拍不出大片&#xff1f;厂家的说明书看不进去&#xff0c;有没有一套无人机的课程&#xff0c;可以快速上手…

C++初阶(十)模板初阶

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、泛型编程1、如何实现一个通用的交换函数呢&#xff1f;2、引出模板 二、函数模板1、函数模…

2023 全栈工程师 Node.Js 服务器端 web 框架 Express.js 详细教程(更新中)

Express 框架概述 Express 是一个基于 Node.js 平台的快速、开放、极简的Web开发框架。它本身仅仅提供了 web 开发的基础功能&#xff0c;但是通过中间件的方式集成了外部插件来处理HTTP请求&#xff0c;例如 body-parser 用于解析 HTTP 请求体&#xff0c;compression 用于压…

软件测试/测试开发丨接口测试学习笔记,TcpDump与WireShark

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27859 协议分析工具 网络监听&#xff1a;TcpDump WireShark 代理 Proxy 推荐工具&#xff1a;手工测试charles [全平台]、安全测试burpsuite [全平台 j…

网络安全自学手册

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

QT QSplitter

分裂器QSplitter类提供了一个分裂器部件。和QBoxLayout类似&#xff0c;可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。 比如一个按钮放在布局管理器中,它的垂直方向默认是不会被拉伸的,但是放到分裂器中就可以被拉伸。还有一点不…

如何在Visual Studio上创建项目并运行【超级详细】

工欲善其事&#xff0c;必先利其器。想要学好编程&#xff0c;首先要把手中的工具利用好&#xff0c;今天小编教一下大家如何在史上最强大的编译器--Visual Studio上创建项目。&#x1f357; 一.打开编译器&#x1f357; 双击你电脑上的vs&#xff0c;(2012,2019,2022)都行。&…

视频批量剪辑:AI智剪入门,轻松掌握智能剪辑技巧

在数字媒体时代&#xff0c;视频剪辑已经成为一项必备的技能。无论是为了工作需要&#xff0c;还是为了在社交媒体上分享生活&#xff0c;掌握视频剪辑技巧都能为我们的生活和工作带来很多便利。然而&#xff0c;对于初学者来说&#xff0c;视频剪辑可能是一项艰巨的任务。现在…

03【远程协作开发、TortoiseGit、IDEA绑定Git插件的使用】

上一篇&#xff1a;02【Git分支的使用、Git回退、还原】 下一篇&#xff1a;【已完结】 目录&#xff1a;【Git系列教程-目录大纲】 文章目录 一、远程协作开发1.1 远程仓库简介1.1.1 Github1.1.2 Gitee1.1.3 其他托管平台 1.2 发布远程仓库1.2.1 创建项目1&#xff09; 新…

2023/11/10 JAVA学习

取文件夹本身大小 打开文件 文件改名案例 输出流,文件依照你起的文件名自动创建 哪个流后创建,哪个流先关闭 虚拟机退出跑不了 finally别返回值

金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体

文章目录 金蝶云星空表单插件实现父窗体打开子窗体&#xff0c;并携带参数到子窗体父窗体打开子窗体准备设置携带参数打开子窗体子窗体接收参数 金蝶云星空表单插件实现父窗体打开子窗体&#xff0c;并携带参数到子窗体 父窗体打开子窗体准备 BillShowParameter OtherInAdd n…

外贸企业GMS认证|SD-WAN专线解决方案支持 IPv6、IPv4

IP地址是英文internet protocol的缩写&#xff0c;是网络之间互连的协议。互联网诞生后&#xff0c;很长一段时间都是使用v4版本的IP协议&#xff0c;也就是 IPv4 &#xff0c;目前全球使用互联网的人数达到了48.8亿&#xff0c;而IPv4的地址库总共约43亿个地址&#xff0c;每个…

blender动画制作软件拓扑全流程

拓扑在三维动画制作中至关重要&#xff0c;原因如下&#xff1a; 1. 动画变形&#xff1a; 自然形变&#xff1a; 良好的拓扑结构能够支持角色或物体在动画中的自然形变&#xff0c;例如关节弯曲、肌肉收缩等。流畅运动&#xff1a; 适当的拓扑有助于保持模型表面的平滑性&…

KiB、MiB与KB、MB的区别

KiB、MiB与KB、MB的区别

排序算法的空间复杂度和时间复杂度

一、排序算法的时间复杂度和空间复杂度 排序算法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 冒泡排序 O(n) O(n) O(n) O(1) 稳定 直接选择排序 O(n) O(n) O(n) O(1) 不稳定 直接插入排序 O(n) O(n) O(n) O(1) 稳定 快速排序 O(n…

如何在Jetpack Compose中显示PDF?

当读取和显示 PDF 的组件缺失时该怎么办? 声明式编程可以拯救你. Jetpack Compose已经存在好几年了, 但_在某些方面它的使用仍然面临挑战_. 例如, 缺少用于查看PDF的官方组件, 而为数不多的第三方库通常也是有代价的. 在我们的应用中, 我们会遇到在许多场景中显示 PDF 的需求…

Windows安装Docker(无网)

Windows安装Docker&#xff08;无网&#xff09; window无网安装Docker 1. 开启虚拟化功能 1. 开启window的虚拟化功能 方式一&#xff1a;直接在window的搜索框搜索 “启用或关闭windows功能”&#xff0c;就可以快捷进入【启用或关闭windows功能】页面 方式二&#xff1…

Word脚注如何插入?1分钟学会!

“最近在写一些文章&#xff0c;引用了一些注释&#xff0c;想为它们增添一些脚注。有没有朋友知道在word里脚注怎么添加呀&#xff1f;” 使用word编写文章时&#xff0c;添加脚注是一项常见的任务&#xff0c;用于引用文献、添加注释或提供额外信息。但可能很多朋友不知道wor…

Mybatis(四)

9. MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; Java实体类 Mapp…