Linux 进程概念(一)

news2024/12/28 3:30:21

目录

一、冯诺伊曼体系结构

二、操作系统(Operator System)

2.1 操作系统如何管理硬件?

2.2 操作系统如何管理软件?

2.3 一张图带你直观了解OS管理过程

三、进程(启示录)

3.1 进程的基本概念

3.1.1 进程PCB

3.1.2 task_struct内容分类

3.2 查看进程

 3.3 结束进程方式

3.4 通过系统调用创建进程-fork初识

3.4.1 fork()函数

3.4.2 getppid()获取父进程id

3.4.3 创建并查看父子进程


一、冯诺伊曼体系结构

冯诺伊曼体系架构了大部分计算机的程序执行的流程!接下来我们将要主要围绕存储器(这里指的是内存)与程序之间的交集!

在此之前需要你有一定的计算机设备了解,了解内设,外设主要硬件设备!

根据冯诺伊曼体系要求,计算机CPU处理数据的来源是内存,编译器会将程序代码编译成CPU认识的二进制指令集,然后程序运行后加载到内存中,CPU读取内存指令执行代码!整个过程CPU不与外设直接打交道,而是与内存直接“沟通”!也就是说数据载入一定载入到内存中,内存写出也一定写到外设中!

现在打个比方,如果你想在QQ上将某个文件发给自己的好友,从发送到接收的过程,大致可以简化成 你的磁盘-->你的内存-->对方内存-->对方磁盘 的过程!

接下来我们将要简单理解管理软硬件,控制程序的执行的系统软件--操作系统(OS) !

二、操作系统(Operator System)

简单概括:操作系统是一个软硬件资源管理的软件

操作系统的核心任务:1.内存管理 2.进程管理  3.文件管理  4.驱动管理

2.1 操作系统如何管理硬件?

在我们的程序中,我们会无时不刻地利用函数调用我们的外设,比如C的printf,C++的cout,那么谁帮助我们管理安排这些调用呢?答案是我们的操作系统,操作系统会通过底层硬件设备的驱动管理去管理我们的底层硬件!

管理的核心思路是先描述,后组织!在计算机中我们对于数据总会通过某种属性将数据汇聚,比如一名学生,我们通过它的姓名,年龄,班级等特有属性来描述一个学生,然后通过属性数据区分不同的学生,便依此来实现我们特有的操作!在代码实现,我们可以利用一个结构体来实现我们之前所述的描述!操作系统对于不同硬件同样如此,然后操作系统利用数据结构容器(比如链表)组织硬件设备数据信息!并依此操作(增删查改)它们,这样我们可以实现具体环境调用具体的设备!

2.2 操作系统如何管理软件?

软件能管理硬件,同样软件可以管理软件!方法同样是先描述,后组织!

通过上文的所述,我们可以看到OS帮助我们有效运行计算机的运行!用户通过代码指令来操作我们的计算机!但不是操作我们的操作系统!操作系统不相信任何人用户不能直接对操作系统进行直接操作!因为OS不知道用户的属性是“好人”还是“坏人”!但OS又要给用户提供服务,所以操作系统封装保护了自己,然后它会提供客户系统调用接口!这个过程我们可以理解为我们到银行取钱,但不是直接到金库取钱!工作人员给予我们服务!但我们与工作人员有一窗之隔,我们在窗口两端进行我们的操作!此时我们可以将工作人员看作OS系统,某一个窗口是一个系统调用接口,金库是我们底层的硬件!

那些窗口我们称之为 系统调用!我们将钱或者银行卡从窗口交付的过程叫做传参,钱或者银行卡返回给我的过程称为返回值!  Linux操作系统用的是C语言写的,它的系统调用接口本质是C式接口。其实我们之前学过的很多语言函数接口本质上与这些系统调用接口有很大的关系!它们的函数内部封装了这些系统调用接口!它们的函数调用绕不开这些系统调用!

