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内有每个段的地址间距,所以能区分开,但是发现是制只读的就触发写时拷贝,,

为什么要写时拷贝

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

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

相关推荐
XP62261 小时前
Linux安装RabbitMQ
linux·运维·rabbitmq
疑犯1 小时前
Linux中符号命令详解
linux·运维·服务器
hweiyu001 小时前
Linux 命令:echo
linux·运维
JZC_xiaozhong2 小时前
什么是跨系统流程自动化?
大数据·运维·bpm·数据集成与应用集成·业务流程管理
zl_dfq2 小时前
Linux 之 【多线程】(线程池、单例模式)
linux
Ha_To2 小时前
2026.2.3 Dockfile创建镜像
linux·运维·服务器
猫头虎2 小时前
OpenClaw相关的开源AI项目汇总大全:本文涵盖近期所有OpenClaw相关的GitHub高星star热门项目
运维·人工智能·macos·docker·容器·开源·github
筵陌2 小时前
Linux网络传输层协议TCP
linux·网络·tcp/ip
HIT_Weston2 小时前
132、【Ubuntu】【Hugo】搜索功能异常(问题解决)(二)
linux·运维·ubuntu