【linux】:进程概念
文章目录
- 冯诺依曼体系结构
- 一:操作系统
- 二: 进程
- 总结
冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
冯诺依曼体系如下图:

那么输入设备有哪些呢?如键盘,鼠标,话筒,摄像头,磁盘等。
存储器就是我们经常说的内存了。
输出设备有网卡,声卡,音响等。
cpu含有运算器和控制器等。
那么为什么冯诺依曼要有内存呢?直接让输入设备连接cpu到输出设备不是更方便吗,大家看如果是下面这个体系怎么样?

首先这样的体系是没问题的,可以直接让输入设备直接和cpu沟通,但问题在于cpu的运行速度非常快,而输入设备和输出设备都属于外设,外设一般都会比较慢,就比如磁盘和内存的比较,磁盘如果将数据存入会一直存在,而内存是一种掉电易失的介质如果你使用的电脑台式电脑突然停电关机了那么内存里的数据就没有了,但是相对于磁盘,内存的速度比较快。冯诺依曼体系之所以让外设与内存沟通是因为要防止木桶原理,cpu的算力太快了是外设远远比不上的,而有内存的存在就可以大大的缓解木桶原理带来的效率慢的问题。因为有了内存的存在,我们可以对数据进行预加载,CPU以后在进行数据计算的时候,根本就不需要访问外设了,而只要直接伸手向内存要就可以了。
结论一:在数据层面,一般CPU不和外设直接沟通,而是直接只和内存沟通。这也就回答了为什么我们的程序必须先被加载到内存中,因为这是体系结构决定的。
那么在硬件层面,单机和跨主机之间数据是如何流向的呢?看下图:

举个例子:比如我们用qq给别人发送消息,先从键盘输入要发送的消息,然后将数据经过内存被CPU运行后再回到内存然后将数据交给输出设备,这个时候给别人发消息的那个人的屏幕会先显示出发送的消息,然后经过网络等到接收消息的人的输入设备然后经过内存,cpu然后显示到对方的屏幕上。
一、操作系统
操作系统是进行软硬件资源管理软件的。任何一个计算机系统都包含一个基本的程序集合,称为操作系统(OS),笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理),其他程序(例如函数库,shell程序等等)
那么如何理解操作系统对硬件做管理呢?我们举个例子:就比如学生,是谁在管理学生呢,当然是校长在管理学生了,校长主要是决策,辅导员主要是去执行校长做出的决策,而学生是参与执行的对象,在校长管理期间,校长只需要向各级领导发放指令管理学生,而不会直接和学生沟通管理。所以我们得出以下结论:1.管理者和被管理者其实是不需要直接沟通的。
2.管理的本质:对被管理的对象的数据进行管理
3.用什么管理呢?数据结构。
管理的本质就是先描述,在组织。就像各个不同的程序,先将这些程序描述为一个个的结构体,然后以链表的形式进行对单个节点的修改也就是管理。
而像我们刚刚举得学生的例子中,校长就是操作系统,辅导员就是硬件驱动,学生就是硬件或软件。
那么操作系统为什么对软硬件资源进行管理呢?操作系统对下通过管理好软硬件资源(手段),对上给用户提供良好(安全,稳定,高效,功能丰富)的执行环境(目的)。
那么操作系统是如何给用户提供良好的执行环境的呢?操作系统通过暴露出一些系统接口供用户操作使用,这里就好比银行一样,银行为人们服务是窗口式服务,像金库等一些重要的地方是不会对用户进行开放的,而开放的地方也会用窗口封装起来避免遭到破坏,所以操作系统是不会相信任何一个用户的,它只是暴露出一些可以供用户使用的接口去使用,同时还要保证操作系统内部的安全,所以这些接口是经过一层又一层的封装,而这些由操作系统提供的接口又被称为系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很利于更上层用户或者开发者进行二次开发。
二、进程
我们现在大多数人都接触过电脑,那么我们以windows为例,windows中的进程是什么样的呢,大家看下图:

因为windows是图形化操作的所以这些进程看起来非常生动形象。那么这些进程该如何去理解呢?
首先,我们以前的任何启动并运行程序的行为,都是由操作系统帮助我们将程序转化为进程完成特定的任务。
如下图:

