开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情
程序地址空间
什么是地址空间
我们说的地址空间是逻辑地址空间(虚拟地址空间),并不是物理上的地址空间。 逻辑空间和物理内存空间是通过页表进行映射的。
地址空间是怎么设计的
地址空间是一种数据结构,它里面包含了对各个区域的划分
为什么要有地址空间
- 安全性
当代码是非法访问或者修改数据的时候,在没有访问到物理内存的时候,就已经在虚拟地址空间阶段就拦截了
- 进程独立性
通过页表的映射机制,实现了进程之间的独立
- 空间利用
对于申请的空间,如果没有使用,在物理内存上其实是没有开辟的,这就保证了空间利用的高效。
什么叫做挂起
pcb、虚拟地址空间、页表都准备好了,只不过,内存中没有相应的代码和数据;代码和数据还在硬盘中,这就是挂起。
虚拟地址
test:test.c test1.c test2.c
gcc -o $@ $^ //$@为目标,$^依赖项
每个进程都有一个自己的虚拟地址空间 地址空间和页表(用户级)是每一个进程都私有一份的。 可执行程序在编译的时候,程序内部已经有地址了。 地址空间不要仅仅理解成为是os内部要遵守的,其实编译器也要遵守。即编译器编译代码的时候,就已经给我们形成了各个区域,代码区,数据区……,并且,采用和linux内核中一样的编制方式,给每一个变量,每一行代码都进行了编址;故,程序在编译的时候,每一个字段早已经具有了一个虚拟地址。
fork之后代码是共享的,是父进程所有的代码都是共享的。
写时拷贝
当创建子进程的时候,代码是共享的,如果数据只是只读数据,那么数据也是共享的,可以节省空间。当子或者父进程的数据需要改变的时候,这时父子进程的代码在物理内存中就不能在是一个位置了,此时要进行拷贝,把父子数据要单独处理,这时的拷贝就是写时拷贝。