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

明珠信息港网站建设专家平面在线设计网站

明珠信息港网站建设专家,平面在线设计网站,广告最多的浏览器,商品管理系统个人主页点击直达#xff1a;小白不是程序媛 Linux专栏#xff1a;Linux系统化学习 代码仓库#xff1a;Gitee 目录 虚拟地址和物理地址 页表 进程地址空间 进程地址空间存在的意义 虚拟地址和物理地址 我们在学习C/C的时候肯定都见过下面这张有关于内存分布的图片 个人主页点击直达小白不是程序媛 Linux专栏Linux系统化学习 代码仓库Gitee 目录 虚拟地址和物理地址 页表 进程地址空间 进程地址空间存在的意义 虚拟地址和物理地址 我们在学习C/C的时候肯定都见过下面这张有关于内存分布的图片 在来段代码理解感受下 1 #includestdio.h2 #includestdlib.h3 //未初始化常量4 int un_gval;5 //初始化常量6 int init_gval100;7 int main()8 {9 //代码区地址10 printf(code addr: %p\n,main);11 //字符常量12 const char *strhellolinux!;13 14 //常量区地址15 printf(read only char addr : %p\n,str);16 //已初始化全局数据区17 printf(init global value addr: %p\n,init_gval);18 //未初始化全局数据区19 printf(uninit global value addr: %p\n,un_gval);20 21 char *heap1(char*)malloc(100);22 char *heap2(char*)malloc(100);23 char *heap3(char*)malloc(100);24 char *heap4(char*)malloc(100);25 static int a0;26 printf(heap1 addr:%p\n,heap1); 27 printf(heap2 addr:%p\n,heap2);28 printf(heap3 addr:%p\n,heap3);29 printf(heap4 addr:%p\n,heap4);30 31 printf(stack addr:%p\n,str);32 printf(stack addr:%p\n,heap1);33 printf(stack addr:%p\n,heap2);34 printf(stack addr:%p\n,heap3);35 printf(stack addr:%p\n,heap4);36 printf(a addr:%p\n,a);37 38 return 0;39 }通过上面这段代码我们好像不仅验证了上面的空间分布图片而且还发现了栈区和堆区相向而生的内存开辟特点。 上两篇文章我们介绍了命令行参数和环境变量其实这两个就储存在栈区之上的空间来段代码验证下 1 #includestdio.h W 2 int main(int argc , char *argv[], char *env[])3 {4 int i0;5 printf(i addr:%p\n,i); 6 for(;argv[i];i)7 {8 printf(argv[%d]:%p\n,i,argv[i]);9 }10 for(i0;env[i];i)11 {12 printf(env[%d]:%p\n,i,env[i]);13 }14 return 0;15 }~验证完这些话说回来其实我们之前学的对内存的概念就上面所介绍的内容其实都不是真正意义上的内存是虚拟内存不是我们真正意义上的内存物理地址。 1 #includestdio.h2 #includeunistd.h3 #includestdlib.h 4 int g_val 100;5 6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 //child12 int cnt 5;13 while(1)14 {15 printf(child, Pid: %d, Ppid: %d, g_val: %d, g_val%p\n, getpid(), getppid(), g_val, g_val);16 sleep(1);17 if(cnt 0)18 {19 g_val200;20 printf(child change g_val: 100-200\n);21 }22 cnt--;23 }24 }25 else26 {27 //father28 while(1)29 {30 printf(father, Pid: %d, Ppid: %d, g_val: %d, g_val%p\n, getpid(), getppid(), g_val, g_val);31 sleep(1);32 }33 }34 35 sleep(100);36 return 0;37 } 我们发现父子进程输出地址是一致的但是变量内容不一样能得出如下结论: 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 但地址值是一样的说明该地址绝对不是物理地址在Linux地址下这种地址叫做 虚拟地址我们在用C/C语言所看到的地址全部都是虚拟地址物理地址用户一概看不到由OS统一管理OS必须负责将 虚拟地址 转化成 物理地址  我们再将同一个可执行程序同时运行也会发现两个进程的获取到的地址竟然也是一样的。 话又说回来我们的可执行程序运行时肯定会加载到内存中因此虚拟地址和物理地址一定有关联这个关联就是页表。 页表 页表就是将虚拟地址和物理地址联系起来的一种模型其中还包括变量是否可以被修改进程的状态等诸多信息。 上面的图就足矣说名问题同一个变量地址相同其实是虚拟地址相同内容不同其实是被映射到了不同的物理地址 每个进程的页表的物理地址存在与CPU中CR3的寄存器中 进程地址空间 进程地址空间其实我们可以使用内存大小的一个范围以我们32位总线的机器为例它的范围为0000 0000 - ffff ffff 也就是0到2^32次方我们所谓的4GB。模拟其物理空间大小进行区域划分后形成栈区、堆区等等的虚拟地址操作系统通过结构体将每个区域的起始和结束统计记录起来进程的PCB中含有指向这个结构体的指针。 因此每当新的进程创建时会形成对应的PCBPCB和PCB中的虚拟地址结构体指针和页表关联起来对真正上的物理地址进行使用。  进程地址空间存在的意义 让进程以统一的视角看待内存所以任意一个进程可以通过地址空间和页表可以将乱序的内存数据变成有序分门别类的规划好存在虚拟地址空间可以有效的进行进程访问内存的安全检查将进程管理和内存管理进行解耦通过页表让进程映射到不同的物理内存处从而实现进程的独立性。 今天对Linux下进程地址空间的介绍分享到这就结束了希望大家读完后有很大的收获也可以在评论区点评文章中的内容和分享自己的看法。您三连的支持就是我前进的动力感谢大家的支持
http://wiki.neutronadmin.com/news/217555/

相关文章:

  • 江门网站关键词推广如何建设网站的管理平台
  • 网站的速度凡科建站视频教程
  • 网站版权模板中国电力建设集团股份有限公司网站
  • 如何做网站弹窗tplink域名申请
  • 企业建站模版免费logo设计 u钙
  • 网站建设模块培训pptwordpress实现伪静态
  • 路桥做网站的公司wordpress增加自适应功能
  • 营销型网站建设需要备案吗做电影网站有什么好处
  • 现在网络公司做网站是用cms还是新版编程_wordpress能设定跳转吗
  • 吴江企业建设网站公司画册设计网站
  • 网站建设公司杭州18年如何用凡科建设手机教学网站
  • 万江区仿做网站动漫wordpress主题下载
  • 开锁在百度上做网站要钱吗wordpress优化nginx
  • 手机网站开发价格安康养老院收费价格表
  • 诸城 网站 建设WordPress怎么可以上传图片
  • 长沙网站制作推广农业银行官网
  • 网站发展历程订阅号申请
  • wordpress主题开发网站房地产公司
  • 佛山企业设计网站建设投资公司取名字大全
  • 个人网站建设论文绪论高端品牌女装模特图片
  • 网站为什么要挂服务器上开发电子商务网站和开发新闻类网站什么异同
  • 自助建站软件公司有网站模板怎么做网站
  • 建网站找哪里沈阳网站设计制作
  • 江苏齐力建设集团网站jquery 显示 wordpress
  • 外贸网站建设公司案例成都做公司网站
  • 淘宝客如何做自己的网站菜鸟必读 网站被入侵后需做的检测 1
  • 网站建设有没有资质网站开发语言比例
  • 像饿了码的网站建站有吗app图标制作软件
  • 网站海外推广方法网页游戏排行榜枪战
  • 江苏网站建设机构门户网站是不是新媒体