Linux——进程基本概念下篇

Linux——进程基本概念下篇


文章目录

  • Linux——进程基本概念下篇
  • 一、环境变量
    • 1.1 环境变量的定义
    • 1.2 环境变量的相关命令
    • 1.3 命令行参数
    • 1.4 本地变量和环境变量
    • 1.5 常规命令和内建命令
  • 二、进程地址空间
    • 2.1 地址空间的概念
    • 2.2 页表和MMU
    • 2.3 地址空间的作用
    • 2.4 地址空间的好处


一、环境变量

要执行一个命令,必须先要找到对应的可执行程序
为什么我们运行自己的程序的时候要加上././就是指明当前路径,要找到程序才能运行,而我们运行指令的时候却不用加呢?

因为环境变量

我们通过Xshell输入账号密码登录云服务器
在这里插入图片描述
在这里插入图片描述
为什么命令行中会自动进入我所在的家目录/home/hs 而root进入的是/root

登陆的时候,系统会进行以下步骤
1.输入用户名&&密码
2.认证
3.形成环境变量(肯定不止一个,PATH,PWD,HOME) 并且根据用户名,初始化HOME=/root,HOME=/home/XXX
4.cd $HOME

1.1 环境变量的定义

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性(这就是我们使用某些程序不需要./的原因)

系统中会存在大量的环境变量,每一个环境变量都有它自己的特殊用途,用来完成特定的系统功能
注意环境变量也是OS在内存或磁盘中开辟的空间用来保存系统相关数据

常见的环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash

1.2 环境变量的相关命令

echo $NAME // NAME:你的环境变量名称

在这里插入图片描述

env命令可以查看系统所有变量

在这里插入图片描述
我们也可以把我们自己的程序路径加到环境变量中

使用export指令

export PATH=

注意如果直接export PATH=我们自己的程序路径的话,会导致path环境变量本身具有的环境变量被覆盖
如果之前的path环境变量被覆盖,那么系统中的很多指令就会执行不了,因为没有默认寻找路径

所以不改变原有环境变量,并且添加自己的环境变量推荐以下写法

export PATH=$PATH:xxx程序所在路径 向环境变量PATH中添加xxx程序

默认更改环境变量,只限于本次登陆,重新登陆,环境变量自动被恢复 为什么?

我们直接更改的是bash进程内部的环境变量信息,每一次重新登陆,都会给我们形成新的bash解释器并且新的bash解释器自动从读取形成自己的环境变量表信息

1.3 命令行参数

main函数可以携带两个参数

int main(int argc, char* argv[])

int argc是参数的个数
char* argv[]是一个数组指针,数组的每个元素是char* 类型的指针,在linux中,通常以每个程序后面的附加选项实现,例如ls -a, ls -l,会被系统以空格为分隔符,划分成一个个字符串,依次放入argv[]中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

shell or os自动帮我们做的,将一个大的字符串以空格作为分隔符,被分割成了若干个字串

为什么要这么干? ? ?

命令行参数,可以支持各种指令级别的命令行选项的设置,理解历史学的指令与选项之间的关系

其实main函数还有第三个参数——如何证明?

在这里插入图片描述
在这里插入图片描述
再执行env指令
在这里插入图片描述
通过对比,我们发现第三个参数是系统中的环境变量,那么这是谁传给main函数的呢?

系统启动我们的程序的时候,可以选择给我们的进程(main)提供两张表:
1.命令行参数表
⒉环境变量表

命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量是父进程bash给我们传递的

父进程的环境变量信息又从哪里来?

环境变量信息是以脚本配置文件的形式存在的,每一次登陆的时候,你的bash进程都会读取vim.bash_profile配置文件中的内容,为我们bash进程形成一张环境变量表信息

如何证明?

当操作系统运行起来后,bash进程也会运行起来,同时读取配置环境变量的本地脚本,形成环境变量表,而我们的进程又大多都是bash的子进程,都会被传这张相同的环境变量表,系统环境变量具有全局属性,可以被子进程继承下去

即使不在main函数中读取第三个参数,main函数中也会有一个全局变量char** environ指向这张环境变量表
在这里插入图片描述

1.4 本地变量和环境变量

