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

个人响应式网站宠物店做网站的论文

个人响应式网站,宠物店做网站的论文,dede网站后缀乱码,wordpress注册邀请码背景 kernel 2.6.32 32位平台 空间布局图 如何理解地址划分 地址划分#xff0c;本质是调整地址空间的定义start和end#xff0c;内存中定义了管理每个区域范围的结构体#xff0c;叫mm_struct#xff0c;每个进程都有一个这个结构体指针变量 验证上面划分的结构#…背景 kernel 2.6.32 32位平台 空间布局图 如何理解地址划分 地址划分本质是调整地址空间的定义start和end内存中定义了管理每个区域范围的结构体叫mm_struct每个进程都有一个这个结构体指针变量 验证上面划分的结构写一段各个属性变量的代码来验证地址 #include stdio.h #include unistd.h #include stdlib.hint g_unval; int g_val 100;int main(int argc, char *argv[], char *env[]) {// int a 10;//字面常量const char *str helloworld;// 10;// a;//main函数地址printf(code addr: %p\n, main);printf(init global addr: %p\n, g_val);printf(uninit global addr: %p\n, g_unval);static int test 10;char *heap_mem (char*)malloc(10);char *heap_mem1 (char*)malloc(10);char *heap_mem2 (char*)malloc(10);char *heap_mem3 (char*)malloc(10);printf(heap addr: %p\n, heap_mem); //heap_mem(0), heap_mem(1)printf(heap addr: %p\n, heap_mem1); //heap_mem(0), heap_mem(1)printf(heap addr: %p\n, heap_mem2); //heap_mem(0), heap_mem(1)printf(heap addr: %p\n, heap_mem3); //heap_mem(0), heap_mem(1)printf(test stack addr: %p\n, test); //heap_mem(0), heap_mem(1)printf(stack addr: %p\n, heap_mem); //heap_mem(0), heap_mem(1)printf(stack addr: %p\n, heap_mem1); //heap_mem(0), heap_mem(1)printf(stack addr: %p\n, heap_mem2); //heap_mem(0), heap_mem(1)printf(stack addr: %p\n, heap_mem3); //heap_mem(0), heap_mem(1)printf(read only string addr: %p\n, str);for(int i 0 ;i argc; i){printf(argv[%d]: %p\n, i, argv[i]);}for(int i 0; env[i]; i){printf(env[%d]: %p\n, i, env[i]);}return 0; } 首先是代码地址在最小的位置。最往上是字符常量区然后是数据区static也在数据区本质是将局部的变量开辟在全局区域。堆区后面是栈区中间空了很大一部分的共享区。两个箭头表示堆的变量是往上增长地址越来越大栈则是越来越小栈上面有命令行参数在之后是环境变量的地址最后是内核空间1G 在32位系统下一个进程的地址空间取值范围是0x00000000 - 0xffffffff 用户空间【0,3GB】 内核空间【3,4GB】 地址空间是操作系统专门为进程设计的内核数据结构包含了各个区域的划分起始和结束还有更多属性 所以创建一个进程操作系统先创建PCB结构再创建地址空间用地址空间指针指向进程的地址空间对象就可以找到地址空间和对应的页表 每一个进程都有一份地址空间 虚拟内存 #include stdio.h #include unistd.h #include stdlib.h int g_val 0; int main() {pid_t id fork();if(id 0){perror(fork);return 0;}else if(id 0){ //child,子进程肯定先跑完也就是子进程先修改完成之后父进程再读取g_val100;printf(child[%d]: %d : %p\n, getpid(), g_val, g_val);}else{ //parentsleep(3);printf(parent[%d]: %d : %p\n, getpid(), g_val, g_val);}sleep(1);return 0; } //与环境相关观察现象即可 child[3046]: 100 : 0x80497e8 pa上面的代码运行后子进程修改了全局变量的值结果同一个变量产生了两个不同的值且他们的地址是一样的这是为什么 变量内容不一样但地址一样所以这个地址肯定不是真正的物理地址 需要说明一下地址空间的设计 由于直接访问物理内存是不安全的如果进程都直接访问物理内存那么很容易一个进程用指针修改另一个进程的值不遵守进程的独立性。所以引入了虚拟内存的概念进程直接访问虚拟内存虚拟内存就是上面的0x0-0xffffffff的内存布局每个进程都划分了这么大的空间实际上每个进程这些空间只是物理内存的一部分 那么一个虚拟内存地址如何转化为对应的物理内存地址物理内存和虚拟内存中间有一个页表的结构里面记录了地址的对应关系。地址空间和页表用户级每个进程都有一份只要保证每一个进程的页表映射的物理内存的不同区域这样进程之间就不会互相干扰保证了独立性 分页和虚拟地址空间 这时就可以解释上面为什么同一个变量会有两个不同的值fork产生子进程后子进程的变量分页结构等很多都是基于父进程的拷贝共享一段内存。当父子进程对某个值写入时会为子进程单独拷贝这个变量的一个区域映射和父进程不同的物理内存位置。所以虽然都是同一个变量的虚拟内存地址但在物理内存处是两块不同的区域这个过程就叫写时拷贝 fork为什么会有两个返回值 前面说过是因为return执行了两次return的本质就是对id变量进行写入发生了写时拷贝父子进程在物理内存中都有属于自己的地址空间只不过用同一个虚拟地址来标识了 虚拟内存的产生 在没有虚拟内存的时候进程是直接加载到物理内存上通过进程的起始和边界控制是不是自己的部分。这样可以通过指针访问到另一个进程的数据如果一个进程有问题越界也可能会导致另一个程序崩溃 所以引入了虚拟内存的概念虚拟内存通过页表映射到物理内存中虚拟内存作为中间者如果转换后是非法的要么转换后是非法的要么越界要么没有权限就会禁止访问解决了安全性的问题 当我们程序还没有运行编译形成可执行程序的时候就已经有了地址。地址空间不仅仅是OS内部遵守的编译器也要遵守。即编译器编代码的时候就已经形成了各个代码区数据区并且采用和linux内核中一样的编址方式给每一个变量代码都编址所以程序编译的时候每一个字段早已经有了一个虚拟地址每一个变量每一个函数编译器给的都有地址 同样也一定被加载到了物理内存 有两套地址一套是程序内部使用的一套是加载到内存分页的物理内存地址。用代码和函数的地址作为页表的左值得到对应的物理地址右值 cpu读到的是物理地址还是虚拟地址 cpu读到的也是虚拟地址通过页表转换为物理地址操作 为什么要有地址空间 1.凡是非法的访问或者映射操作系统都会识别到并终止这个进程。这样有效的保护了物理内存地址空间和页表是OS创建的凡是使用地址空间和页表进行映射都在OS的监管之下保护了所有的合法数据和进程有效数据 所有的进程崩溃,就是进程退出,系统杀掉了这个进程 2.因为有地址空间的存在页表映射的存在代码和数据就可以加载到任意位置。内存管理和进程管理完成了解耦合 new和malloc空间的时候本质是在虚拟内存申请的使用了延迟分配的策略提高效率。 如果申请了物理空间如果不立马使用造成了空间浪费。所以申请一段空间的时候物理内存可以一个字节都不给只有在真正对这个空间访问的时候才执行相关内存的管理算法申请内存构建映射关系内存的访问由操作系统自动完成用户和进程0感知。操作系统如何知道虚拟内存分配的空间需要被访问而未被加载物理内存用了缺页中断技术。这样就不会存在申请了但不用的空间 3.物理内存理论上可以任意位置加载会造成数据和代码乱序。但是因为有页表的存在可以将内存分布有序化。进程的代码和数据如果已经运行完了可以去除映射关系也删掉但不影响后面的代码运行。不同的进程映射到不同的物理内存很容易做到独立性的实现。 因为有地址空间的存在每一个进程都认为自己拥有4GB空间32并且各个区域有序的进而可以通过页表映射到不同的区域来实现进程的独立性。每个进程不需要知道其他进程的存在 重新理解挂起 加载程序是创建进程并不需要立马把所有程序的代码和数据加载到内存中创建映射关系。极端情况下只有内核数据结构被加载到内存中当真正执行这段代码和数据的时候才创建物理内存这样就可以实现分批加载和分批换出。比如100G的游戏怎么运行,只加载需要运行的进程,分批换出。 挂起的时候页表不仅仅只能映射物理内存还可以映射磁盘只需要填入映射到磁盘中代码数据的位置将物理内存中的位置释放。就可以把程序挂起不用交换到磁盘上
http://www.pierceye.com/news/785581/

