【Linux学习笔记】进程概念(下)

  • 进程地址空间
    • 1. 虚拟地址
    • 2. 什么是进程地址空间
    • 3. 进程地址空间的映射。
    • 4. 地址空间存在的意义
    • 5. 写时拷贝

进程地址空间

1. 虚拟地址

来看这样一段代码。

#include <stdio.h>
#include <unistd.h>int global_value = 100;int main()
{pid_t id = fork();if(id < 0){printf("fork error\n");return 1;}else if(id == 0){int cnt = 0;while(1){printf("我是子进程, pid: %d, ppid: %d | global_value: %d, &global_value: %p\n", getpid(), getppid(), global_value, &global_value);sleep(1);cnt++;if(cnt == 10){global_value = 300;printf("子进程已经更改了全局的变量啦..........\n");}}}else{while(1){printf("我是父进程, pid: %d, ppid: %d | global_value: %d, &global_value: %p\n", getpid(), getppid(), global_value, &global_value);sleep(2);}}sleep(1);
}

运行结果:

img

上面的这种现象,是因为这里所打印出来的地址并非物理地址,而是虚拟地址。所以这里就引出了进程地址空间。下面用个例子来描述进程地址空间。

img

img

其中所画的大饼是需要管理起来的,好比老板昨天让员工好好干,一个月后升经理。但是今天老板见员工,却说一个月升总监。大饼画的多了,自然就需要管理起来,否则容易混乱。对于软件来说,管理的本质就是先描述,再组织。所以这里的一个个大饼,其实可以理解为是一个个的结构体。img

2. 什么是进程地址空间

  1. 进程地址空间的概念

上面讲过操作系统给进程画的大饼可以认为是进程地址空间,具体来说就是一个结构体。那结构体里面有什么呢?

首先,先做好规定,这里的背景是32位机器背景。

  1. 32位机器的数据可以有2^32个,约42亿,以字节为单位。
  2. 所以表示的空间大小约为4GB的空间范围。
  3. 地址确保唯一性,所以有2^32个地址。

所以,进程地址空间整体上应该是这样的,如下图:

img

对于上面的这个图,你可以想象成一把尺子。尺子是有刻度,所以就可以用刻度来划分区域。可以用一个结构体描述出上面的进程地址空间。如下结构体:

struct mm_struct
{unit_32t code_start;unit_32t code_end;unit_32t data_start;unit_32t data_end;unit_32t heap_start;unit_32t heap_end;//......
}

所以可以认为有这么一个进程地址空间对应着这么一个结构体,其中结构体的变量就是地址,这些地址就如同尺子上的刻度,划分好了区域。

img

其中堆栈空间是动态开辟的,所以当你写代码定义变量或者new变量的时候,其实就是在更改对应区域的start or end。

3. 进程地址空间的映射。

程序当加载到内存的时候,确实是加载到了物理内存里面,但是操作系统并不允许进程直接访问物理内存,而是在进程PCB里面存放一个进程地址空间,让进程地址空间通过页表和物理地址进行映射,从而让进程可以访问到物理内存。如图所示:img

所以进程是无法直接访问到物理地址的,是操作系统在管理进程的时候,同时给进程画了个大饼,让进程可以通过进程地址空间,再通过页表的映射,从而访问到物理地址。

4. 地址空间存在的意义

  1. 为了保护物理地址

设想一下,如果一个进程可以随意访问物理地址,然后这个进程将数据恶意写入到物理地址,将会破坏物理地址。操作系统为了保证物理地址的安全,就有了地址空间。通过地址空间的虚拟地址,再通过页表映射访问到物理地址,保证了物理地址的安全。

用压岁钱的例子来解释上述内容。你的压岁钱实际就是物理地址,但是中间有父母(页表)的存在,所以你确实是知道有那么多钱,但是当你用的时候,要通过父母的同意,如果父母觉得你的要求合理,那么就通过你的要求,让你拿到钱去买东西。如果要求不合理,那么父母将会拒绝你的要求,拒绝给你拿钱。

img

  1. 为了保证进程间的独立性

具体可看下面写时拷贝的内容。

5. 写时拷贝

回到我们的第一个代码打印结果的问题,可以看到两个值的地址明明一样,但是值却不一样。这是为什么呢?

是由于进程具有独立性,虽然两个进程共享数据,但是每个进程都是有独立的进程地址空间和独立的页表。

img

因为进程有独立性,所以先有一个进程改变了global_value的值,也不会影响另一个进程的值。这是因为在有一个进程改变值的时候,OS会先进行数据拷贝,在物理地址上开辟空间,拷贝进去,然后更改另一个进程页表的映射。

img

所以这也就是打印结果的时候,为什么地址明明一样,但是两个进程的数值却不相同,是因为操作系统帮进程做了写时拷贝的操作,写时拷贝对虚拟地址无影响。所以这也证明了,打印出来的并非物理地址,而是虚拟地址。

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

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

相关文章

前端CSS

文章目录 引入标签的两大重要属性&#xff1a;区分标签class属性id属性学习CSS流程 CSS前言CSS层叠样式表1.CSS组成2.css语法结构3.注释语法4.引入css的多种方式 CSS选择器1.CSS基本选择器2.CSS组成选择器3.分组与嵌套4.属性选择器5.伪类选择器6.伪元素选择器 选择器优先级CSS继…

基于深度学习的水果识别 计算机竞赛

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

什么情况会造成电表不走数?

电表是衡量用电量的重要设备&#xff0c;一旦出现不走数的情况&#xff0c;不仅会影响用户对用电量的准确计算&#xff0c;还可能造成电费纠纷。那么&#xff0c;究竟什么情况下会造成电表不走数呢&#xff1f;接下来&#xff0c;小编来为大家介绍下&#xff0c;一起来看下吧&a…

