当前位置: 首页 > news >正文

Linux:进程地址空间

目录

一、虚拟地址

二、进程地址空间


一、虚拟地址


        父进程和子进程之间,代码共享,而数据可能会发生修改,所以当其中一个进程要写入数据时,则发生写时拷贝,各自私有一份。

        现在有源文件内容如下所示。

int glob_val = 10;
int main()
{pid_t id = fork();if(id == 0){int cnt = 0;while(1){printf("child : pid:%d, ppid:%d, glob_val:%d, &glob_val:%p\n",getpid(),getppid(),glob_val,&glob_val);sleep(1);++cnt;if(cnt == 5){glob_val = 20;printf("child change glob_val:10->20\n");}}}else{while(1){printf("child : pid:%d, ppid:%d, glob_val:%d, &glob_val:%p\n",getpid(),getppid(),glob_val,&glob_val);sleep(1);}}return 0;
}

        预期运行结果是,该程序运行五秒之内,父子进程打印的全局变量的值和地址均相同,五秒之后,子进程修改了值,则发生写时拷贝,父子进程打印的全局变量的值和地址均不同

        实际运行结果:

[euto@VM-4-13-centos 24926]$ ./myaddr 
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child change glob_val:10->20
child : pid:10514, ppid:10513, glob_val:20,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20,  &glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20,  &glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10,  &glob_val:0x60105c

        为什么五秒之后全局变量的地址是相同的。

        其实,这个地址是虚拟地址,并不是实际的物理地址。


        而虚拟地址并不止在父子进程的数据拷贝上出现,在程序员这一层,所见到的都是由操作系统提供的虚拟地址,而非实际的物理地址。

        划分分区的也是虚拟地址。

        虚拟地址可以理解为逻辑地址,在底层其实是有物理地址的,只不过逻辑地址物理地址之间的函数关系是由操作系统处理的。


        当子进程做了写时拷贝后,其实发生的变化不在虚拟地址上,而是在物理地址上。

二、进程地址空间

         每一个进程,都存在进程地址空间

  • 操作系统对进程地址空间的管理

        先面向对象,再数据结构。

  •  进程和进程地址空间

        PCB内有一个结构体指针,这个指针指向地址空间这个结构体

  • 区域划分

        即虚拟地址空间的区域划分,用代码来实现,本质就是进程地址空间这个结构体的成员变量,进程地址空间的结构体一定有类似下面这样的字眼。

struct 进程地址空间
{int code_start,code_end;int init_start,init_end;int heap_start,heap_end;int stack_start,stack_end;·····
}
  • 区域划分的本质

        所谓的区域划分,本质就是操控特定的几个变量,这些变量实现了区域划分的条件:

        1.可以判断是否越界。

        2.可以扩大或者缩小范围。

        划分好的区域,在区域内的所有地址,是可以被当前进程所使用的。

  • 进程管理和内存管理是独立、互不影响的。

        代码、数据本质上还是保存在物理内存上面,而虚拟地址是操作系统逻辑上提供给用户的地址,将逻辑地址映射为物理地址的数据结构叫做页表。

        可执行程序加载到内存后,进程创建PCB即task_struct、PCB又创建进程地址空间即mm_struct

        内存管理:可执行程序的代码、数据都保存在物理内存中。

        进程管理:进程获取代码、数据是在进程地址空间,即获取到的是虚拟地址。

        二者之间用页表映射。

  • CPU完成页表的映射操作

        CPU获取到虚拟地址,CPU内部的寄存器CR3保存着页表的起始地址,CPU内部有一个部件MMU(memory mange unit)将虚拟地址通过页表映射到物理地址。

        注意,CR3内部保存的页表的起始地址一定是物理地址。

  • 进程地址空间和页表这种设计的意义 

        1.内存管理的时候,代码和数据的内存块都是碎片化的,处于无序的状态,而进程地址空间是有序的,页表将无序的物理内存转换为有序的进程地址空间,进程操作内存空间会更方便。

        2.内存管理和进程管理互相独立、不影响,这种解耦合的做法会大大减轻设计操作系统的负担。

相关文章:

Linux:进程地址空间

目录 一、虚拟地址 二、进程地址空间 一、虚拟地址 父进程和子进程之间,代码共享,而数据可能会发生修改,所以当其中一个进程要写入数据时,则发生写时拷贝,各自私有一份。 现在有源文件内容如下所示。 int glob_val …...

数据结构:树、森林

二叉树与树结构差异 树(一般树):树是一种数据结构,其中每个节点可以有任意数量的子节点(除了根节点和叶子节点外)。因此,一般树的节点在数组中的表示并不是那么直接,特别是当树不是完…...

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system: Agent学会调用外部应用程序接口,以获取模型权重中缺失的额外信息(预训练后通常难以更改),包括当前信息、代码执行能力、专有信息源…...

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么? 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别: 1、新建项目 Maven: Gradle: 2、配置项目 Maven: Gradle: 3、构建项目——生成项目的jar包 Gradle&…...

electron介绍

Electron中文文档 Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 允许开发者使用前端技术栈来创建可以在 Windows、macOS 和 Linux 等多个操作系统上运行的桌面应用程序。 Electron 本质上是一个运行在桌面操作…...

Redis-持久化