到这还没讲完!几年前,银行的服务比较落后,很多服务在不了解银行操作流程不能完成!很多老人群体不清楚办事流程,所以不会进行银行操作!但随着现代化发展,银行的人性化服务不断发展,银行内有了大厅接待人员,一位什么都不懂的老人只需要将自己的基本信息填好交给这个大厅接待,然后大厅接待去拿着表格到相应的窗口替你办事!整个过程中相当于是别人帮老人完成了服务!这里的老人当作是用户群体,这个大厅经理相当于shell(指令)、C/C++(lib库)、图形化界面!

到这里我们的整个OS操作系统基本过程就讲完了!后面的一张图很完美诠释了整个阶梯流程!

2.3 一张图带你直观了解OS管理过程


三、进程(启示录)

上文提到OS的核心任务有进程管理,那么它如何管理进程呢?

同样是先描述,后组织!下面我们来学习Linux第一座大山:进程!

3.1 进程的基本概念

进程:一个运行起来(加载到内存)的程序称为进程(粗略)

3.1.1 进程PCB

我们知道我们写的代码本质是一个文件,最终放到我们的磁盘上!当我们运行exe文件时,exe文件会被加载到内存中!我们的计算机可能有许多程序被加载到内存中,那么CPU如何判断先执行哪一个程序呢?

同样还是先描述,后组织!描述一个正在运行的程序(进程)的工具是--进程PCB(进程控制块)!在Linux中进程PCB是结构体task_struct!PCB中数据是一个进程的所有属性!每一个加载到内存的进程,OS通过PCB描述它们,然后按照先后通过链表串联这个PCB(组织)

3.1.2 task_struct内容分类

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

💡💡这里PCB有一个数据是内存指针存储的是指向程序代码文件的指针,也就是说PCB中有了这个文件指针,我们就能找到对应的磁盘代码!也就是说一个进程=内核数据结构(PCB) + 进程对应的磁盘代码

所以CPU读取代码指令,首先OS系统帮助我们在进程链表中遍历每一个进程的PCB查看它们的进程状态以及进程优先级,综合考量后将一个进程交付给我们的CPU读取进程相应的文件代码!所以操作系统管理进程的本质其实是管理进程的PCB!

3.2 查看进程

在Windows操作系统中,我们可以通过任务管理器查看我们的进程!

那么在Linux中我们如何查看一个进程呢?

Linux中进程的标识符为pid_t类型的数字,系统调用函数getpid()获取进程的标识符!

现在我们来看getpid函数头文件!

现在我们上代码~

 Linux中查看我们进程属性的方式: ps ajx | head -1 && ps axj | grep waitpro |grep -v grep

这里的grep后面跟exe文件名,grep -v grep是因为grep本身也是一个进程,所以-v取消查看grep进程

现在我们来查看一个进程!


 3.3 结束进程方式

结束进程方式:kill -9 +进程的pid /在运行的代码窗口ctrl+c !!


3.4 通过系统调用创建进程-fork初识

3.4.1 fork()函数

fork函数是用来创建子进程的!fork之后会有两个进程

子进程,顾名思义,首先它是一个进程,子进程依赖于父进程,父进程通过fork来创建子进程!创建完子进程后,OS会描述子进程,提供子进程的PCB!子进程会共享自fork函数以后的代码!

fork函数对于不同进程返回不同的值,fork创建失败返回-1,fork创建子进程成功以后,父进程的fork函数会返回子进程的id,子进程的fork函数会返回0!通过id的不同,我们可以让父子进程执行不同的代码!

到后面学到进程地址空间,我们会更加深入地讲解fork函数如何返回两个值!


3.4.2 getppid()获取父进程id



现在我们再看看这个进程的父进程!

