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

dedecms网站乱码建设一个游戏网站需要多少钱

dedecms网站乱码,建设一个游戏网站需要多少钱,学网站建设需要下载什么,视频分享网站怎么做的进程地址空间 这是一块虚拟地址空间的展示图 地址从下往上增长 下面时对应存放的数据 代码段: 存放可执行代码和只读常量 数据段:存放全局变量和静态变量 堆区:动态地址空间,地址一般是增长的 栈区:存放局部变量&#xff0c…

进程地址空间

这是一块虚拟地址空间的展示图

地址从下往上增长

下面时对应存放的数据

代码段: 存放可执行代码和只读常量

数据段:存放全局变量和静态变量

堆区:动态地址空间,地址一般是增长的

栈区:存放局部变量,地址一般是降低的

内核:命令行参数argv和环境变量env等

我们来用一段代码来验证图片信息是否准确

#include<stdio.h>
#include<stdlib.h>
int val=10;
int un_val;
int main(int argc,char* argv[],char*env[])
{printf("main函数地址    :%p\n",&main);printf("未初始化地址空间:%p\n",&un_val);printf("已初始化地址空间:%p\n",&val);int *heap1=(int*)malloc(sizeof(int)*1);int *heap2=(int*)malloc(sizeof(int)*1);int *heap3=(int*)malloc(sizeof(int)*1);printf("heap1堆地址空间 :%p\n",heap1);printf("heap2堆地址空间 :%p\n",heap2);printf("heap3堆地址空间 :%p\n",heap3);printf("heap1栈地址空间 :%p\n",&heap1);printf("heap2栈地址空间 :%p\n",&heap1);printf("heap3栈地址空间 :%p\n",&heap1);printf("argv[0]地址空间 :%p\n",argv[0]);printf("env[0]地址空间  :%p\n",env[0]);
}

我们先是输出了main函数的地址,函数也是有自己的地址的

然后我们输出了两个变量的地址,分别是已初始化变量和未初始化变量

我们malloc了三个堆的空间分别用指针heap1和heap2和heap3去管理

然后我们输出这三段堆空间的地址

我们在输出三个heap1和heap2和heap3的地址,虽然他们是指针,但他们也是变量

然后我们输出argv和env这种内核地址空间 

运行结果

我们可以看到,已初始化变量地址是低于未初始化变量地址的

堆的空间增长空间地址是增大的

栈的空间地址增长是减小的

argv的地址和env的第一个数据的地址是最大的

由此我们可以得出结论

OS内核>栈区>堆区>数据段>代码区

虚拟地址空间 

先看以下代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int val=10;
int un_val;
int main()
{int val=5;pid_t id=fork();if(id==0){printf("child :val:%d,&val:%p\n",val,&val);val+=5;sleep(1);printf("child :val:%d,&val:%p\n",val,&val);}else{printf("parent:val:%d,&val:%p\n",val,&val);sleep(2);printf("parent:val:%d,&val:%p\n",val,&val);}sleep(1);
}

运行结果

这里的子进程和父进程的val输出结果不同,但是父进程和子进程的输出地址居然都相同

按道理来讲,在物理地址层面相同的地址存放的数据应该不可能不相同,那么只有一个可能的结果,那么就是这个地址是一个虚拟的不存在的地址

 在语言层面接触到的地址都是虚拟地址,都不是物理地址

不管时那个语言,接触到的都是虚拟地址,不止C++/C语言


进程地址空间管理 

让我们来解释上面的情况,为什么地址相同而数据却不相同

实际上在每一块PCB,也就是进程里面都有自己的一块虚拟内存,并且进程创建时,会产生一个页表,它是一个位图表,将PCB虚拟内存地址和物理内存地址对应

大致就是如此

我们将图标简化成上面问题更好理解的图

当我们需要调用一个进程中的地址对应的数据,那么操作系统会按照这个进程的页表来去找这个数据在物理地址中的位置

 那么为什么上面父进程的数据和子进程不一样,但是地址却是一样的呢

当我们创建一个子进程时,子进程会拷贝父进程的数据,但和父进程共用同一套数据

子进程和父进程的页表和虚拟地址位置是一摸一样的,但是当子进程需要修改它的某个变量值时,子进程会重新创建一份空间

 

虚拟地址对应的物理空间发生了变化,但虚拟空间还是和父进程保持一致,

所以我们会观测到父进程和子进程的地址时一致的但是对应的变量的数据是不一样的

就是因为子进程的物理地址发生了改变,但虚拟地址没有发生改变,操作系统同过这样的方式可以极大的节省内存空间

系统层面管理 

我们之前 就看过这张图片,PCB的虚拟内存是通过一个结构体mm_struct来管理的,PCB中存储着mm_struct的指针,mm_struct通过存储数据来划分虚拟空间不同的区域

以下是mm_struct在linux中的源代码

unsigned long total_vm, locked_vm, shared_vm, exec_vm;
unsigned long stackvm, reserved_vm, def_flags, nr_ptes; 
unsigned long start_code, end_code, start_data, end_data; 
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;

其中start_code表示代码段的开始,end_code表示代码段的结束

start_data表示数据段的开始,end_data表示数据段的结束

mm_struct的结构大致如下

 其中task_struct就是进程PCB,mm_struct就是进程空间地址,page table就是页表,physical memony就是物理空间地址

 硬件层面管理

在CPU中存在一个MMU单元memony management unit内存管理单元,它可以将虚拟地址转化成物理地址

