Linux系统编程:进程地址空间

linux系统编程:进程地址空间一,内存地址空间1.1,栈区存储变量:普通局部变量、指针变量、函数参数、函数返回地址、临时变量、寄存器变量;

函数参数:函数的参数是从右到左依次入栈的;

Linux系统编程:进程地址空间在vs2022上栈区并不是”向下生长的”,而是正常的栈,因此推断结果应该是b的地址较低,a的地址比b的地址高;

Linux系统编程:进程地址空间函数返回地址:函数返回地址是指函数执行完毕后,程序需要跳转回继续执行的内存地址(即函数的地址)。当一个函数被调用时,当前程序的执行流程会转移到该函数内部。在函数执行完成后,程序需要知道回到哪里继续执行后续的代码,这个“回去的位置”对应的内存地址就是函数返回地址。

1.2,堆区介绍

立即进入“豆包AI人工智官网入口”;

立即学习“豆包AI人工智能在线问答入口”;

特点

动态分配:程序运行时可根据需要随时在堆区申请和释放内存空间,大小可在运行时确定,适应不同数据结构和算法的需求;

空间较大:一般来说,堆区的空间比栈区的空间更大,因为它是随机开辟的,并不像栈区地址都是连续的,所以空间更大,方便使用;

管理复杂:需要程序员手动管理内存分配和释放,容易引发悬空指针和由于忘了释放内存造成的内存泄漏问题;

1.3,全局区(数据段)与常量区全局区也称为静态存储区,用于存放全局变量和静态变量;

生命周期:随着进程结束释放内存;即便是函数内部的局部静态变量生命周期依旧是整个进程;

Linux系统编程:进程地址空间我们可以看到即便是超出了作用域,static int a 的地址空间依旧没有释放;这说明静态局部变量的生命周期不是随作用域的,而是随进程的;但只能在作用域中使用(在不返回值的情况下); ——>静态局部变量相当于全局变量,唯一的区别就是作用域不同;

1.4,代码段数据段是进程中存储执行代码的内存区域,它包含了程序的指令和常量(“1”,”hello world”….);

二,fork的遗留问题为什么fork有两个返回值?

这其实是在两个进程中看,父进程执行到fork时还没来得及return,此时子进程就已经创建出来了,并且也会return一个值,所以有两个值;那这么看就会产生两个数据,对吧;接下来我们验证一下他们的地址;

Linux系统编程:进程地址空间Linux系统编程:进程地址空间我们可以看到id的值是不一样的,但地址确实一样的,这是为什么呢?按道理说,如果地址相同那同一个地址怎么可能存两个数据呢?况且还发生了写时拷贝,地址怎么会相同呢?

其实这里我们看到的是虚拟内存地址;

先来解释一下上面的情况:

—->父进程创建子进程时确实发生了写时拷贝,id变量的确有两份,不过是写时拷贝开辟的空间是物理内存,这个时候物理内存上存在两个id地址,一个是父进程的,一个是子进程的,而我们在程序中看到的是虚拟内存地址;物理内存无法在程序中看到;

问题一:为什么要有虚拟地址(进程地址空间)

1.统一进程视角看待内存