相关文章:

  • 服装网站建设策划书3000字软件开发包含网站开发吗
  • 免费网站的建设绵阳网站建设制作
  • 学生处网站建设招标公告网站包括哪些主要内容
  • 成都门户网站建设多少钱聚合广告联盟
  • 坦克大战网站开发课程设计报告软文营销的本质
  • 美食网站开发网站登录验证码是怎么做的
  • 电子商务网站排名辽宁省建设工程信息网业绩公示
  • 天津建设科技杂志的官方网站wordpress cnzz插件
  • 滨州建设网站太原网站建设优化
  • 记事本做网站怎么改字体包装设计模板设计素材
  • 下载软件的网站推荐thinkphp和wordpress
  • 青海省城乡和住房建设厅网站合肥小吃培训网页设计
  • 财经门户网站建设django校园网站开发
  • 泉州网站建设报价广东建设厅网站
  • 建设网站的源代码的所有权wordpress网站打开慢
  • 印度外贸网站有哪些家居小程序源码下载
  • 上海网站建设中心pc官方网站
  • 深圳企业网站制作公司查询西安网站设计哪家好
  • 大埔做网站手机qq邮箱发布了wordpress
  • 寻找南昌网站设计单位网站建设 中企动力医院
  • 中间商可以做网站吗平面广告设计师的工作内容
  • 网站建设用户分析做网站有什么软件
  • 洛阳网站建设启辰网络wordpress怎么破解查看
  • 长沙市网站设计公司厦门建设网站建站
  • 网站做链轮会被惩罚吗网站开发系统
  • 一般做企业网站需要什么资料WordPress情侣博客模板
  • 网站开发教程公司哪些官网用wordpress
  • redis网站开发教程创建app软件
  • 企业网站新闻wp怎么做合肥环保公司网站建设
  • 怎么仿一个复杂的网站wordpress描述怎么改