在MMU内存管理单元中,存在一个CR3寄存器,里面存放了一个页表,当MMU拿到虚拟地址后可以通过,CR3里面的页表,查询对应的映射关系从而得到物理地址

 进程地址空间的意义

 将无序的地址变为有序的地址

 物理地址在真正意义上存放数据是非常杂乱的,当我们使用页表映射来管理物理内存,就有了栈区,堆区,等,由此内存变得有序,可以更好地管理内存的空间

将进程管理和内存管理解耦

由于页表的存在,进程几乎不用关心是内存是通过上面操作管理的,而内存也不用关心进程是如何读取数据的,进程只要把自己的虚拟内存地址加载到页表中,内存只要把物理地址加载到页表中就可以时间进程和物理内存数据的对应

保护了内存安全

当我们想访问一个虚拟内存时,这个虚拟内存可能已经过界了,他并没有对应的物理内存地址那么页表就会终止用户的访问,通过这种方式来保护物理内存

确保了进程的独立性

进程都有自己独立的页表,当进程要运行时,只要操作自己进程对应的物理空间地址就可以了,可以通过自己独立的页表操作自己独立的数据 

动态内存的管理机制

当我们想系统申请一块动态内存时,我们会使用malloc或new

但是当我们申请空间的时候操作系统并不会直接给我们分配一块空间,因为操作系统不知道这块内存到底会不会得到使用,所以操作系统只会返回一个虚拟内存

那么页表当中就会有一个虚拟内存,这个虚拟内存还没有映射的物理内存只是返回了一个地址

当用户访问这个虚拟内存时,操作系统发现这个访问是合法访问,但是页表中没有对应的物理地址

那么就会发生缺页中断,操作系统会开辟一块空间与这个虚拟内存在页表中对应。此时操作系统才算真正开辟空间

好处

提高了内存的使用效率,因为只有用户要进行数据的写入时,才真正开辟一块空间

提高了new和malloc申请空间的速度,因为实际上只是返回了一个地址,并没有开辟空间


文章转载自:

http://ijddTY1d.qqhmg.cn
http://47GC2c6Y.qqhmg.cn
http://4yJ2YOj3.qqhmg.cn
http://7ZuaJpwF.qqhmg.cn
http://ThZNKLDq.qqhmg.cn
http://Y6QdpLRP.qqhmg.cn
http://rZsIU8Gv.qqhmg.cn
http://WVVOWIeH.qqhmg.cn
http://fm1eMk2Z.qqhmg.cn
http://2h6Vedgj.qqhmg.cn
http://EdbhVqgw.qqhmg.cn
http://EWOZxoEB.qqhmg.cn
http://pfgp3icL.qqhmg.cn
http://m5EavaxZ.qqhmg.cn
http://ThLfWSDg.qqhmg.cn
http://tj9wnLFP.qqhmg.cn
http://HIOieDoT.qqhmg.cn
http://dAUh4RGI.qqhmg.cn
http://8RfnRY5q.qqhmg.cn
http://cY9GFgLz.qqhmg.cn
http://JBtupAlF.qqhmg.cn
http://rRwmjSZb.qqhmg.cn
http://Xk6nne0c.qqhmg.cn
http://nC28mpt0.qqhmg.cn
http://NH0wF0aN.qqhmg.cn
http://NmhPec3s.qqhmg.cn
http://HTOwGp4x.qqhmg.cn
http://tfwv3hNu.qqhmg.cn
http://Qch7uvCh.qqhmg.cn
http://gYmUESdj.qqhmg.cn
http://www.dtcms.com/wzjs/748583.html

相关文章:

  • 怎样做原创短视频网站电商网站建设规划开发方案
  • 徐州市建设银行网站泰安钢管网站建设
  • 卫生系统网站的建设和维护怎么上网站后台
  • 棋盘网站开发百度收录提交工具
  • 电商网站建设要多少钱网页编辑软件哪个好
  • 龙岗网站建设网站制作建一个电商平台系统要多少钱
  • 网站后台html页面国家信息公示网查营业执照
  • 宁波网站建设速成seo深度优化服务
  • 南京 网站建设网站建设与运营公司主营业务收入与成本
  • 宣城公司做网站东莞市广建建设工程有限公司
  • 网站建设方案 百度文库上海建设部网站首页
  • 重庆有网站公司目前最好的免费网站
  • 上海自助建站系统小程序模板免费下载
  • 湛江网站制作计划施工企业安全管理制度
  • 浙江省网站建设与管理试卷专做商品折扣的网站
  • 网站换肤代码软件开发公司属于什么行业
  • 电子商务网站建设实训体会白银做网站的董事
  • 网站流量 转化率昆山做企业网站
  • 一般多少钱做一个网站淮南网络科技有限公司
  • 网站开发技术发展历程域名访问网站啥意思
  • 怎么做中英文双语网站企业网站制作模板免费
  • 局域网 手机网站建设网销怎么找客户
  • 中山市网站建设哪家好html樱花飘落代码
  • 网站模块设计怎么做企业手机网站建设教程
  • 怀化新站优化国家企业信用信息查询平台官网
  • 横沥仿做网站电子营销主要做什么
  • 毕业设计除了网站还可以做啥马鞍山网站seo
  • 郑州电子商务网站建设微信开放平台小程序
  • 如何做自己的播报网站郑州网站营销推广
  • 门户网站的建设思路湖南省建设银行网站6