Linux进程地址空间
程序地址空间
在进行编程语言的学习时,都会涉及到一点内存空间的知识,如下空间分布图
验证
堆,栈是相对而生的
在C语言中,用malloc从堆区申请空间的时候,申请时会将要申请的空间大小告诉程序
但是,当free该堆区上的空间时,为何不要传入该空间的大小?
当malloc根据程序员输入的字节大小申请堆区空间时,
会额外再申请一片空间用来记录该堆区空间的属性信息(申请的时间,大小等),在一些数中被称为cokie数据(饼干数据)
故free的时候,只要传入空间的起始地址,根据起始地址就能找到这片空间的属性数据
虚拟地址
学过编程语言的都知道,一个地址只能保存一个数据.
#include <stdio.h>
#include <unistd.h>
int g_val=100;
int main()
{
pid_t id=fork();
if(id==0)
{
int cnt=0;
//child
while(1)
{
printf("i am child,pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val );
sleep(1);
cnt++;
if(cnt==5)
{
g_val=200;
printf("child change g_val 100 ->200 success \n ");
}
}
}
else
{
//father
while(1)
{
printf("i am father,pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val );
sleep(1);
}
}
}
结果
进程地址空间
什么是地址空间?
fork遗留问题解答
深入理解虚拟内存地址
当程序在编译成可执行文件,且还没被加载到内存的时候,程序内部由地址吗?
程序内部的地址,依旧用的时编译器编译好的虚拟地址,
当程序加载到内存的时候,每行代码,每个变量便具有了物理地址
且这个物理地址是外部的,程序内部还是编译时的虚拟地址
为什么要由地址空间