我们可以看到我们的进程两次运行进程id发生了变化,但是我们的父进程id却没有发生变化!我们的父进程是bash!它是我们xhell的代理人!如果杀掉这个父进程,我们的xhell也就会什么命令都执行不了!这个bash每次我们登录xhell就会启动!也就是说我们的程序每次加载到内存,OS就会描述一遍这个进程!


3.4.3 创建并查看父子进程

现在我们直接上代码看看如何使用fork()创建子进程


查看父子进程

根据结果,很明显我们可以看到,子进程的fork返回值是0,所以执行了if语句的代码!父进程fork获得了子进程的id,执行了else语句!

再进一步我们来直接打印证明我们fork返回值



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

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

相关文章

寒假本科创新——机器学习(二)

绪论1.3归纳偏好 一般原则:奥卡姆剃刀 什么样的算法比较好?1.4NFL定理 NFL定理的前提: NFL定理的寓意:1.3归纳偏好 归纳偏好(lnductive Bias): 机器学习算法在学习过程中对某种类型假设的偏好…

sql语句练习2

1、列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资 做法: 第一步:找出至少有一个员工的部门编号mysql>select deptno,count(empno)from empgroup by deptnohaving count(empno)>0; 第二步: …

node.js快速入门指南

Node.js迅速蹿红,衍生了一个强大的开源社区、支持企业,甚至还拥有属于自己的技术大会。我把这种成功归结于它的简介,高校,同时提高了编程生产力。 Node.js 的前置知识很多,例如以下知识 JavaScriptES6Ajax 还不会的…

Java JVM:虚拟机性能监控、故障处理工具(三)

目录标题一、基础故障处理工具二、可视化故障处理工具三、其他故障相关一、基础故障处理工具 JMC(Java Mission Control)以及JFR(Java Flight Recorder) JMC 从 Java7 以后包含在 JDK 中,直接输入 jmc 就能启动在使用…

JEECGboot数据规则篇

使用 一、功能说明 列表数据权限,主要通过数据权限控制行数据,让不同的人有不同的查看数据规则; 比如: 销售人员只能看自己的数据;销售经理可以看所有下级销售人员的数据;财务只看金额大于5000的数据等等…

js事件高级