现在我们使用OS类比一个大富翁,3个进程类比3个他的孩子;一个大富翁(操作系统)有10亿美金,而他有四个私生子,但是四个私生子(进程)都并不知道对方的存在(进程独立性),所以他们都认为大富翁只有他唯一一个儿子,而大富翁告诉他们一旦自己去世了,就把所有的家产留给他,所以每个儿子也都信了,因此大富翁其实给每个私生子都画了一个大饼(进程地址空间)。每个人都认为自己有十亿家产。但实际上是这些私生子要多少才会给多少(进程需要多少空间操作系统就给多少空间

如果有一张虚拟内存,这样每个进程就不需要关心当前的物理内存会不会影响到别的进程,我用的时候直接告诉OS,然后他帮我们分配,这样可以更加方便有序的使进程运行;

2.保护内存地址,出现问题直接拦截(相当于加了一层防护)

当我们申请物理内存空间时,就会利用虚拟地址进行地址审查,在这个转化过程中,如果虚拟内存地址出现问题,就会直接结束这个过程,就不会直接影响到物理内存;

为什么我们无法修改常量字符串?

常量字符串位于常量区域,但仅仅如此不足以说明不可修改,我们都知道不可修改是一种权限,那这个权限在哪里呢?其实这个权限是在页表中,当通过虚拟地址访问物理地址时,会通过页表转化并检查权限,如果没有权限就会被拦截;

三,什么是进程地址空间我们知道要管理一个对象的方法是–>先描述再组织;

Linux系统编程:进程地址空间四,页表现代操作系统不做浪费时间和空间的事;

4.1,写时拷贝,缺页中断,惰性加载首先,页表中有什么呢?

Linux系统编程:进程地址空间答:虚拟地址、物理地址、权限位、标志位(是否将对应的代码和数据加载到内存中)

权限位有什么用?

权限位上有该地址的读和写权限,如果该地址是只读权限那么我们对地址进行修改就会被OS直接拦截,非法请求就不会发送到物理内存,对物理内存起到一定程度的保护作用;

标志位是什么?

标志位是检查进程该地址需要的代码是否加载到了内存中;

惰性加载:就是需要多少加载多少,操作系统对于大文件是可以实现分批加载的,也就是进程可能有时会只有PCB在内存中;

缺页中断:当所需的代码和数据还没有被加载进内存的时候,这时候就会发生缺页中断,中断的意思就是暂时暂停此进程,等待代码和数据加载进来后就会继续执行进程;

那么为什么不一次性将代码数据加载到内存中呢?

从空间的角度思考,一个大文件加载是需要占用很大的空间的,而且进程一开始也不会马上用到一整块代码,所以这个时候有一些代码数据是空闲的,也就占用了额外的内存空间;

从时间的角度考虑,加载一个大文件十分耗费时间;一次性加载效率不高;

因此出现了缺页中断,其用意就是对代码和数据进行局部性加载,合理使用内存从而提高效率;

写时拷贝:数据段(全局区)的数据本来是可写的,但权限确实只读的,这么做的目的就是为了维持写时拷贝;当进程双方中的一方对数据进行修改,就会触发写时拷贝机制,重新开辟一块空间,存储新的数据,并且修改页表映射;

4.2进程地址是如何被切换的Linux系统编程:进程地址空间进程PCB结构体里有对应的进程地址空间指针,所以进程切换就意味着进程空间地址空间被切换,而页表会被存储在CPU的cr3寄存器中,这其实属于进程的上下文信息,在进程切换的时候会被进程带走,后面再恢复过来!

4.3进程创建的具体分析过程进程被创建的时候,优先被创建和加载的是PCB数据结构和对应的地址空间,代码和数据等到需要的会后在加载进来;

4.4重新理解进程具有独立性1.在PCB数据结构上,每一个进程都有自己唯一的PCB;

2.虚拟地址可以相同,但通过页表映射的物理地址是不同的;各自有各自的区域,对于父子进程在写时拷贝的机制下,也是拥有自己独一份的物理地址;

五,命令行参数和环境变量在栈的上面Linux系统编程:进程地址空间Linux系统编程:进程地址空间

以上就是Linux系统编程:进程地址空间的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/72791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
归环回溯玩法怎么玩 归环时间循环机制详解
上一篇 2025年11月13日 18:30:38
free一个合法的地址也会导致crash?
下一篇 2025年11月13日 18:32:40

相关推荐

  • Linux内核13-进程切换

    进程切换,也称为任务切换、上下文切换或任务调度,本文将探讨linux内核中进程切换的实现。我们首先理解几个关键概念。 1.1 硬件上下文 每个进程都有自己的地址空间,但所有进程共享CPU寄存器。因此,在恢复进程执行前,内核必须确保挂起时的寄存器值被重新加载到CPU寄存器中。 这些需要加载到CPU寄存…

    2026年9月22日
    200
  • 如何修改MySQL的默认端口号?

    如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?

    修改mysql默认端口号需编辑配置文件,核心步骤为:1.定位my.cnf或my.ini文件;2.在[mysqld]段落中修改或添加port参数;3.保存后重启mysql服务。更改端口主要出于避免冲突、提升安全性和适应网络策略考虑。连接时需在客户端工具或代码中指定新端口,如命令行加-p参数、编程语言连…

    2026年9月22日 用户投稿
    1200
  • 抖音短视频如何选择合适的BGM?音乐对流量影响有多大?

    抖音短视频如何选择合适的BGM?音乐对流量影响有多大?抖音短视频如何选择合适的BGM?音乐对流量影响有多大?抖音短视频如何选择合适的BGM?音乐对流量影响有多大?抖音短视频如何选择合适的BGM?音乐对流量影响有多大?

    选对bgm能显著提升抖音视频流量。bgm不仅烘托氛围,还影响算法推荐和用户停留;平台通过音乐判断视频类型与受众,节奏感强的音乐提高完播率,增强情绪共鸣促进互动;选音乐需结合内容调性、热门趋势与受众喜好,如搞笑类配明快音乐、美食类用温馨轻音乐,关注热榜与同类账号参考;常见误区包括音量过大、风格不符、盲…

    2026年9月22日 用户投稿
    100
  • 在 Linux 中如何强制停止进程?kill 和 killall 命令有什么区别?

    在日常工作中,您可能会遇到两个用于在 linux 中强制结束程序的命令:kill和killall。虽然许多 linux 用户熟悉kill命令,但使用killall命令的人相对较少。尽管这两个命令名称相似且目的相同(终止进程),但它们在使用方式和效果上有显著区别。 那么,kill和killall之间有…

    2026年9月22日
    100
  • 荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏

    荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏

    10月13日,一位数码博主透露,某款搭载骁龙8系旗舰平台的新机正在规划一款硅基电池,其容量预计将达到约9000mah。这一超大电池容量在当前智能手机市场中极为少见,意味着该机型在续航能力上将拥有显著优势。结合该博主的暗示以及网友的讨论分析,这款新机极有可能是即将发布的荣耀gt 2系列。 荣耀GT P…

    2026年9月22日 用户投稿
    100
  • 一加Pro系列微信收款语音怎么开启?快速设置支付播报的方法

    首先检查微信内“收款小账本”开启语音播报功能,其次确保手机系统给予微信通知权限、关闭勿扰模式、媒体音量正常,并在电池设置中避免微信后台被限制,同时更新微信至最新版本;若需个性化,可通过系统通知渠道单独设置收款通知的声音与优先级,但无法更换播报音色;使用时注意公共场合隐私保护,务必核对屏幕金额以防误报…

    2026年9月22日
    100
  • PHP匿名函数怎么用_PHP匿名函数使用场景分析

    PHP匿名函数是无名函数,可作为回调或赋值给变量,常用在数组处理、事件回调、逻辑封装等场景,支持use引入外部变量及fn短语法,结合bindTo可访问对象私有成员。 PHP匿名函数,也叫闭包函数(Closure),是一种没有名称的函数,通常作为回调使用或赋值给变量。它在实际开发中非常灵活,尤其适合用…

    2026年9月22日
    100
  • 抖音专营店怎么添加直播号?怎么把新开的抖音号添加到专营店里

    随着抖音平台社交属性不断增强,内容生态日益丰富,越来越多电商从业者开始在该平台上开展业务。其中,抖音专营店作为电商布局的重要一环,也吸引了大量商家入驻。那么,如何将直播号加入抖音专营店中,让直播成为店铺引流和销售的新工具呢?接下来的内容将为您详细介绍。 一、为什么要在抖音专营店中添加直播号 提升店铺…

    2026年9月22日
    000
  • 为什么建议手动定义Java序列化ID

    手动定义serialVersionUID可确保序列化兼容性,避免因类结构变化导致反序列化失败。Java默认生成的ID依赖类名、字段等信息,编译环境或代码微小改动均使其改变,易引发InvalidClassException。显式声明后,可在兼容性变更时主动控制ID更新,保留原ID则允许旧版本读取新对象…

    2026年9月22日
    200
  • mysql怎么使用全文索引 mysql创建全文索引的配置方法

    mysql怎么使用全文索引 mysql创建全文索引的配置方法mysql怎么使用全文索引 mysql创建全文索引的配置方法mysql怎么使用全文索引 mysql创建全文索引的配置方法mysql怎么使用全文索引 mysql创建全文索引的配置方法

    mysql使用全文索引的核心是让数据库像搜索引擎一样理解并高效检索文本内容。1. 创建全文索引:可在建表时或之后通过alter table语句为char、varchar或text字段添加fulltext索引;2. 使用match against查询:支持自然语言模式(自动过滤停用词并按相关性排序)和…

    2026年9月22日 用户投稿
    100
  • VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​

    VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​

    vscode中高效批量追踪数据变化的关键是将监视列表用作表达式求值器,而非仅添加单一变量;2. 可在监视列表中添加复杂对象路径(如user.profile.address.city)、计算表达式(如(a + b) * c)、函数调用(如calculatetotal(items))或条件判断(如myv…

    2026年9月22日 用户投稿
    000
  • 如何设置Linux服务超时参数 systemd服务超时配置

    如何设置Linux服务超时参数 systemd服务超时配置如何设置Linux服务超时参数 systemd服务超时配置如何设置Linux服务超时参数 systemd服务超时配置如何设置Linux服务超时参数 systemd服务超时配置

    systemd服务超时参数调整方法包括:1.使用systemctl show查看timeoutstartsec、timeoutstopsec、timeoutsec字段获取当前配置;2.通过systemctl edit编辑unit文件设置timeoutstartsec、timeoutstopsec或t…

    2026年9月22日 用户投稿
    000
  • mysql安装完如何诊断 mysql慢查询分析与优化方法

    要解决 mysql 慢查询问题,首先要开启慢查询日志,其次使用 mysqldumpslow 分析日志,再通过 explain 查看执行计划,最后根据常见优化建议改进 sql 和索引。具体步骤如下:一、修改配置文件或动态开启慢查询日志,并设置阈值和路径;二、使用 mysqldumpslow 工具分析慢…

    2026年9月22日
    100
  • 如何设置Linux用户会话超时 TMOUT环境变量详细配置

    如何设置Linux用户会话超时 TMOUT环境变量详细配置如何设置Linux用户会话超时 TMOUT环境变量详细配置如何设置Linux用户会话超时 TMOUT环境变量详细配置如何设置Linux用户会话超时 TMOUT环境变量详细配置

    tmout是bash shell用于设置用户会话超时的环境变量,单位为秒,常用方法包括:1. 临时设置通过执行export tmout=300仅对当前终端生效;2. 全局设置在/etc/profile中添加export tmout=600需root权限并执行source生效;3. 针对特定用户修改其…

    2026年9月22日 用户投稿
    000
  • Java中如何区分逻辑错误和系统异常

    系统异常是程序运行中由JVM抛出的RuntimeException,如空指针、数组越界,会导致程序中断并打印堆栈;逻辑错误是程序语法正确但结果不符预期,如条件写反、循环次数错误,不会崩溃但行为异常。两者区别在于是否抛出异常、是否中断执行及调试方式不同,需通过防御性编程、单元测试和日志调试加以防范。 …

    2026年9月22日
    000
  • LINUX怎么查看哪个进程占用了某个端口_LINUX端口占用查询方法

    使用ss或lsof命令可快速查看端口占用情况,如sudo ss -tulnp | grep :端口号或sudo lsof -i :端口号,结合PID进一步通过ps或/proc文件系统定位进程详情。 在Linux系统中,查看某个端口被哪个进程占用,常用的方法是使用命令行工具结合网络和进程信息进行查询。…

    2026年9月22日
    000
  • 抖音小店如何运营?普通人开店选品与推广的实用策略

    抖音小店如何运营?普通人开店选品与推广的实用策略抖音小店如何运营?普通人开店选品与推广的实用策略抖音小店如何运营?普通人开店选品与推广的实用策略抖音小店如何运营?普通人开店选品与推广的实用策略

    新手做抖音小店最现实的问题是没钱投广告和没专业团队,解决方法是抓住选品和推广两个核心环节。一、选品要找市场需求高且利润合理的商品,避开竞争激烈或太冷门的品类,结合多平台数据测试;二、前期重点用“商品卡”推广,通过短视频展示产品使用场景并挂链接引流,成本低且适合测试;三、适当尝试直播积累经验,但不依赖…

    2026年9月22日 用户投稿
    400
  • 如何查询命令所属包 yum provides反向查找

    如何查询命令所属包 yum provides反向查找如何查询命令所属包 yum provides反向查找如何查询命令所属包 yum provides反向查找如何查询命令所属包 yum provides反向查找

    使用 yum provides 可以查找某个命令或文件属于哪个软件包,解决“command not found”问题。1. 使用时建议带上完整路径,如 yum provides /usr/sbin/ifconfig;2. 支持通配符模糊查找,如 yum provides */python3;3. 若…

    2026年9月22日 用户投稿
    000
  • PHP一键环境如何设置网站域名解析_本地域名解析配置

    配置本地域名需修改hosts文件并设置Web服务器虚拟主机。1. 在hosts添加“127.0.0.1 myproject.test”实现域名解析;2. Apache中编辑httpd-vhosts.conf添加VirtualHost指向项目目录,确保加载该配置文件后重启服务;3. Nginx中在vh…

    2026年9月22日
    700
  • mysql如何输入变量值 mysql交互式代码输入步骤详解

    mysql如何输入变量值 mysql交互式代码输入步骤详解mysql如何输入变量值 mysql交互式代码输入步骤详解mysql如何输入变量值 mysql交互式代码输入步骤详解mysql如何输入变量值 mysql交互式代码输入步骤详解

    在mysql命令行中交互式输入变量值可通过预处理语句或用户自定义变量实现。1. 使用预处理语句时,先用prepare定义含占位符的sql语句,再通过set设置变量值,最后用execute执行并传参,完成后需deallocate释放资源;2. 使用用户自定义变量时,直接通过set赋值并在sql语句中引…

    2026年9月22日 用户投稿
    100

发表回复

登录后才能评论
关注微信