首先我们要运行一个程序,这个程序保存在磁盘中,当双击运行就把这个程序的代码和数据加载到内存中,每加载一个程序的代码和数据操作系统都会将这个程序的代码和程序用pcb/task_struct保存起来,并且将这些程序的代码和数据连接起来像链表一样进行控制,用户想要优先使用哪个软件就将这个软件的pcb/task_struct加载到CPU中进行运行,所以对于进程的管理就转化为了对pcb/task_struck进行链表的增删查改。进程不是内存中的代码和数据,进程是代码和数据加该进程在内核中加载的pcb/task_struct合起来。
结论:进程 = 内核关于进程的相关数据结构 + 当前进程的代码和数据
描述进程-PCB:进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB,linux操作系统下的PCB是task_struck
为什么要有pcb呢?我们前面说过操作系统管理的本质是先描述在组织,而进程的描述就是靠pcb。
task_struck内容分类
标识符:描述本进程的唯一标识符,用来区别其他进程。
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的I\O请求,分配给进程的I\O设备和被进程使用的文件列表。
记账信息:可能包括处理器的时间总和,使用的时钟数总和,时间限制,记账号等
其他信息。
下面我们在linux系统下演示进程的存在:
首先创建一个.c文件用来写一个死循环程序,这样方便我们看到进程:

然后我们创建一个并写出一个一个简单的Makefile文件:
文件中冒号的左边依赖于冒号的右边,也就是说没有process依赖于myprocess.c,gcc - o中的$@符号是指冒号左边的文件,$^是指冒号右边的文件。

然后我们写了一个简单的死循环代码,现在开始运行。

现在这个可执行程序已经跑起来了,根据我们上面所讲的,先将代码和数据加载到内存,然后变成一个task_struct,这就变成一个进程了,那么怎么看到这个进程呢?先复制一个会话,在新会话中用ps axj命令可以查看所有的进程,然后我们利用管道来过滤只想看我的进程。

然后我们再利用管道head -1查看第一行

然后我们利用逻辑与拿到我们进程的信息:
这个时候我们就拿到了进程的属性,最后一行的grep是什么呢?这是因为我们利用grep去过滤进程,而grep本身也是一个进程,所以进程中可以看到grep,那么如果我们不想看到grep该怎么操作呢?只需要在刚刚的命令下多加一个管道grep -v grep就过滤掉grep这个进程了。

我们在开一个会话运行这个死循环程序,然后看看他们的进程属性。

这个时候我们就能看到有两个myprocess可执行程序他们两个很明显是两个不同的进程,任何一个进程都有自己的pid,除了上面这种查看进程的方式,我们还有在系统根目录查看进程的方式:
proc就是进程的缩写,图中红色就是刚刚我们所查看的进程在根目录下显示的情况

我们利用访问文件的方式去查看新增的进程的属性:

接下来我们将进程用ctrl+c终止了。
当我们将程序结束后就看不到相对应的进程了。
刚刚我们看到了进程对应的pid,那么我们能不能在写程序的时候就获取到pid呢?答案是可以的,我们可以用getpid()函数来获取pid。

因为getpid()这个函数所需要包含的头文件为#include <unistd.h> 和 #include <sys/types.h>所以我们多加了这个头文件,那么我们来运行一下。注意:修改.c文件后切记make clean一下然后再重新make生成可执行程序。

可以看到我们获取到了pid,现在去验证一个是否正确。

很明显是正确的,之前我们就看到了pid旁边的ppid那么ppid是什么呢?ppid其实是这个进程的父进程,每个进程都会有子进程和父进程,下面我们以同样的方式获取一下父进程的pid:



进过验证我们也能发现是正确的。然后我们再重新运行一下程序:

这个时候我们发现子进程变了但是父进程还是刚刚的15611这是什么原因呢?那么我们就去查查这个父进程是什么:


通过检查我们发现父进程竟然是bash。bash是命令行解释器,bash本质上也是一个进程,因为bash有独立的pid。接下来我们得出结论:
1.命令行启动的所有的程序,最终都会变成进程,而该进程对应的父进程都是bash。
刚刚我们采用的都是ctrl + c的方式结束程序,现在我们用命令的方式去结束,kill -9 +pid就能杀掉一个进程。


我们可以看到确实将刚刚运行的程序结束了,那么如果杀掉了bash会怎么样呢?
如果我们直接杀掉了bash,那么命令行编辑器就会崩溃我们就无法继续输入命令只能先关闭xshell重新连接才可以。
接下来我们演示一下如何创建一个子进程:
创建子进程我们需要使用fork函数,先来看一下fork函数的使用规则:

我们可以看到fork的作用是创建一个子进程,头文件是#include <unistd.h>。
fork的返回值是给父进程返回子进程pid,给子进程返回对应的0值
我们先讲刚刚myprocess.c里的代码先批量化注释掉,如何批量化注释呢?首先在命令模式下按ctrl v 左下角出现V,然后用HJKL四个方向键选出要注释的区域,然后切换为大写,再输入i然后输入//,然后ESC退出即可。
那么如何取消注释呢?直接输入方式切换为小写,然后u一下。当然我们也可以继续使用批量化取消注释的方法,先在命令模式下ctrl v,然后L选择区域,然后直接输入d就能取消注释了。

