【Linux】进程的概念
文章目录
- 📖 前言
- 1. 冯·诺依曼体系结构
- 1.1 内存存在的意义:
- 1.2 程序加载到内存的意义:
- 1.3 程序的预加载:
- 2. 认识进程
- 2.1 如何理解管理:
- 2.2 什么叫是进程:(初步理解)
- 3. 简单认识操作系统
- 3.1 操作系统如何提供服务:
- 4. 查看进程
- 4.1 第一种查看进程的方式:
- 4.2 第二种查看进程的方式:
- 5. 对当前路径的理解
📖 前言
在前面我们学习了Liunx的基本指令和权限相关知识,还有基本工具的使用,有了以上的基础知识我们本章将正式接触操作系统,搬好小板凳要开讲了🙋🙋🙋……
1. 冯·诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
- 输入设备: 键盘,话筒,摄像头,磁盘,网卡……
- 输出设备: 显示器,音响,磁盘,网卡,显卡……
- (运算器 + 控制器)[CPU]: 算数计算 + 逻辑计算
- 存储器: 就是内存,不是磁盘!
出了内存之外剩下的就是外设了~
1.1 内存存在的意义:
为什么要有内存?
- a. 技术角度:
-
- 存储速度的差别: cpu的运算速度 > 寄存器的速度 > L1 ~ L3Cache(各种缓存Cache) > 内存>> 外设(磁盘)>> 光盘磁带
- b. 数据角度:
-
- 外设不和CPU直接交互,而是和内存交互,CPU也是如此。
- c. 成本角度:
-
- 造价: 寄存器 >> 内存 >> 磁盘(外设)
如果冯诺依曼体系结构中没有内存的话:
- 那么整个体系的效率是很低下,因为是由最慢的设备决定的。
- 计算CPU速度够快,但是还是要等外设,这既是著名的木桶原理。
当整个体系结构加上内存之后:
- 因为中央处理器只和内存做数据交互,输入设备也和内存做交互。
- 所以整个体系的效率就以内存为主要衡量标准。
- 不以外设为标准,引入了存储器的设备,可以让整体效率以存储器为标准。
- 内存的意义:
- 有存储器的存在让软件的存在具有了更大的意义。开机的时候就是将操作系统加载到存储器当中。
- 内存对应的最大意义:使用较低的钱的成本,能够获得较高的性能!
补充:
- 中央处理器CPU也会和外说有交互,协调数据流向。
- 中央处理器CPU只是个具有运算和控制能力的提现木偶,真正让中央处理器去完成计算和某些控制的是整个计算机的大脑,叫做软件,最具有代表性的就是操作系统,是操作系统来控制CPU的。
1.2 程序加载到内存的意义:
- 在我们之前学习编程语言例如:C/C++时,我们都听过这样一句话:
- 自己写的软件/程序,编译好之后,要运行,必须先加载到内存。
为什么???
- 答案就是由体系结构(冯·诺依曼体系结构)决定的。
具体解释:
- C/C+编译好的程序就必须从磁盘加载到内存要让CPU能够读取。
- 我们编译好的程序是个文件是在磁盘上(外设),CPU读取数据,必须通过存储器读取,所以也就要求要运行程序,就必须将程序先加载到内存,因为CPU只会从内存当中读取指令代码和数据。
1.3 程序的预加载:
- 几乎所有的硬件,只能被动的完成某种功能,不能主动的完成某种功能,一般都是要配合软件完成的(OS + CPU)
- 开机等待本质是将操作系统加载到内存当中,因为体系结构规定,CPU要执行代码,执行的可不仅仅是我们写的代码,还有操作系统的代码所以必须先把操作系统加载到内存,这就是预加载。
- 当启动时还没有执行,此时数据已经被预加载到了内存,CPU可能在进行某种其他的计算,这样就能把加载的过程和CPU运算的过程并行起来。
- 操作系统一旦被加载之后,在软件层面上,就可以预先把将来要访问的数据或文件也可以提前加载到内存当中。
数据在流动的时候,从输入到内存,从内存到CPU,CPU计算处理完,将结果写回内存,然后定期再刷新到外设。
补充:
内存的存在可以去适配外设和CPU之间速度不匹配的问题,因为内存的存在可以去预先装载一些常见的内存管理软件,数据管理软件,就可以将数据以预加载的方式提前放在存储器当中,以提高中央处理器读取效率,就可以让我们以较高的效率完成计算和存储的任务。
2. 认识进程
2.1 如何理解管理:
- 管理的本质是:对数据的管理。
- 管理的本质:不是对被管理对象进行直接管理,而是只要拿到被管理对象的所有的相关数据,我们对数据的管理,就可以体现对对象的管理。
- 管理的核心理念:先描述,再组织。
- 当我们要管理的对象数目巨大,例如一个学校的学生,而每个学生身上又有大量的属性的时候,例如:每个学生都有自己的个人信息,身高、体重、年龄……
- 大量的数据堆在一起很显然是不好管理的,我们可以先将每个对象描述起来,例如将每个学生描述为一个结构体,结构体内有学生的各种属性,然后再将这些结构体组织起来。
- 组织起来的方式有很多,这就是我们之前学的数据结构啊。
先描述再组织,用C语言或C++描述,用数据结构组织数据。管理的本质对数据做管理 --> 对数据的管理 --> 对某种数据结构的管理 --> 对数据结构的各种操作,增删查改。
重点:
其实操作系统是一款软件,是一款专门搞管理的软件,软件可以管理软件,就像人可以管理人一样~
2.2 什么叫是进程:(初步理解)
进程是一个运行起来的程序。
一般书上都会那么说,真的让人理解起来一头雾水,脑子里一篇空白😓😓😓,进程和程序的区别是什么?一个跑一个没跑,这是用形容词描述的,用名词怎么描述??
下面我们来慢慢讲🙋🙋🙋……
-
首先我们要知道,程序是个文件,是存在磁盘上的,然后不能简单的认为,将程序从磁盘加载到内存,这个程序就是进程了,就像随便一个人进入学校不能够称之为学生一样。
-
再者我们要知道,操作系统里面可能同时存在大量的进程!
-
操作系统要不要将所有的进程管理起来呢?答案是肯定的!
-
对进程的管理,本质是不是就是对进程数据的管理?答案是肯定的!
那我们对进程的管理,核心是不是:先描述,再组织呢?答案是肯定的!
PCB(proccess ctrl block):
- 描述进程的结构体我们叫做PCB
- 也叫做进程控制块
- 而
Linux
中的task_struct
是一款具体的PCB
当一个程序加载到内存时候,不仅仅是将代码和数据加载到内存,操作系统还要为了管理该进程创建对应的数据结构。
- 初步认识进程的概念:(重点)
- 我们把一个进程的task struct结构和对应的可执行程序合起来才叫一个进程。
- 进程 = 可执行程序 + 该进程对应的内核数据结构
有大量的进程就必须把进程先描述再组织起来,把进程组织起来实际上是把描述进程的进程控制块组织起来。
那我们学习进程到底学的是什么呢?
- 我们学习的是进程控制块里面有什么属性!
第一阶段对进程的理解总结:
- 当一个程序从磁盘加载到内存,将代码和数据加载到内存只是第一步,第二步,操作系统为了管理这个进程,需要为该进程创建对应的描述该进程的进程控制块PCB,Liunx 下叫task struct。
- 只要在内存当中被操作系统管理,操作系统实际管的根本不是代码和数据,而是管的则是进程的PCB结构体。
- 第一阶段进程的理解:程序加载到内存之后的代码和数据,以及操作系统为了管理进程,所生成的描述进程的进程控制块PCB结构体(内核数据结构 + 代码和数据,这二者合起来,叫做进程)。
- 一个进程有一个PCB描述起来了,系统中有大量的PCB,只需要将系统中的PCB用数据结构组织起来,对应的对进程的管理就变成了对数据结构的增删查改。
3. 简单认识操作系统
3.1 操作系统如何提供服务:
计算机和OS设计出来就是为了给人们服务的,那么是如何给我们提供服务的呢?
我们调用printf
函数向显示器打印,显示器是硬件,所谓的打印,本质就是将数据写到硬件上,那我们写的C语言能直接访问硬件吗?
- 答案是不能!!打印不是直接写到硬件上,而是通过间接的方式。
- 所有的应用程序都没有资格直接访问硬件,因为硬件的管理者是操作系统。
- 操作系统是不相信任何人的!不会直接暴露自己的任何数据结构,代码逻辑,其他数据相关的细节!!
- 因为我们普通人写的代码或者软件没有资格直接访问硬件,需要计算机提供对应的服务。
操作系统是不相信任何人的要防止少数人,又要给多数人提供服务,所以操作系统是通过给用户提供接口的方式为用户提供服务的~
-
Linux操作系统是用C语言写的,这里所谓的“接口”,本质就是C函数!
-
我们学习系统编程本质就是在学习这里的系统接口。
我们如何调用系统调用接口:
-
要是小白的话,我们可以通过图形化界面或者是命令行指令来调用系统接口,在我们日常的生活中,安装卸载软件、本质就将各种资源拷贝到本地磁盘目录下,下载还用了网卡。我们只是用了图形化界面点击了一下,这就是管理操作。
-
要是初级工程师,就像正在学习的我们,会调用C语言的printf函数来将内容打印到显示器上,但是我们并没有自己实现printf函数,但是我们清楚地知道:
-
- 链接就是将库里面的代码和我们的代码合起来,库中的方法里面一定有对应的方法,底层一定有调用系统调用接口,只是我们平时不知道而已。
此时上层用中就可以做管理工作,开发工作,命令行操作。
补充:
- 一门语言跨平台可移植,在Windows和Linux下都能选择其对应的接口,上层提供的都是printf(),原因标准库中用了多态,同个接口在不同的平台下实现同一个或者不同的功能。
4. 查看进程
- 我们自己写的代码,编译成为可执行程序,启动之后就是一个进程!
- 那么别人写的呢??启动之后是不是进程呢??肯定算!!
那么我们之前学习的各种指令,执行指令也是进程。
4.1 第一种查看进程的方式:
- a:all
- j:jobs
- x:以特定格式显示
通过ps指令,后面的axj几个选项的顺序无所谓,这是显示所有的进程。
我们写一个简单的死循环然他一直在跑,我们来查看一下它的进程~
结合我们之前学的指令,我们可以查看指定的进程:
我们调用了grep指令,所以这里查看进程的时候也是能显示grep进程的。
显示出前五行:
只显示要查看的进程:
只要匹配到-v
后面的关键字一律不显示。
Windows下是通过双击打开一个进程, 而Linux则是通过./启动,在系统中找到可执行程序启动,这两者在系统层面上一模一样~
4.2 第二种查看进程的方式:
Linux的根目录下有个proc目录里面放的就是实时的进程:
proc:process,内存文件系统,里面放的是当前系统实时的进程信息。
查看进程的ID:
既然proc
里面存的是实时的进程,那么我们就可以查到当前正在跑的进程:
当我们将刚刚的进程结束掉之后,再次执行以下mytest
这个可执行程序,我们发现进程的ID发生了变化:
所以重启之后就是一个新的进程了。
我们在proc
中打开这个进程,可以查看它的详细属性:
5. 对当前路径的理解
在我们之前学习C / C++语言的时候,我们就只是肤浅的理解当路径就是源文件所在的路径。
事实真的是这样吗??
答案并不是!!!
我们用ls -al
选项来在proce
目录中对应的进程中看一下它的更详细的属性:
我们可以看到进程当前的工作路径,和进程所对应的可执行程序在磁盘上所对应的位置。
我们在源文件代码中加一个新建文件的语句,目的就是看看当前路径到底是指的什么:
同时我们还将可执行文件移出当前路径:
我们再将程序跑起来:
- 其实我们发现了,cwd和exe都已经在了test这个路径下,并不是源文件的路径。
- 更重要的是,我们代码中创建的文本文件此时也是创建在了test这个路径下。
- 这就充分说明了,当前路径并不是源文件所在的路径,而是进程工作的路径。
相关文章:

【Linux】进程的概念
文章目录 📖 前言1. 冯诺依曼体系结构1.1 内存存在的意义:1.2 程序加载到内存的意义:1.3 程序的预加载: 2. 认识进程2.1 如何理解管理:2.2 什么叫是进程:(初步理解) 3. 简单认识操作…...

奇舞周刊第490期:WebAssembly 多语言/宿主环境中的使用
记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ WebAssembly 多语言/宿主环境中的使用 WebAssembly (WASM) 的一个优势就是能够支持将不同语言编译成 WASM 代码,然后在不同的宿主环境中运行。这样就可以在不同的宿主环…...

【css】使用css实现提示框各种弹出效果。
简言 最近工作编写页面时,需要有一个提示框从下到上弹出的效果。 冥想了一下,实现了出来。 记录下实现思路。 实现思路 实现步骤如下: 编写样式。 首页要有承载内容的容器(box)。外层在套一个包装盒子(用来进行定位…...

1685_Excel的几种脚本处理方式
全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com) 做个小结,实际上是写的我自己学习的过程。 关于Excel的处理方式很多,我也不会那么多,在这里我只想写一下我自己接触过的。大致是三种方式&a…...
Unity中使用struct和class来存储数据的注意事项
在 Unity 中,struct 和 class 都是用来定义自定义类型的关键字。它们的主要区别在于如何存储和传递它们的实例。 特点structclass存储方式值类型引用类型默认构造函数自动有性能快慢可空性不可空可空继承单继承单继承或多重继承 一、相似之处 1、都是用来定义自定…...