文章目录一、注册事件(绑定事件)1、注册事件概述(1)传统注册方式(2)方法监听注册方式2、addEventListener 事件监听方式3、attachEvent 事件监听方式4、注册事件兼容性解决方案二、删除事件(解绑…

C库函数:string.h

string.h C 标准库 – <string.h> | 菜鸟教程 (runoob.com) 1void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c&#xff08;一个无符号字符&#xff09;的位置。在这个函数中&#xff0c;可以看到有void …

使用docker安装zabbix监控

官网手册&#xff1a;docker安装zabbix 首先需要安装好docker服务 创建专用于Zabbix组件容器的网络 docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net启动空的 MySQL 服务器实例 docker run --name mysql-server -t \ //mysql容器…

FFMPEG完美入门资料---002---FFmpeg 支持能力说明

FFMPEG入门资料---001---介绍和参数说明_音视频开发老马的博客-CSDN博客 接着上文写&#xff1a; 2.3.1 FFmpeg 对编码解码器的支持 ffmpeg 支持的编解码器种类共有 280 多种&#xff0c; 涵盖了几乎所有常见音视频编码格式&#xff0c; 能解码几乎所有的音视频&#xff0c; …

月交付破万,长安深蓝成造车新势力“头部玩家”

近日&#xff0c;造车新势力纷纷公布2022年12月交付数据。通过数据&#xff0c;我们发现众多造车新势力都取得了不错的成绩&#xff0c;“头部玩家”的门槛甚至提升至万辆。与此同时&#xff0c;“排位”形势也与往年大相径庭&#xff0c;其中最令人意外的是2022年发布的深蓝品…

ESP8266+MicroPython开发:使用ESP8266+Thonny烧录MicroPython固件

使用ESP8266Thonny烧录MicroPython固件下载固件下载安装Thonny在Thonny烧录固件测试Thonny简单使用下载固件 MicroPython下载网址 根据ESP8266的flash选择&#xff0c;一般选择如图所示 自己随便选择一个版本下载&#xff0c;注意记住自己的下载路径 下载安装Thonny Thonn…

【vue系列-05】vue的生命周期(详解)

深入理解vue的生命周期一&#xff0c;vue的生命周期1&#xff0c;创建流程1.1&#xff0c;beforeCreate1.2&#xff0c;created2&#xff0c;挂载流程2.1&#xff0c;beforeMount2.2&#xff0c;mounted3&#xff0c;更新流程3.1&#xff0c;beforeUpdate3.2&#xff0c;update…

ConvNeXt V2论文翻译:ConvNeXt V2与MAE激情碰撞

文章目录摘要1 简介2 相关工作3 全卷积掩码自编码器4 全局响应归一化5 ImageNet实验6 迁移学习实验7 结论摘要 论文链接&#xff1a;ConvNeXt V2 在改进的架构和更好的表示学习框架的推动下&#xff0c;视觉识别领域在21世纪20年代初实现了快速现代化和性能提升。例如&#xf…

评价类模型(层次分析法与模糊评价模型)

一、评价类模型 综合评价的基本理论和数据预处理&#xff1a; 评价对象评价指标权重系数综合评价模型评价者 二、AHP法—层次分析法 通过打分解决评价类问题&#xff0c;两两比较&#xff0c;推算权重。 %function RIAHPRI(n) %利用MATLAB求随机一致性指标; i0;CI0;Azer…

pyqt5下的QInputDialog跟QFileDialog以及关闭主窗口子窗口自动关闭

QInputDialog 具体的参数可以参考&#xff1a; Qt&#xff1a;30---QInputDialog标准输入对话框_mb6128aabee41d4的技术博客_51CTO博客 官网连接&#xff1a; QInputDialog Class | Qt Widgets 5.15.12 这里只介绍QInputDialog.getText 代码实现&#xff1a; from PyQt5.…

【从零开始学爬虫】采集食品行业最新报价数据

l 采集网站 【场景描述】采集食品行业最新报价数据。 【源网站介绍】中国报告大厅网休闲食品行业数据频道提供休闲食品行业数据信息&#xff0c;在此有大量休闲食品行业数据信息可供选择&#xff0c;是一个可以帮助休闲食品行业了解数据的平台。 【使用工具】前嗅ForeSpider…

hbase2.x orphan regions on filesystem

问题描述&#xff1a;orphan regions on filesystem 可以通过主master web页面的HBCK Report查看 也可以通过hbck2工具查看 # 查看指定表 hbase hbck -j $HBASE_HOME/lib/hbase-hbck2-1.3.0-SNAPSHOT.jar addFsRegionsMissingInMeta default:tableName # 查看命名空间下所有…

Git分支开发中的问题

前言我们在开发中&#xff0c;经常是很多人开发同一份代码&#xff0c;早期没有git工具的时候那可真是噩梦&#xff0c;要复制来复制去&#xff0c;不止繁琐&#xff0c;还容易出错&#xff0c;所以后来涌现了各种代码工具&#xff0c;Svn&#xff0c;Git等等&#xff0c;而Git…

一、mysql基础、MySQL的安装及卸载、DML、DQL

MySQL基础 1、数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果&#xff0c;当然文件存储也有它的弊端。 假设在文件中存储以下的数据&#xff1a; 姓名 年龄 性别 住址 张三 23 男 北京西三…

干货|app自动化测试之Andriod WebView如何测试

Hybrid App&#xff08;混合模式移动应用&#xff09;是介于 Web-app、Native-app 之间的 app&#xff0c;本质上是 Native-app 中嵌入 WebView 组件&#xff0c;在 WebView 组件里可以访问 Web App。Hybrid App 在给用户良好交互体验的同时&#xff0c;还具备了 Web App 的跨平…