首先上图中我们用fork创建了一个子进程,本来这个程序应该只有一个进程由于fork的存在从两行打印变成3行打印,并且创建出来的子进程的pid和ppid都与A完全一样。因为fork的返回值是给父进程返回子进程的pid,所以通过上图我们可以看到ret是22431这是子进程的pid,22431的父进程就是22430了。而给子进程返回0值也可以看到22431这个子进程的ret确实为0。那么为什么一个函数会有两个返回值呢?下面我们用一个程序来解释为什么:

注意:1.fork之后,执行流会变成两个执行流
2.fork之后,谁先运行由调度器决定
3.fork之后,fork之后的代码共享,通常我们通过if和else if来执行分流。

再说返回值的问题先来说一下fork做了什么,如下图:

我们很清楚程序运行后会将代码和数据加载到内存中,然后操作系统会将这些描述为task_struct结构体,父进程有自己的PCB和代码和数据,而当我们创建子进程的时候,会在内核当中再创建一个进程所对应的PCB,与父进程不同的是操作系统会修改子进程的一些数据比如pid和ppid,但是这两个PCB都指向一份代码和数据。而进程在运行的时候是具有独立性的,父子进程也同样具有独立性,比如下面我们将一个进程杀掉那么另外的进程还会继续运行:


从上图中我们可以看到当我们杀死子进程时父进程还会继续运行,这就证明了进程具有独立性。
刚刚我们说过父子进程指向同一份代码和数据,那么为什么子进程都结束了父进程的代码和数据不受影响呢?因为对于代码来说代码是只读的,而数据中当有一个执行流尝试修改数据的时候,OS会自动给我们当前进程触发写时拷贝。
当我们函数内部准备执行return的时候,我们的主体功能已经完成,所以执行return的时候由于return也是一个语句,父子进程都会执行这个语句所以才会出现两个返回值,而由于写时拷贝所以能接收到两个返回值。
总结
以上只是linux中关于进程的一小部分,下一篇将持续更新linux进程的概念
要去了解进程应该先了解冯诺依曼体系结构以及操作系统,这样我们在学习进程的时候有一些看不懂的东西才能弄明白,同时进程这部分概念较多所以需要大家理解概念后尝试去通过代码证明概念的正确性,这样才能深入的理解进程。
相关文章:
【linux】:进程概念
文章目录 冯诺依曼体系结构一:操作系统二: 进程总结冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 冯诺依曼体系如下图: 那么输入设备有哪些呢?…...
创建对象的方式和对属性的操作
javaScript支持多种编程范式,包括函数式编程和面向对象编程,javaScript的对象被设计成一组属性的无序集合,由key和value组成。 创建对象的两种方式 早期使用创建对象方式最多的是使用Object类,使用new关键字来创建一个对象&…...
GO时间相关操作说明
文章目录 GO时间相关操作时间转换成字符串字符串转换成时间时间戳和时间操作时间比较操作时间增加和减少操作休眠操作time.AfterFunc操作time.NewTicker操作GO时间相关操作 GO语言在使用时间转换的时候会用到2006-01-02 15:04:05 这是固定参数写法,类似java语言中的yyyy-M…...
选择和分支结构
选择和分支结构选择和分支结构一、复习问答二、选择结构2.1 基础选择结构2.2 if-else结构2.3 多重if结构2.4 嵌套if结构三、分支结构四、局部变量选择和分支结构 一、复习问答 1、Java中基本数据类型 2、类型的转换的两种情形 3、数据类型提升的规则 二、选择结构 2.1 基础选…...
Elasticsearch总结笔记
文章目录简介类型增删改查操作索引原理简介 底层使用的lucene引擎,lucene引擎直接使用相对复杂,有一定的学习成本,同样是使用Java编写,Elasticsearch使用的rest风格的进行交互,而数据呢则是以JSON的方式进行传输。学习…...
Ubuntu 安装指定版本 Mysql,并设置远程连接(以安装mysql 5.5 为例)
目录 一、安装Mysql 1、卸载Mysql(可跳过) 2、安装mysql 软件源 3、安装mysql 5.5 4、验证测试 二、设置远程登录 1、允许使用root账号远程连接 2、Mysql 允许远程登录 一、安装Mysql 1、卸载Mysql(可跳过) 如果之前安装…...
NumPy:Python中的强大数学工具
NumPy:Python中的强大数学工具 文章目录NumPy:Python中的强大数学工具一、NumPy简介二、创建数组三、数组尺寸四、数组运算五、数组切片六、数组连接七、数据存取八、数组形态变换九、数组排序与搜索十、矩阵与线性代数运算一、NumPy简介 当谈到数据科学…...
Hbase资源隔离操作指南
1.检查集群的环境配置 1.1 HBase版本号确认> 5.11.0 引入rsgroup的Patch: [HBASE-6721] RegionServer Group based Assignment - ASF JIRA RegionServer Group based Assignment 社区支持版本:2.0.0 引入rsgroup的CDH版本 5.11.0 https://www.…...
TPS2012B泰克Tektronix隔离通道示波器
简 述: 复杂环境中开发和测试你的设计,进行浮动或差 分测量;100MHz,2通道 主要特点和优点 100 MHz和200 MHz带宽 高达2 GS/s的实时采样率 2条或4条全面隔离和浮动通道,外加隔离外部触 发 在安装两块电池时可以连续…...
9.4 PIM-DM
实验目的 熟悉PIM-DM的应用场景掌握PIM-DM的配置方法 实验拓扑 实验拓扑如图9-28所示: 图9-28:PIM-DM 实验步骤 (1)IP地址的配置 MCS1的配置如图9-29所示: 图9-29:配置MCS1的IP地址 R1的配置 <Huawe…...
程序员推荐的良心网站合集!
今天来给大家推荐几个程序员必看的国外良心网站合集。 IBM developer 技术性很强的博客网站,网站自带真实示例代码和架构解决方案,大家可以在上面找到适合自己的语言方向开始学习交流。 https://developer.ibm.com/ infoq 技术论坛社区,内…...
信息安全概论之《密码编码学与网络安全----原理与实践(第八版)》
前言:在信息安全概论课程的学习中,参考了《密码编码学与网络安全----原理与实践(第八版)》一书。以下内容为以课件为主要参考,课本内容与网络资源为辅助参考,学习该课程后作出的总结。 一、信息安全概述 1…...
跬智信息全新推出云原生数据底座玄武,助力国产化数据服务再次升级
2月28日,跬智信息(Kyligence)宣布全新推出国产化云原生数据底座开源项目玄武(XUANWU),以助力企业加速数据平台上云,并实现国产化升级。玄武(XUANWU)是在容器化技术上形成…...
【离线数仓-9-数据仓库开发DWS层设计要点-DWS层汇总表以及数据装载】
离线数仓-9-数据仓库开发DWS层设计要点-DWS层汇总表以及数据装载离线数仓-9-数据仓库开发DWS层设计要点-DWS层汇总表以及数据装载一、交易域用户商品粒度订单最近1日/N日汇总表1.交易域用户商品粒度订单最近1日汇总表2.交易域用户商品粒度订单最近N日汇总表二、交易域优惠券粒度…...
我的十年编程路 序
算起来,从决定并从事编程开始,已十年有余了。 这十年是怎么算的呢? 我的本科是从2009年至2013年,现在回想起来,应该是从2012年下半年,也就是大四还未正式开始的时候决定从事Android开发。参加了培训班&am…...
xs 180
选择题(共180题,合计180.0分) 1. 你被任命为某项目的敏捷教练,为了更好的交付产品,你与团队召开会议,讨论项目过程中团队应该如何做到有效沟通。最有可能确定项目过程中主要以下列哪种方式沟通? A 团队成员在各自的办公室自行办公&#…...
时间序列分析 | BiLSTM双向长短期记忆神经网络时间序列预测(Matlab完整程序)
时间序列分析 | BiLSTM双向长短期记忆神经网络时间序列预测(Matlab完整程序) 目录 时间序列分析 | BiLSTM双向长短期记忆神经网络时间序列预测(Matlab完整程序)预测结果评价指标基本介绍完整程序参考资料预测结果 评价指标 训练集数据的R2为:0.99302 测试集数据的R2为&…...
0101基础-认证授权-springsecurity
文章目录1 基础概念1.1 认证1.2 会话1.3 jwt1.4 授权2 授权的数据模型3 RBAC3.1 基于角色的访问控制3.2 基于资源的访问控制4 名词解析4.1 SSO4.2 CAS4.3 联合登陆4.4 多端登录:同一账号不同终端登录4.5 OAuth1 基础概念 1.1 认证 认证是为了保护系统的隐私数据和…...
一文简单了解THD布局要求
一、什么是THD? THD指总谐波失真。谐波失真是指输出信号比输入信号多出的谐波成分。谐波失真是系统不完全线性造成的。所有附加谐波电平之和称为总谐波失真。总谐波失真与频率有关。一般说来,1000Hz频率处的总谐波失真最小,因此不少产品均以…...
[C++]多态
🥁作者: 华丞臧 📕专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 文章目录一、多态…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