共阳(共阴)LED数码管编码交互演示
LED数码管原理 LED数码管有两大类,一类是共阴极接法,另一类是共阳极接法,共阴极就是各段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是各段的显示字码共用一个电源的正极,是低电平点亮。只要控制…...
如何在 TensorFlow 中使用 GPU 加速深度学习计算?
一、前言 TensorFlow 是由 Google 开源的深度学习框架,它具有易用、高效、灵活等特点,被广泛应用于学术界和工业界中。而 GPU 是一种高性能的计算设备,可以加速深度学习的计算过程。本文将介绍如何在 TensorFlow 中使用 GPU 加速深度学习计算。 二、安装 TensorFlow 安装…...

RK3568平台开发系列讲解(Linux系统篇)线程 pthread 详解
🚀返回专栏总目录 文章目录 一、POSIX 线程模型二、pthread_create()创建线程三、线程属性3.1、初始化线程对象属性3.2、销毁一个线程属性对象3.3、线程的分离状态3.4、线程的调度策略3.5、线程的优先级3.6、线程栈四、线程退出五、回收已终止线程的资源沉淀、分享、成长,让…...
hspJAVA
循序渐进学Java 零基础 -韩顺平 第 1 章 内容介绍 1 1.1 本套 JAVA 课程内容 1 1.1.1 课程的三个阶段 1 1.1.2 关于课程的说明 1 1.1.3 课程特色 2 1.2 JAVA 就业方向 2 1.3 JAVA 开发场景举例 1-SSM 3 1.4 JAVA 开发场景举例 2:ANDROID 核心代码 3 1.5 JAVA 开发场…...