本地变量只在bash进程内部有效,不会被子进程继承下去
环境变量通过让所有的子进程继承的方式,实现自身的全局性

shell本身就是一个c程序,本地变量相当于在main中定义的一些局部变量,用set查看shell中的环境变量和本地变量,unset取消环境变量和本地变量

举个例子
在这里插入图片描述

1.5 常规命令和内建命令

Linux的命令分类

常规命令:shell调用fork函数,创建子进程,让子进程成执行的
内建命令:shell命令行的一个函数,可以直接读取shell内部定义的本地变量

echo,set,unset,pwd,umask,export等等都是内建命令,内建命令速度更快,不受环境变量影响

二、进程地址空间

2.1 地址空间的概念

在我们之前学习的C语言或者C++中,相信大家对内存应该有一定的了解,对于内存中的分布,也应该有一定的概念

在我们之前的学习中,内存中的空间分布应该是如下图中所示
在这里插入图片描述
在这里插入图片描述
但实际在内存中真的是这样分布的吗?

我们用代码进行验证
在这里插入图片描述
输出结果
在这里插入图片描述

此时能得到在父进程和子进程中g_val的地址和值是相同的,没有问题!
因为根据我们之前学的,子进程创建的时候,代码和数据是以父进程为模板创建的

我们将代码稍稍修改一下
在这里插入图片描述
输出结果
在这里插入图片描述

我们发现,父子进程,输出地址是一致的,但是变量内容不一样,这就与我们知道的知识相悖了,为什么同一个变量,同一个地址,会出现两个不同的值?

前面我们讲过如果父子进程之间的任何一方将值修改了后,OS就会进行写时拷贝,但如果发生写实拷贝的话,地址为什么还一样呢?

所以我们可以得出,此处的地址绝对不是真实的物理地址,我们平时用到的地址,都是虚拟地址/线性地址

结论

变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
但地址值是一样的,说明该地址绝对不是物理地址
在Linux地址下,这种地址叫做虚拟地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

OS必须负责将 虚拟地址 转化成 物理地址

什么是地址空间? 什么是区域划分?

OS中有物理地址,而每个进程都有一份自己的虚拟地址
每个进程都会认为自己是独享整个物理地址,它们都会以统一的方式划分自己的内存

每个进程都有自己的地址空间,而操作系统需要管理这些地址空间,如何管理?

答案很简单,先描述,再组织

所以进程地址空间本质是内核的数据类型(struct mm_struct)

struct mm_struct
{long code start;long code_end;long data_start;long data_end;long heap_start;long heap_end; //brklong stack_start;long stack_end;................//其他区域也类似
}

在这个结构体中划分好了各个区域的起始和终止位置,这就是区域划分
通过这些区域划分出不同的界限,每个进程都认为自己的mm_struct代表整个内存(地址从0x000000…000 ~ 0xFFFFFF…FFF),也就是每个进程都认为自己拥有4GB的空间

2.2 页表和MMU

OS通过页表+MMU(内置在CPU中的一个硬件)来对齐进行映射
页表负责把虚拟地址映射到物理地址

那么为什么需要页表映射,不能直接让进程地址空间访问物理内存吗?

如果我们允许进程直接访问物理内存,就很有可能访问到不属于自己的空间,所以我们需要页表来管理,如果是非法的OS就直接可以拒绝访问,所以页表中除了虚拟地址和物理地址之间的映射,还有对应的访问权限字段和是否分配&&是否有内容的字段

在这里插入图片描述

在这里插入图片描述

举个例子:

const char* p = "abcd",我们不能通过指针p修改"abcd",因为它在字符常量区,本质是OS给我们的权限只有读权限(通过页表的权限管理)

值得注意的是,当进程创建子进程前,父子进程在页表中的数据段和代码段的权限都会被OS修改成只读的,代码段只读是正常的,因为代码本身就不能被更改,但为什么数据段也要修改成只读呢?
父进程创建子进程的时候首先将自己的读写权限,改成只读,然后再创建子进程

当父进程创建子进程之后,子进程写入,此时发生写时拷贝,重新申请空间,进行拷贝,但由于权限是只读的,OS就会进行介入,此时OS发现是因为需要进行写实拷贝的情况,会进行放行,OS会修改页表,父子进程指向不同的物理内存,这是写实拷贝的策略机制

