Linux进程概念(1)

一、冯诺依曼体系结构

学过计组的同学应该都很熟悉这个结构,可以说这是计算机的基础了:

其实我们日常就经常使用到该结构中的各个部分:
输入单元:包括键盘, 鼠标,扫描仪等。
输出单元:显示器,打印机等。
还有中央处理器(CPU):由运算器和控制器组成。
存储器:即计算机的内存。计算机的外设(输入输出设备)和CPU的互相访问都要通过内存。

二、操作系统

2.1操作系统的概念

什么是操作系统,我们日常使用的手机操作系统有IOS、安卓(AOSP),以及最近的鸿蒙OS和Xiaomi HyperOS,光是苹果的操作系统就有Mac OS、IOS、iPad OS...我们发现他们都有一个特点,都要加OS,那么什么是OS?
OS即 Operator System 的简称,笼统地说,操作系统包括:
1.操作系统内核:进行进程管理、内存管理、文件管理等。
2.其他程序:如函数库、Shell程序

2.2设计操作系统目的

我们根据下图和学过的知识,用户可以通过 Shell 等和操作系统交互,操作系统底层的驱动程序和硬件均由各个厂商提供,操作系统又可以通过驱动程序和计算机的硬件直接交互。
操作系统拥有着上传下达的使命,对下可以管理所有的软硬件,对上可以为用户提供良好的(高效、稳定、安全)运行环境。
                                                                                                                          图片来源:比特科技

三、进程的概念

3.1基本概念

从内核来说:进程是担当分配系统资源(CPU时间,内存)的实体

一个程序未被执行时存在于磁盘中,而磁盘属于外设的一种,如果我们想调用该可执行程序,则需要把它放在内存中(冯诺依曼体系结构:计算机的外设(输入输出设备)和CPU的互相访问都要通过内存。):
那么进程到底是什么?
进程对应的代码和数据这么多,CPU是如何分辨执行顺序的优先级或其他的?

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

我们的操作系统也是软件,在未开机时它也是一堆二进制文件,当我们开机时,操作系统其实是第一个加载到内存的软件,所以上面的内核数据结构都存在于操作系统占用的内存中,开机时系统根据进程 malloc 出 PBC 的空间,当我们开机时等待的时间就是计算机把磁盘中的软件拷贝到内存中的时间。

所以 进程 = 内核task_struct结构体 + 程序的代码和数据

task_struct内容分类:

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

3.2查看进程

[ps axj] 命令可以查看当前所有进程,axj顺序可颠倒

[ps axj | grep Filename] 命令可以筛选并查看名为Filename的进程:

[ps axj | head -1] 命令可以查看以上进程每列表示的信息:

将以上两种命令通过 [&&] 结合即可同时生成:

这些信息的含义我们在下面再为大家介绍。

3.3启动进程

a.Linux 下我们通过 [./XXX] 命令来运行某个文件,本质上就是让系统创建进程并运行,而我们自己写的各种程序其实和系统中的命令是等价的,他们都是可执行文件,他们瞬间把我们的需求加载到内存,在 Linux 下大部分执行操作,本质上都是在运行进程

b.通过 [ps axj | grep Filename] 与 [ps axj | head -1] 命令,我们查看到进程信息有[PID],我们的每个进程都有独特的标识符——进程[pid]

c. [Ctrl+c] 指在用户层面终止进程,[kill -9 [pid]]可以直接杀掉进程。

3.4系统调用 && get pid

3.4.1什么是系统调用

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用,这也就是面向对象语言的封装性。
我们在C++中使用的 cin、 cout ... 等都是系统调用,它们的库是 std 标准库,我们的进程想知道自己的pid,应该怎么做呢?这就用到了系统调用的知识。

3.4.2 get pid

系统为我们提供了一个接口函数 [getpid()],便于我们查看进程的 pid 。

我们还可以用 [man getpid] 命令来查看 getpid 函数:
如果你无法执行 [man getpid] 这个命令,而且系统报错:[No manual entry for getpid] ,请尝试先执行以下代码:[sudo yum -y install man-pages],安装完成后执行 [sudo yum update] 。

3.5 ppid

3.5.1 get ppid

首先我们来看一下进程内部属性里的 [ppid] ,它是指当前进程的父进程的 id ,我们用 [get ppid()] 这个函数一样可以查到它是什么。这里先简单认识,下面我们来看一个细节:
这是为什么呢?我相信每次的 pid 都不相同大家都能理解,因为执行的时间不一样,每次随机分配的 pid 也不一样是正常的,那为什么 ppid 总是一样的呢?

3.5.2 ppid

接下来我们来看看 ppid 是什么呢?

它竟然是 bash !我们在哪里还遇到过 bash 呢?

我们在 Linux 权限时讲过,我们在使用操作系统时,通过外壳程序(即XShell)来先完成,而外壳程序为了保证自身的稳定性,会创建一个子进程让它来执行我们的命令,这个子进程名为 bash !

3.6进程创建的代码方式

我们先来看一下新的命令,该命令可以持续地帮助我们查看进程的信息:

while : ; do ps axj | head -1 && ps axj | grep Filename | grep -v grep; sleep 1; done

其中褐色部分是 Shell 命令,意思是重复执行内部的代码;蓝色部分是我们需要执行的代码,也就是前面讲的查看进程信息的代码, [grep -v grep] 意为筛出掉包含 grep 的信息,也就是说我们查看进程信息时,不会再看到 grep 进程的信息行。

那么如何创建进程呢?这里我们要接触到第三个系统调用, fork() 函数。
我们同样可以用 [man] 命令来查一下 fork() 函数具体的用法:

下面我们编写一下简单的代码来看一下 fork 的作用:
我们持续地查看进程的信息,从中得到了子进程和父进程。

3.7详解fork()

我们看上面的例子,父子进程执行同一份程序,如果我们想执行同一份程序,其实没必要用到子进程,在一些特殊的情况,我们需要父子进程执行不一样的程序,这才是我们子进程的目的。

我们先来了解一下fork()的返回值:
fork() 会返回两次,其有两个返回值。
当执行的是子进程时,返回值是0;当执行的是父进程时,返回值为子进程的 pid 。

我们来看下面的程序,我们发现 if 和 else 中的程序全都被执行了,这是为什么呢?

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

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

相关文章

粒子群算法优化RBF神经网络气体浓度预测

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络气体浓度预测,pso-rbf气体浓度预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88937920 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,粒子群算法优化R…

后勤管理系统|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的后勤管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 员工注册、员工登录 个人中心 公寓信息 员工功能模块 员工积分管理 管理员登录 ​编辑管理员功能模块 个人信息 ​编辑员工管理 公寓户型管理 ​编辑公寓信息管理 系统结构设计 数据库设计 luwen参考 概述 源码获取 文末获取源…

Docker基础教程 - 12 常用容器部署-Nginx

更好的阅读体验:点这里 ( www.doubibiji.com ) 12 常用容器部署-Nginx 下面介绍一下常用容器的部署。可以先简单了解下,用到再来详细查看。 在 Docker 中部署 Nginx,并通过挂载方式将 Nginx 的配置文件和站点目录挂…

开发指南006-后端配置文件

后端配置文件分为两层,一是部署目录中的内容如下: 这里最重要的是端口号,同一个目录下可以是一个jar包多个配置文件,启动批处理中,按一个配置文件启动一个程序的方式启动多个服务。例如上面目录里的启动批处理文件可以…

Asp .Net Web Forms 系列:配置图片防盗链的几种方法

通过 URL Rewrite Module 组件 URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大工具。这个模块允许你将复杂的、不易于记忆或不利于搜索引擎优化的 URL 转换为更简洁、更友好的格式。通过 URL 重写,你可以提高…

【存储】ZYNQ+NVMe小型化全国产存储解决方案

文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…

同步通信与异步通信

同步通信:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 异步通信:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 像IIC 、SPI这类是同步通信(凡是带有时钟信号的基本上…

解码人工智能的幽默:理解其背后的误解与挑战

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

个人职业规划的制定方法

在竞争激烈的职场环境中,一个明确的职业规划对于个人发展至关重要。本文将探讨我的个人职场规划,包括短期和长期目标,以及实现这些目标所需的策略和行动。 一、自我评估 1.1 职业兴趣:我对市场营销和数据分析领域充满热情&#xf…

Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

目录 Java-项目管理-工具配置 Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用…

day41 动态规划part3

343. 整数拆分 中等 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 但是dp[0] 和 dp[1]为什么是0值得讨论,或者说不用讨论,压根…

加密与安全_PGP、OpenPGP和GPG加密通信协议

文章目录 PGPOpenPGPGPG工作原理工作流程用途案例说明过程 代码实现pom依赖PgpEncryptionUtilPgpDecryptionUtilCommonUtilsPgpEncryptionTest 小结 PGP PGP (Pretty Good Privacy) 是一种加密通信协议,用于保护电子邮件和文件的安全性和隐私。它通过使用加密、数字…

uni-app开发特点和开发流程

uni-app是一个基于Vue.js框架的跨平台应用开发框架,通过一套代码可以同时运行在多个平台上,包括iOS、Android、H5等。它采用了基于流布局的页面渲染机制,可以自动适配不同平台的屏幕尺寸和分辨率。uniapp官网:https://uniapp.dclo…

qt 汉字输出 中文输出 显示乱码 qDebug() 乱码 解决

要正确显示汉字,必须要先了解计算机文字编码相关知识,参考:unicode ucs2 utf16 utf8 ansi GBK GB2312 互转 及 渲染_ucs2编码转换-CSDN博客 1、汉字输出到 应用程序输出面板 qt 自定义的输出类qDebug() 、QDebug对象、QMessageLogger默认输…

用眼精星票证识别系统,轻松将户口本转成结构化Excel

眼精星票证识别系统是一款革命性的软件,它以高度的精准性和效率为特点,为用户提供了一个简单便捷的工具,将纸质户口本转化为结构化数据。这一创新技术不仅改变了传统数据录入的方式,还大大提高了工作效率,为用户节省了…

Buildroot 之二 详解构建架构、流程、external tree、示例

构建系统 Buildroot 中的构建系统使用的是从 Linux Kernel(4.17-rc2) 中移植的 Kconfig(配置) + Makefile & Kbuild(编译)这套构建系统,移植后的源码位于 support/kconfig/ 目录下。Buildroot 本身是一个构建系统,与直接编译源码不同,因此,它对这套系统进行了比较…

web服务器集群试题

服务器IP地址规划:client:12.0.0.12/24,网关服务器:ens36:12.0.0.1/24、ens33:192.168.11.1/24;Web1:192.168.11.10/24,Web2:192.168.11.11/24,Nginx&#xf…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Stack容器组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Stack容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Stack容器组件 堆叠容器,子组件按照顺序依次入栈,后一…

Yarn:Node.js依赖管理的现代选择

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HTML5七天学会基础动画网页10(2)

制作立方体 学完前面的基础内容&#xff0c;制作立方体是个不错的练习方法&#xff0c;先看成品 再分析一下&#xff0c;六个面让每个面旋转平移就可以实现一个立方体&#xff0c;来看代码: <title> 制作立方体</title> <style> *{ margin: 0; padding: 0; …