17。进程地址空间

子进程修改数据要进行写时拷贝,但是为什么打印的地址是一样的,

当存入一个变量,内存中开辟一个空间物理地址乘gval,地址空间也有四字节的全局变量,这个起始称为虚拟地址,操作系统内为每一个进程构建一张页表的东西,页表左侧填虚拟地址,右侧物理地址,进程想要访问虚拟地址时查表访问物理地址,访问指定变量,所有元素都是这样,代码,所有数据都通过映射,整形四个字节每个字节都要有地址为什么只拿到一个地址,拿的是最开始的地址,通过类型决定访问几个字节。 子进程的pcb 进程地址空间 页表都是拷贝父进程的,页表就是浅拷贝,父子代码数据就是共享的,后来子进程要修改,内存中再拷贝一份,得到新的物理地址,修改映射关系,修改页表,这种机制是写时拷贝

父子进程不管谁只要发生return就要发生写时拷贝,父子访问同一个变量虚拟地址但是映射到不同的物理地址,

管理虚拟地址空间先描述在组织,虚拟地址空间本质就是个结构体对象,tast struct也是个结构体变量,两个结构体之间可以用指针相互指向,这个结构体有很多信息,还有mm*组织起来,对饼的管理, 虚拟地址空间是在操作系统内部给进程创建的结构体对象,这就是虚拟地址空间,

虚拟地址空间的结构体内装的是地址的开始和结束,调整地址空间只需要对这些开始结束加减就行

当我们的程序变成进程的时候,代码数据要加载到物理内存,占多少字节,虚拟地址空间就从特定地址开始开辟多少字节,然后填充页表,就一一对应了,

为什么不直接去物理内存找还要进行一层转化,页表中还有权限,权限没有就不给转,或者杀掉,可以对物理内存进行保护,

如果查的地址在页表中根本没有这叫野指针,操作系统把进程干掉了,所以野指针之后可能崩溃

字符常量区是只读的,如果写页表转化失败,操作系统不让转,

不管C C++编译好都是二进制程序,就要有PCB还有地址空间,页表,

缺页中断

代码特别大,虚拟地址开代码总大小,页表中物理地址只有四分之一,这样就少用内存了,需要后面代码时再把进程运行暂停一下,在从磁盘换一些,重新构建关系,继续运行

如果没有虚拟地址空间,申请内存时pcb内指针必须跟着变,如果加载代码数据就和进程管理强相关了,现在加载内存改页表就行,所以解耦合。

所以可以先创建pcb 地址空间和页表,虚拟空间上东西先给初始化了,(把那些空间多大读上来)代码数据一行也不加载,

挂起:

先找到S状态的进程操作系统查页表,把页表物理内存清空,代码数据全部唤出到磁盘指定位置,保留左半部分,右边唤出,所以进程还存在,这解耦特别好,可以分批加进来也可以分批换出去

malloc好几次,是离散的好几个起始地址,但是堆区只有一个起始地址,怎么理解

虚拟地址空间中还存在vm area,是个链表会记录每个子区域的开始结束,这样就可以分段不连续全部划分哈,壹份堆区对应一份vm area struct,每份start end就直接得到

每个区域都有vm area struct堆区可以有好几个,mmstruct对应整个地址空间整体的描述,

代码数据父子共享,子进程一旦尝试修改,就写实拷贝

如果这个进程要执行另一款操作系统呢,那么就可以在Linux上跑其他的操作系统这就是内核级虚拟机的原理,进程是独立的,各个操作系统 直接是独立的

如果父进程没有创建子进程那么数据段是读写的,创建之后把页表中所有的项目改成只读,子进程写入时,操作系统就发现虚拟地址物理地址都有合法的,而且访问的是数据段,因为mm内有每个段的地址间距,所以能区分开,但是发现是制只读的就触发写时拷贝,,

为什么要写时拷贝

数据直接拷贝话创建子进程太慢,只改一部分全拷贝,内存重复,

那个子进程先写就把权限设成读写,所有子进程都设玩那么父进程变成读写

相关推荐
云飞云共享云桌面几秒前
智能装备工厂研发部门多设计师共享一台SolidWorks服务器做设备装配建模
运维·服务器·网络·人工智能·3d·自动化·制造
Elastic 中国社区官方博客8 分钟前
Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
简简单单就是我_hehe10 分钟前
一次 ClickHouse 服务器磁盘告警的排查与修复实录
java·服务器·前端
自由彩虹11 分钟前
靶场通关16--victim1
linux·服务器·网络·安全·web安全·网络安全
叼烟扛炮14 分钟前
Linux 学习笔记(三十九):网络基石——TCP/IP 模型与 UDP 实战
linux·运维·网络·笔记·学习·tcp/ip
闲云野鹤在人间15 分钟前
头秃修炼手册:StorageClass+StatefulSet+ETCD 全套渡劫笔记
linux·数据库·笔记·云原生·kubernetes·etcd
wuminyu20 分钟前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++
你看我名字24 分钟前
Kafka 架构、消息可靠性与生产运维:从分区模型到故障治理
运维·架构·kafka
EVEN-091325 分钟前
Linux-线程控制
linux·jvm
研发小能28 分钟前
DevOps 工具链怎么选?已有工具的企业,先评估整合能力
运维·devops