但当不是这种情况的时候,就比如上述例子中,本身字符常量区是不能修改的,此时程序出错,OS就会将请求驳回

在这里插入图片描述

2.3 地址空间的作用

为什么要有地址空间?

1. 让进程以统一的视角看待内存,所以任意一个进程,可以通过地址空间+页表可以将乱序的内存数据,变成有序,分门别类的规划好
2. 存在虚拟地址空间,可以有效的进行进程访问内存的安全检查
3. 将进程管理和内存管理进行解耦,通过页表让进程映射到不同的物理内存处,从而实现进程的独立性

2.4 地址空间的好处

我们想象一种场景:我们直接申请一块大空间,操作系统会直接全部给我了吗?如果我们没有用那么多,其他的空间不是被浪费了吗?

所以当我们在堆区申请一块空间的时候,OS会把地址空间中的heap_end加上我们申请的大小,但是却没给我们物理内存,当我们需要读取的时候,才会使用页表进行映射,得到物理空间

假设没有地址空间,那么CPU是不是只能遍历一遍物理空间才能找到该进程的起始位置?

我们可以把main函数的地址放入每个进程的地址空间(同一位置),然后CPU就访问地址空间的固定位置然后通过页表映射找到物理内存存放代码数据的位置,这样效率可以得到提升

总结
为什么要有地址空间?

1️⃣ 通过添加一层软件层,完成对进程操作的风险管理(权限管理),保护了物理内存以及各个进程的数据安全
2️⃣ 将内存申请和内存使用的概念在时间层面上划分清楚,通过地址空间完成屏蔽底层申请物理空间的过程,达到进程读写内存和OS进行内存管理操作,在软件层面上分离(你不知OS给你的内存是富裕或者是快满状态的空间)
3️⃣ 站在CPU和应用层的角度,每个进程可以看作统一使用4GB空间,而且每个空间区域的相对位置是比较确定的

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

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

相关文章

SpringBoot+Vue多模块项目宝塔部署(保姆级教程)

目录 服务器推荐 安装宝塔 进入宝塔 安装软件 安装 nginx ​编辑 安装mysql 安装java 配置数据库 启动模块下加打包插件 修改配置文件 添加java项目 放行端口 前端访问 本篇博文将向各位详细的介绍项目部署到服务器的详细过程,以及我配置过程中遇到的…

详细分析MySQL中的distinct函数(附Demo)

目录 前言1. 基本知识2. 基础Demo3. 进阶Demo 前言 该函数主要用于去重,对于细节知识,此文详细补充说明 1. 基本知识 DISTINCT 是一种用于查询结果中去除重复行的关键字 在查询数据库时,可能会得到重复的结果行,但有时只需要这…

【YOLOv8改进[Neck]】使用BiFPN助力V8更优秀

目录 一 BiFPN(双向特征金字塔网络) 1 BiFPN 2 EfficientDet 二 使用BiFPN助力模型更优秀 1 整体修改 2 配置文件 3 训练 其他 一 BiFPN(双向特征金字塔网络) BiFPN(双向特征金字塔网络, 2020)用于特征融合层。 官方论文地址:https://arxiv.org…

javaScript中的this 指向

this 指向总结 this 关键字是一个非常重要的语法点。 this 可以用在构造函数之中,表示实例对象。除此之外,this 还可以用在别的场合。但不管是什么场合,this 都有一个共同点:它总是返回一个对象。 关于 this 的指向&#xff0c…

研究发现:90%的Java服务容易第三方漏洞的影响

Datadog最新发布的“2024年DevSecOps状况”报告显示,Java服务在受Datadog最新发布的“2024年DevSecOps状况”报告显示,Java服务在受到第三方漏洞影响方面最为严重。 报告指出,90%的Java服务存在一个或多个严重或高危漏洞,这些漏…

uni打包ios应用

简单写了一个打开蓝牙的 配置一下manifest.json 打开蓝牙 进行云打包 准备好私钥(私钥密码),profile点击打包> 出来一个.ipa文件 用数据线连上ios手机,直接安装到手机 如下: 关于密钥和profile文件的操作使用Appuploader生成…

unity 录制360全景渲染图