首先,我们明白一个概念, 硬盘>持久 内存>不持久 而Redis是一个内存数据库,不持久,相比于Mysql这样的关系型数据库,最明显的特点是快/效率高 为了保证速度快,数据要保存再内存中,为了持久,存储在硬盘上 所以redis决定: 插入>内存+硬盘(硬盘是为了在re…...

封装轮播图 (因为基于微博小程序,语法可能有些出入,如需使用需改标签)

这是在组件中使用&#xff0c;基于微博语法 <template><wbx-view class"" style"width: 100vw;height: 70vh;"><WBXswiper change"gaibian" :vertical"false" :current"current" indicatorActiveColor"…...

【Ubuntu】minicom安装、配置、使用以及退出

目录 1 安装 2 配置 3 使用 4 退出 minicom是一个串口通信的工具&#xff0c;以root权限登录系统&#xff0c;可用来与串口设备通信。 1 安装 sudo apt-get install minicom 2 配置 使用如下命令进入配置界面&#xff1a; sudo minicon -s 进入配置界面后&#xff0c;…...

MYSQL的监控

1. MySQL服务器都提供了哪几种类型的日志文件&#xff1f;说明每种日志的用途。 Error log&#xff1a;启动、关闭和异常有关的诊断信息 General query log:服务器从客户端收到的所有语句 Slow query log:需要很长时间执行的查询 Audit log:企业版基于策略的审计 Binary…...

CTF ciscn_2019_web_northern_china_day1_web2

ciscn_2019_web_northern_china_day1_web2 BEGIN 拿到题目&#xff0c;先看看 这里发现一个很像提示的东西&#xff0c;然后发现下面是一堆小电视商品&#xff0c;有lv等级和金钱&#xff0c;所以这题的入口可能就是再lv6和这个资金募集上 然后点击下next&#xff0c;看看页…...

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…...

智慧城市交通管理中的云端多车调度与控制

城市交通管理中的云端多车调度与控制 智慧城市是 21世纪的城市基本发展方向&#xff0c;为了实现智慧城市建设的目标&#xff0c;人们需要用现代化的手段去管理和控制城市中的各种资源和设施。智能交通控制与管理是智慧城市中不可缺少的一部分&#xff0c;因为现代城市交通系统…...

分治(归并排序)

一、基本思路 我们以一个归并排序为例。 . - 力扣&#xff08;LeetCode&#xff09; 归并排序的思想&#xff1a;得到两个有序数组&#xff0c;把两个有序数组合并&#xff0c;传到下一层递归&#xff0c;一直得到两个有序数组&#xff0c;一直合并&#xff0c;最后就能得到有…...

小学生为什么要学英语

小学生需要学习英语的原因有很多&#xff0c;以下是其中的一些原因&#xff08;毕竟我也会累滴(*&#xffe3;▽&#xffe3;*)&#xff09;&#xff1a; 1. 全球化交流&#xff1a;英语是国际交流的通用语言&#xff0c;学习英语可以帮助小学生更好地融入全球化的社会环境&am…...

企业云存储如何收费?企业云存储收费标准

企业云存储如何收费&#xff1f;企业云存储的收费方式因不同的服务提供商和具体的服务选项而异&#xff0c;通常从用户数量、存储容量、功能、混合收费、按需定价、定制化、功能模块等多个方面进行考量。以下是对其多方面收费方式的详细介绍&#xff1a; 1.按用户数量收费 适用…...

一步步教你LangGraph Studio:可视化调试基于LangGraph构建的AI智能体

之前我们在第一时间介绍过使用LangChain的LangGraph开发复杂的RAG或者Agent应用&#xff0c;随着版本的迭代&#xff0c;LangGraph已经成为可以独立于LangChain核心&#xff0c;用于开发多步骤、面向复杂任务、支持循环的AI智能体的强大框架。 近期LangGraph推出了一个使得复杂…...

用SpringBoot打造先进的学科竞赛管理系统

1绪 论 1.1研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高了其…...

Linux入门攻坚——34、nsswitch、pam、rsyslog和loganalyzer前端展示工具

nsswitch&#xff1a;network service switch 名称解析&#xff1a;name <---> id 认证服务&#xff1a;用户名、密码验证或token验证等 名称解析和认证服务都涉及查找位置&#xff0c;即保存在哪里。如linux认证&#xff0c;passwd、shadow&#xff0c;是在文件中&…...

如何在Excel中快速找出前 N 名,后 N 名

有如下销售额统计表&#xff1a; 找出销售额排前 10 名的产品及其销售额&#xff0c;和销售额排倒数 10 名以内的产品及其销售额&#xff0c;结果如下所示&#xff1a; 前 10 名&#xff1a; spl("E(?1).sort(ProductSales:-1).to(10)",A1:C78)后 10 名&#xff1…...

创意实现!在uni-app小程序商品详情页轮播中嵌入视频播放功能

背景介绍 通过uni-app框架实现商城小程序商品详情页的视频与图片轮播功能&#xff0c;以提升用户体验和增加商品吸引力。通过展示商品视频和图片&#xff0c;用户可以更全面地了解商品细节&#xff0c;从而提高购买决策的便利性和满意度。这种功能适用于各类商品&#xff0c;如…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...