OpenAI-ChatGPT最新官方接口《嵌入向量式文本转换》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)
Embeddings 嵌入向量式文本转换 前言Overview 概述What are embeddings? 什么是嵌入?How to get embeddings 如何获取嵌入python代码示例cURL代码示例 Embedding models 嵌入模型Second-generation models 第二代模型First-generation models (not recommended) 第…...
1042. 不邻接植花
有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有 3 条路径可以进入或离开. 你需要为每个花园选择一…...

Linux FTP服务
FTP服务 作用 传输文件 端口 FTP服务器默认使用TCP协议的20、21端口与客户端进行通信 20端口用于建立数据连接,并传输文件数据 21端口用于建立控制连接,并传输FTP控制命令 模式 FTP数据连接分为主动模式和被动模式 主动模式:客户端告诉服务端…...
JavaScript基础入门全解析(下)
数据类型(重点) ●是指我们存储在内存中的数据的分类,为了方便数据的管理,将数据分成了不同的类型 ●我们通常分为两大类 基本数据类型 和 复杂数据类型(引用数据类型) 基本数据类型 ●在js中基本数据类…...
【C++初阶】(入门)输入输出
#include< iostream> std是C标准库的命名空间名,C将标准库的定义实现都放到这个命名空间中 文章目录 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨👻一、iostream库介绍👻二、使用总结 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ Ǵ…...

初识Linux+Linux基本指令(一)
目录 一.😆计算机与操作系统😆 计算机与操作系统发展史简介: 计算机与操作系统的关系: 二.😄Linux操作系统😄 开源软件的代名词:Linux 非图形化界面的Liunx 三.😆Linux基本指令之文件管理篇😆 1.操…...

部署架构 因为单体架构痛点 升级到微服务架构
如图为单体部署 痛点 多人协作可能产生很多的回归测试 代码管理复杂度提升 软件包升级会导致增加测试次数 举例 单体电商 1增加功能(增加小程序平台) 2 并发增加 出现 1 代码复用 2 系统间相互调用 3 接口不仅要对外服务,也得对内提供接口 4 数据分析功…...

mapreduce打包提交执行wordcount案例
文章目录 一、源代码1. WordCountMapper类2. WordCountReducer类3. WordCountDriver类4. pom.xml 二、相关操作和配置1. 项目打包2. 带参测试3. 上传打包后的jar包和测试文档4. 增大虚拟内存5.启动集群6.在hdfs上创建输入文件夹和上传测试文档Hello.txt7. 利用jar包在hdfs实现文…...

MyBatis(十六)MyBatis使用PageHelper
一、limit分页 mysql的limit后面两个数字: 第一个数字:startIndex(起始下标。下标从0开始。) 第二个数字:pageSize(每页显示的记录条数) 假设已知页码pageNum,还有每页显示的记录…...

铁路轨道不平顺数据分析与预测
铁路轨道不平顺数据分析与预测 1.引言 铁路轨道作为铁行车的基础设施,是铁路线路的重要组成部分。随着经济和交通运输业的发展,我国的铁路运输正朝着高速和重载方向迅速发展,与此同时,轨道结构承受来自列车荷载、运行速度的冲击…...

好家伙,9:00面试,9:06就出来了,问的实在是太...
从外包出来,没想到死在另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到2月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...