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

【Linux】为什么环境变量具有全局性?共享?写时拷贝优化?




在这里插入图片描述



环境变量表具有全局性的原因:


环境变量表之所以具有全局性的特征,主要是因为它们是在进程上下文中维护的,并且在大多数操作系统中,当一个进程创建另一个进程(即父进程创建子进程)时,子进程会继承其父进程的环境变量。这意味着子进程将会获得与父进程相同的环境变量表,除非在创建子进程时明确地改变了某些环境变量。

这种继承机制使得环境变量在整个程序执行期间以及在派生的子进程中保持一致性和可用性。然而,尽管环境变量在一定范围内具有“全局性”,但需要注意的是,每个进程实际上都有它自己独立的一份环境变量副本。也就是说,对某个进程中的环境变量所做的更改不会影响到其他已经存在的进程。这种设计有助于避免不同进程之间的干扰,并提供一定程度的隔离,保证了进程的独立性。




写时拷贝机制:


Linux 系统中,当一个进程创建子进程时,子进程确实会继承父进程的环境变量表,但这种继承实际上是通过一种称为 “写时拷贝”(Copy-On-Write, COW)的优化技术来实现的:

前面虽说子进程拥有一份父进程环境变量表的拷贝副本,但这句话其实没有那么准确。实际上,若子进程不修改自己的环境变量表,则子进程和父进程会同时共用同一张环境变量表,这有利于节省内存空间与提高系统效率。

如果子进程修改了自己的环境变量,则会触发系统的写时拷贝机制,系统才会为该子进程分配新的内存页面,并将原来的和父进程共享的环境变量复制到新的内存中。这样,只有在实际需要修改的情况下,才会发生真正的复制。



更加细致的理解:只读数据一般可以被共享

        在Linux系统中,环境变量通常是只读的,这意味着在多数情况下,子进程可以直接与父进程共享同一张环境变量表,而不必立即创建一份副本。只有当子进程试图修改环境变量时,系统才会触发写时拷贝(Copy-On-Write, COW)机制,为子进程分配新的内存区域,并复制必要的数据。




写时拷贝机制是不是很聪明!!:你我都不修改,就一起共用;之后谁修改了就为谁分配新的内存存放修改后的新内容。这样只有在真正修改时,才会发生真正的拷贝,大大优化了系统效率。




通过父进程创建子进程的例子梳理一下 写时拷贝机制的过程:

  1. 创建子进程: 当一个进程通过fork()创建子进程时,子进程继承了父进程的数据段、堆和栈等内存区域,包括环境变量表。这些内存区域在开始时是共享的,意味着它们指向相同的物理内存页面。
  2. 修改检测: 如果子进程试图修改任何一个共享的内存页面(包括环境变量表),操作系统会检测到这一行为,并触发写时拷贝机制。
  3. 写时拷贝
    • 操作系统会为子进程分配新的内存页面。
    • 将原来的页面复制到新的内存页面中。
    • 修改后的页面指向新的内存页面,而原来的页面仍然保留不变。
    • 父进程和其他未修改的子进程仍然可以继续共享原来的内存页面。
http://www.lryc.cn/news/466443.html

相关文章:

  • 如何在Linux中找到MySQL的安装目录
  • 机器人备件用在哪些领域
  • 基于单片机优先级的信号状态机设计
  • 数字电路week3
  • 如何在 Linux 中对 USB 驱动器进行分区
  • 【STM32+HAL】STM32CubeMX学习目录
  • PPT自动化:Python如何修改PPT文字和样式!
  • 4:Java的介绍与基础4:for语句
  • R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)
  • [LeetCode] 50. Pow(x, n)
  • Vue学习笔记(七、事件修饰符 .stop .capture .self .once .prevent)
  • web网站搭建(静态)
  • 高效特征选择策略:提升Python机器学习模型性能的方法
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第四弹 第一题
  • 优化多表联表查询的常见方法归纳
  • Java毕业设计 基于SpringBoot发卡平台
  • VRoid Studio 介绍 3D 模型编辑器
  • 软件设计模式------抽象工厂模式
  • 基于springboot+微信小程序校园自助打印管理系统(打印1)
  • 解锁文本数据可视化的无限可能:Wordcloud库全解析
  • 代码审计-Python Flask
  • 深度学习:开启人工智能的新纪元
  • 第十四章_File类与IO流
  • Qml-CheckBox的使用
  • Java的RocketMQ使用
  • 中间件之MQ-Kafka
  • [DB] NSM
  • Redis 高可用:从主从到集群的全面解析
  • 全能型选手视频播放器VLC 3.0.21 for Windows 64 bits支持Windows、Mac OS等供大家学习参考
  • 解决在Vue3中使用monaco-editor创建多个实例的导致页面卡死的问题