1.打开pakcageManager ,选择packages为 unityRegisty,找到unityRecorder插件下载,点击右下角instant安装,如果插件列表为空,检查是否连接网络,重启Unity 2.打开录制面板 3.add recorder 选择ImageSequence …

使用文本到图像模型的一步图像翻译

使用文本到图像模型的一步图像翻译 摘要IntroductionRelated WorkMethod One-Step Image Translation with Text-to-Image Models 摘要 在这项工作中,作者解决了现有条件扩散模型的两个局限性:由于迭代去噪过程导致的推理速度慢以及模型微调对配对数据依…

TDSQL同一个所属Set显示3个备份节点

欢迎关注“数据库运维之道”公众号,一起学习数据库技术! 本期将为大家分享《TDSQL同一个所属Set显示3个备份节点》的处置案例。 关键词:分布式数据库、TDSQL、备份节点 1、问题描述 登录赤兔管理平台,单击左侧导航栏“实例管理/集群管理”…

【笔试强训】牛牛快递

链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/41b42e7b3c3547e3acf8e90c41d98270?tpId290&tqId39852&ru/exam/oj描述 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分…

路由引入,路由过滤

拓扑图 1.配置IP地址,R1、R3、R4上使用loopback口模拟业务网段 [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 192.168.0.1 32 [AR1-LoopBack0]int l1 [AR1-LoopBack1]ip add 192.…

金三银四,备战数据结构与经典算法面试

随着春招季节的临近,面试备战成为许多求职者的痛点。如何在激烈的竞争中脱颖而出,成为众多求职者思考的问题。学习Python编程与算法内容,成为面试开发、测试开发等热门岗位的基础。 为了帮助大家更好地应对技术类面试挑战,霍格沃…

【office安装错误1402或1406】

office安装错误1402或1406 错误如图 解决方法 打开autoremove,点击扩展,输入1402,点击搜索 等待修复成功,再尝试安装office 软件每周六选择其他登录方式可以免费使用

初识C++ · 类和对象(中)(2)

前言:上篇文章已经介绍了6个默认成员函数中的3个函数,分别是构造函数,析构函数,拷贝构造函数,本文介绍的是后三个,赋值运算符重载,const成员函数,取地址操纵符重载。 目录​​​​​…

页面加载事件

2.1窗口加载事件 1.window.οnlοadfuction(){} 或者 window.addEventListerner(‘load’,function(){}) doucument.addEventListner(DOMContentLoaded,fuction(){})这个反应更快些

2024商业地产五一劳动节健康大会朋克养生市集活动策划方案

2024商业地产五一劳动节健康大会朋克养生市集(带薪健康 快乐打工主题)活动策划方案 活动策划信息: 方案页码:53页 文件格式:PPT 方案简介: 打工不养生 赚钱养医生 期待已久的五一假期, …

【UE 材质】表面湿润效果

效果 步骤 1. 创建一个材质函数,这里命名为“MF_Weather_Wetness”,打开材质函数添加如下节点 其中输入的默认值分别为: 其中,“Desaturation”节点用于控制饱和度,我们通过给“Fraction”引脚输入一个负值来增加饱和…

​漏电继电器JHOK-ZBLφ150mm 0.03-3A 0.2-2S导轨安装JOSEF约瑟

系列型号: JHOK-ZBL多档切换式漏电(剩余)继电器(导轨) JHOK-ZBL1多档切换式漏电(剩余)继电器 JHOK-ZBL2多档切换式漏电(剩余)继电器 JHOK-ZBM多档切换式漏电(…

[lesson49]多态的概念和意义

多态的概念和意义 函数重写回顾 父类中被重写的函数依然会继承给子类 子类中重写的函数将覆盖父类中的函数 通过作用域分辨符(::)访问父类中的同名成员 多态的概念和意义 面向对象中期望的行为 根据实际的对象类型判断如何调用重写函数父类指针(引用)指向 父类对象则调用…

早些年间学Erupt

Erupt部署 创建一个SpringBoot项目(此处为2.7.10) 目录结构 demo -- 项目名称 ├── src└── main├── java -- 代码文件目录└── com.example.demo -- 包名└── DemoApplication -- 入口类└── resources -- 资源文件目录└── application.properties -- 配置…