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

网站运营需要服务器吗免费咨询法律顾问

网站运营需要服务器吗,免费咨询法律顾问,齐齐哈尔市建设局网站,苏州关键词seo排名目录 1、进程地址空间示意图 2、验证进程地址空间的结构 3、验证进程地址空间是虚拟地址 4、页表-虚拟地址与物理地址 5、什么是进程地址空间 6、进程地址空间和页表的存在意义 6.1 原因一#xff08;效率性#xff09; 6.2 原因二#xff08;安全性#xff09; …目录 1、进程地址空间示意图  2、验证进程地址空间的结构 3、验证进程地址空间是虚拟地址  4、页表-虚拟地址与物理地址 5、什么是进程地址空间 6、进程地址空间和页表的存在意义 6.1 原因一效率性 6.2 原因二安全性 6.3 原因三解耦 7、页表的使用 8、页表的权限  9、页表的缺页中断  10、页表的好处  结语 前言 每一个进程都有属于自己的进程地址空间进程地址空间又叫虚拟内存、虚拟地址空间从“虚拟二字”可以判断进程地址空间并不是真实的物理空间他只是物理空间的一个映射表具体是通过页表作为媒介来建立他们之间的映射关系所以我们在程序中定义的一系列变量这些变量的地址都只是该进程的进程地址空间上的地址数并不是真实的物理地址数。 注意本文物理空间和物理内存指的是一个概念。 1、进程地址空间示意图  我们所说的代码段正文代码包括字符常量区、数据段已初始化数据区、BSS段未初始化数据区、堆区、共享区、栈区实际上都是在进程地址空间中的概念物理内存上根本不存在上面这些划分所以可以得出进程地址空间是在对物理内存进行管理。 进程地址空间一般分为两个部分用户空间、内核空间用户空间就是上面所说的堆、栈区域而内核空间拥有比用户空间更高的权限级别他主要是系统内部进行进程管理、内存管理、设备驱动、文件系统、网络系统等相关工作对外只会暴露接口给到程序员使用。进程地址空间示意图如下 2、验证进程地址空间的结构 从上图可以发现进程地址空间的地址数是从下往上增大的即在32位平台下最低处代码段的地址是0x0000 0000而最高处内核空间的地址是0xffff ffff因此可以通过代码打印在不同区域所出创建的各种变量的地址来观察他们的地址数就能验证进程地址空间的结构组织。 代码如下:  #include stdio.h #include stdlib.h #include unistd.hint g_val_1; int g_val_2 100;int main(int argc, char *argv[], char *env[]) {printf(main函数地址: %p\n, main);const char *str hello world;printf(代码段 %p\n, str);printf(数据段 %p\n, g_val_2);printf(BSS段 %p\n, g_val_1);char *mem (char*)malloc(100);char *mem1 (char*)malloc(100);char *mem2 (char*)malloc(100);printf(堆区: %p\n, mem);printf(堆区: %p\n, mem1);printf(堆区: %p\n, mem2);printf(栈区: %p\n, str);printf(栈区: %p\n, mem);static int a 0;static int a1;int b;int c;printf(数据段: %p\n, a);printf(BSS段: %p\n, a1);printf(栈区: %p\n, b);printf(栈区: %p\n, c);int i 0;for(; argv[i]; i)printf(命令行参数argv[%d]: %p\n, i, argv[i]);for(i0; i10; i)printf(环境变量env[%d]: %p\n, i, env[i]);return 0; } 运行结果 从上图的测试结果可以发现地址数的大小确实按照了进程地址空间的排布来打印但是这里有必要说明一点BSS段的地址数大部分场景下是比数据段的地址数要高的但是BSS段的变量地址不一定就比数据段的变量地址要高具体根据程序实现和操作系统加载机制有关。 3、验证进程地址空间是虚拟地址  若要验证进程地址空间里的地址数是虚拟地址则需要用fork函数创建子进程来完成具体思路定义一个全局变量g_val目的是让父子进程都能看到然后在子进程中对g_val进行修改发现父进程里看到的g_val还是原值但是父子进程看到g_val的地址却还是一样的。即现象是同一个地址下看到不同的值。  测试代码如下 #include stdio.h #include stdlib.h #include unistd.hint g_val 100;int main() {pid_t id fork();if(id 0){int cnt 3;// 子进程while(1){//观察g_val的值和地址printf(i am child, pid : %d, ppid : %d, g_val: \%d, g_val: %p\n, getpid(), getppid(), g_val, g_val);sleep(1);if(cnt) cnt--;else {g_val200;printf(子进程change g_val : 100-200\n);cnt--;}}}else{// 父进程while(1){//观察g_val的值和地址printf(i am parent, pid : %d, ppid : %d, g_val: \%d, g_val: %p\n, getpid(), getppid(), g_val, g_val);sleep(1);}}return 0; }运行结果 通过进程相关概念可以得知当父子进程修改同一份资源时会发生写时拷贝即修改资源的进程会拷贝一份资源到该进程的空间地址中进行修改这样一来修改的资源不会影响另一个进程所看到的资源保证了进程的独立性。 但是从测试结果可以发现虽然发生了写时拷贝但是他们的地址却是一样的如果进程地址空间的地址数就是真实物理内存的地址数那么这里所看到的g_val的地址肯定是不一样的因为同一个地址只能记录一个值因此可以推断进程地址空间上的地址数是虚拟的即我们平常打印出来的地址数都是虚拟的。他们和物理内存的关系图如下 4、页表-虚拟地址与物理地址 从上图可以发现虚拟地址和物理地址不一定是一一对应的即虚拟地址的具体值在物理地址上可能指向的是另一个地址那么要完成这个转换动作就必须有一个转换器这个转换器就是页表页表中记录了虚拟地址和物理地址的对应关系其实发生写时拷贝的时候虚拟地址在页表中对应的物理地址就已经是另一个地址数了只是虚拟地址不关心物理地址的变化并且程序员也无需关心因为虚拟地址到物理地址的转换是由操作系统自动完成操作系统只需要保证程序员访问虚拟地址时可以拿到正确的值即可。 页表结构图 小结每一个进程都会有一个进程地址空间的蓝图即进程的进程地址空间是独立的子进程会将父进程的PCB和进程地址空间和页表深拷贝一份给自己使用除了一些子进程自带的特性字段不拷贝比如子进程自己的pid其他的内容都会拷贝一份这也就解释了父子进程代码共享所以创建一个进程的消耗是很大的因为需要维护进程本身的结构体PCB还要维护地址空间、页表等。            有了上述的认知就能理解fork创建子进程的细节了因为fork返回值是一个写入所以会发生写时拷贝则子进程会在物理空间上开辟一块新空间存放子进程的id此时子进程的页表的物理地址会被更改但是虚拟地址不变然后父进程和子进程通过查找自己的虚拟地址映射到不同的物理地址处所以用于保存fork返回值的变量就会显示两个值。 5、什么是进程地址空间 我们知道物理内存中的地址是由32根地址总线经过不同的排列组合得来的32位平台下所以在32位平台下物理内存的大小是2^32 4GB而进程地址空间是物理内存的映射即进程地址空间也是有自己的大小但是他的大小不可能和物理内存一样大前面虽说进程地址空间的大小是4GB其实只是一个地址范围而不是真正的大小记录一个范围只需要两个int类型的变量即可例子示意图如下 所以进程地址空间的堆、栈这些部分其实只是用两个变量来维护的这样一来只需多个变量就可以描述进程地址空间的结构了所以进程地址空间本质是一个描述线性内存可视范围的结构体该结构体内的成员变量的含义就是用来划分不同的区域板块。 比如可以用以下结构体来描述进程地址空间进程PCB结构体中有一个指向地址空间的指针  每个进程的进程地址空间的范围都是一样的所以对于每个进程而言仿佛都可以申请到3G的物理内存空间但是实际上并不如此因为一个进程不可能用掉3G的物理空间当物理内存快被消耗殆尽了则系统肯定会发出警告所以进程地址空间的结构体就像是操作系统给进程画的一个大饼因为该结构体让进程以为物理空间内有很多的空间但实际上可能没剩下多少空间了但是进程只要向系统申请空间则物理空间就会分给该进程若物理空间不足则申请失败。  6、进程地址空间和页表的存在意义 6.1 原因一效率性 因为若没有进程地址空间则进程直接在物理内存上进行数据的存放此时如果进程的状态变成挂起状态为了节省物理内存则该进程原本存放在物理内存的数据可能就要被移到磁盘中下一次该进程进入内存时要重新摆放数据至物理内存中并且还要重新修改PCB的内容了太麻烦了效率又低。 有了进程地址空间后就无需关心进程在物理空间内的数据摆放的位置了因为数据在物理内存中的存放顺序我们不关心系统会帮我们建立页表和物理内存的映射关心我们只要按照页表的虚拟地址进行寻址即可所以可以把进程地址空间看成是进程和物理内存之间的桥梁、转换器。 以统一视角来看待内存做到了一致性让进程对内存的分配和控制更加方便了。  6.2 原因二安全性 进程如果直接访问物理内存会有可能更改其他用户的内容而如果进程先访问虚拟地址空间和页表若发生了修改其他用户内容的情况则虚拟地址空间和页表会直接反馈并拒绝这个动作达到保护物理内存的效果。  并且对于代码的结构也做了明确的功能划分比如代码段的数据不可更改保护了代码。 6.3 原因三解耦 将进程管理模块和内存管理模块进行了解耦具体示意图如下 7、页表的使用 从上文得知若要使用进程地址空间则在PCB结构体中的pmm指针就能找到进程地址空间但是该如何找到并使用页表呢  使用页表的示意图如下 总结而来就是进程PCB中间接的包含了找到页表的方法。  8、页表的权限  页表实际上还有一列用于显示权限示意图如下 页表会记录虚拟地址对应的物理地址是否为文字常量区若为文字常量区而进程还要修改该地址的内容则页表直接会报错并且终止这个进程这也是为什么代码段的数据不可被修改原因就是所有的访问都要通过页表这个媒介页表会判断虚拟地址然后对权限做出相关改变。 9、页表的缺页中断  当进程被挂起时就表示缺页中断该进程的代码会被从内存移至磁盘页表中还有一列是专门记录代码是否还存放在内存中因为若把进程的所有代码都从磁盘加载至内存中有些代码还没使用到就会浪费内存的资源因此进程的调度遵循着“分批加载-惰性加载” 而页表的缺页中断就是为了让cpu知道目前哪些代码已经被加载进内存中哪些代码还在磁盘上。 页表中用于记录当前是否为缺页中断的标识符示意图如下 进程的挂起实际上就是页表中断他的底层是将进程的代码都拿走放到磁盘中然后页表中的物理内存地址也清空并且把内容标志位为0这时候就是进程挂起了。挂起结束时就会根据内再将磁盘中的代码重新拿到内存中然后把内容标志位从0置为1表示缺页中断结束并且页表中的物理内存地址填上加载后新的地址这个过程虚拟地址是不需要改变的。 10、页表的好处  当把可执行程序加载到内存时可以不考虑在内存的摆放顺序因为有页表的存在我们只需要关心页表中的虚拟地址就能判断出哪些数据只能读哪些地址只能写了而且必须要用统一的视角看待内存因为只有用统一的视角看待内存才能让内存的无序摆放对于进程来说是有序的。 结语 以上就是关于进程地址空间一级页表的讲解理解进程地址空间和页表是理解进程管理的重要一环他属于进程管理中较为细节的一部分。 最后希望本文可以给你带来更多的收获如果本文对你起到了帮助希望可以动动小指头帮忙点赞关注收藏如果有遗漏或者有误的地方欢迎大家在评论区补充谢谢大家
http://www.w-s-a.com/news/863053/