傅里叶分析和小波分析

从傅里叶变换到小波变换&#xff0c;并不是一个完全抽象的东西&#xff0c;可以讲得很形象。小波变换有着明确的物理意义&#xff0c;如果我们从它的提出时所面对的问题看起&#xff0c;可以整理出非常清晰的思路。 下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺…

Python---字符串切片-----序列名称[开始位置下标 : 结束位置下标 : 步长]

字符串切片&#xff1a;是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。 本文以字符串为例。 基本语法&#xff1a; 顾头不顾尾&#xff1a; ----------类似range&#xff08;&#xff09; 范围&#xff0c;顾头不顾尾 相关链接Python----ran…

python使用ffmpeg来制作音频格式转换工具(优化版)

简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。 日志: 20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径 UI界面: 编程平台:visual studio code 编程语言:python 3…

SuperMap iServer 11i(2023)安全性提升汇总

作者&#xff1a;lisong 目录 账户信息合规度校验规则扩展功能图片验证码登录功能Web服务提供者密码加密数据库密码加密漏洞修复 SuperMap iServer 11i&#xff08;2023&#xff09;产品安全性相关的提升众多&#xff0c;涵盖账户安全、服务安全以及漏洞修复等方面&#xff0c;…

dockefile

文章目录 应用的部署MySql的部署Tomcat的部署 dockerfileDocker原理镜像的制作容器转镜像Dockerfile 服务编排Docker Compose Docker 私有仓库 应用的部署 搜索app的镜像拉去app的镜像创建容器操作容器中的app MySql的部署 容器内的网络服务和外部机器无法直接通信外部机器和…

Jenkins中解决下载maven包巨慢的问题

背景介绍 我们在使用jenkins构建maven项目时由于依赖很多第三方jar包&#xff0c;默认会从maven中央仓库下载&#xff0c;由于maven中央仓库服务器是国外的&#xff0c;所以下载很慢&#xff0c;甚至会超时 解决办法 增加jenkins maven 源配置 如下图所示&#xff0c;增加m…

Apache ActiveMQ (版本 < 5.18.3) (CNVD-2023-69477)RCE修复方案/缓解方案

一、漏洞描述 Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;基金会的一套开源的消息中间件&#xff0c;它支持 Java 消息服务、集群、Spring Framework 等。 二、漏洞成因 ActiveMQ 默认开放了 61616 端口用于接收 OpenWire 协议消息&#xff0c;由于针对异常…

店铺消费短信通知模板,可以自定义编辑内容群发

店铺消费短信通知模板&#xff0c;可以自定义编辑内容群发 上图可以对短信的发送情况进行查询&#xff0c;可以通过该软件群发短信。 下图为 佳易王 会员管理系统软件&#xff0c;在会员充值或消费的时候&#xff0c;可以设置自动发送短信通知信息。 可以自由设置&#xff0c;…

OpenFeign的简单介绍和功能实操

前言 本文主要做一下OpenFeign的简单介绍和功能实操&#xff0c;实操主要是OpenFeign的超时和重试&#xff0c;在阅读本文章前&#xff0c;请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign&#xff…

【计算机网络】路由器的工作原理

文章目录 输入端口处理和基于目的地转发交换结构输出端口处理排队问题参考资料 路由器的四个组件 输入端口(input port)&#xff1a;执行物理层功能&#xff08;input port 左边方框、output port 右边方框&#xff09;、数据链路层功能&#xff08;input/output port 中间方框…

043-第三代软件开发-第三方串口库使用

第三代软件开发-第三方串口库使用 文章目录 第三代软件开发-第三方串口库使用项目介绍第三方串口库使用示例代码 关键字&#xff1a; Qt、 Qml、 QextSerialPort、 QThread、 高频 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt…

多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测预测效果基本描述程序设计参…

[云原生1. ] 使用Docker-compose一键部署Wordpress平台

文章目录 1. Docker-compose概述1.1 简介1.2 docker-compose 的三大概念1.3 docker-compose配置模板文件常用的字段1.4 docker-compose 常用命令及格式 2. YAML 文件的详细介绍及编写注意事项2.1 简介2.2 yaml的特性2.2.1 语法特点2.2.2 数据结构2.2.3 引号的区别2.2.4 内置类型…

springboot配置https

SSL &#xff1a; secure socket layer 是一种加密协议&#xff0c;SSL主要用于保护数据在 客户端和服务器之间的传输&#xff0c;&#xff0c;防止未经授权的访问和窃取敏感信息 在腾讯云申请ssl证书 申请了之后在我的域名中&#xff0c;&#xff0c;解析 解析了之后&…

【驱动开发】注册字符设备使用gpio设备树节点控制led三盏灯的亮灭

注册字符设备使用gpio设备树节点控制led三盏灯的亮灭 设备树&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int OD…

物流小程序制作教程:从零到有,详细解析

随着互联网的快速发展&#xff0c;物流行业也逐渐实现了数字化转型。为了满足消费者对更加便捷、高效的服务需求&#xff0c;许多物流企业选择制作自己的小程序。本文将通过乔拓云网后台&#xff0c;带你轻松搭建物流小程序&#xff0c;主要分为以下几个部分&#xff1a; 一、进…

Microsoft 365 管理自动化

Microsoft 365 服务被大多数组织广泛使用&#xff0c;每天生成的数据量巨大。解决 Microsoft 365 中的问题可能非常困难&#xff0c;并且使用多个管理中心来保护组织变得复杂。本机控制台还缺少某些批量管理任务、全面的审计报告和基于角色的精细访问控制。 Microsoft 360 管理…