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

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




在这里插入图片描述



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


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

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




写时拷贝机制:


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

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

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



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

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




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




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

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

http://www.mrgr.cn/news/56378.html

相关文章:

  • IO模块引领轻工纺织智能化转型
  • 算法之二分查找法
  • Python 第六节 变化的文字
  • [单master节点k8s部署]41.部署springcloud项目
  • ArgoWorkflow教程(七)---高效的步骤间文件共享策略
  • VMware通过Vcenter升级Esxi
  • app端文章列表查询-详细教程(上)
  • 下载MySQL-Windows
  • 矩阵概念 和 性质
  • 无源数据TRP,TIS指标好还是有源数据指标好
  • CentOS 7 安装gcc编译环境
  • 基于线性回归(Linear Regression)的房屋价格预测
  • OJ题-用两个栈来实现队列
  • 一键获取字幕,2024四大视频转文字神器推荐!
  • Linux系统基础-进程间通信(3)_模拟实现匿名管道
  • Oracle分区表改造(三):通过分区交换和分裂改造为分区表
  • 基于Multisim电子配料秤电路设计(含仿真和报告)
  • MySQL数据库的高可用
  • 应对 .DevicData-X-XXXXXXXX 勒索病毒:防御与恢复策略
  • 07 实战:视频捕获
  • 高效HR运营,10佳系统指南
  • 支付域——交易系统设计
  • 防火墙是什么?科普为保护应用层而生的可靠工具
  • MacPro M3无法运行minikube 和 docker
  • 衣柜是在乳胶漆之前装还是之后装好呢?
  • 《使用Gin框架构建分布式应用》阅读笔记:p108-p126