相关文章:

  • 网站整体营销方案网站建设百度贴吧
  • 宣传式网站养生网站模板
  • 临猗网站建设天津做网站哪家服务好
  • 郑州做网站九零后用织梦建设网站的步骤
  • 莱芜网站优化加徽信xiala5江都网站制作
  • 网站开发工具书焦作网站开发公司电话
  • 石狮网站建设报价百度爱采购怎么优化排名
  • 广州网站开发系统如何建设百度网站
  • 免费建立一个个人网站网站流量图怎么做
  • 微信网站建设公司首选网站后台更新 前台不显示
  • 撰写网站专题活动策划方案未成年做网站
  • 免费在线响应式网站自助建站网页设计与网站建设试卷
  • 四川省肿瘤医院搜索优化整站优化
  • 新钥匙建站深圳创业补贴政策2023
  • 建网站需要准备什么网站三个月没排名
  • 网站运营规划网站推广的手段
  • cvm可以做网站服务器吗网片围栏
  • 培训前端网站开发网站开发 群
  • 成都武侯区网站建设wordpress菜单分类目录
  • 牡丹江市西安区建设局网站给公司做的东西放到自己网站上
  • 做网站的前景如何郑州seo规则
  • 学校户网站建设方案专业设计服务
  • 电子商务网站建设好么有一个网站怎么做cpc
  • 镇海住房和建设交通局网站跨境电商就是忽悠人的
  • 维修网站怎么做跨境电商发展现状如何
  • 手机网站设计公司皆选亿企邦桐乡市建设局官方网站
  • 企业培训 电子商务网站建设 图片山东省住房和城乡建设厅网站主页
  • 做酒招代理的网站赣icp南昌网站建设
  • 怎样做网站內链大连市建设工程信息网官网
  • 网站软件免费下载安装泰安网站建设收费标准