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

东莞360推广的网站是谁做的应用市场华为

东莞360推广的网站是谁做的,应用市场华为,中国电子商务中心官网,杭州企业管理咨询有限公司虚拟内存与mmap,brk 基本概念及相关术语 1.1 基本概念 虚拟内存使得应用程序认为它拥有连续的可用的内存#xff08;一个连续完整的地址空间#xff09;#xff0c;而实际上#xff0c;它通常是被分隔成多个物理内存碎片#xff0c;还有部分暂时存储在外部磁盘存储器上一个连续完整的地址空间而实际上它通常是被分隔成多个物理内存碎片还有部分暂时存储在外部磁盘存储器上在需要时进行数据交换。即将不完整不连续的物理内存映射为连续的虚拟内存。虚拟内存主要有以下三个作用 (1) 它将主存看成是磁盘的一个高速缓存只在主存中保存活动区域(通常一个进程只有执行上下文被加载到主存其余的在磁盘中随用随加载) (2) 为每个进程提供一致的地址空间简化了内存管理 (3) 它保护每个进程的地址空间不被其他进程破坏(在页表的PTE条目中加入额外控制信息实现内存保护)。 虚拟内存有两个重要的地址虚拟地址(virtual address, VA)和物理地址(physical address)。在访问某个对象时CPU给出虚拟地址通过查询计算得到物理地址然后访问物理地址上的对象。整个过程如下图 图1 CPU访问主存1.2 相关术语 在表述虚拟内存相关概念时有些约定的缩写和表达方式 N2n虚拟地址数量,n表示虚拟地址位数 M2m物理地址数量m表示物理地址位数 P2p页大小p表示页偏移量的位数 VPO(virtual page offset)虚拟地址页偏移 VPN(virtual page number)虚拟地址页号 PPO(physical page offset)物理地址页偏移 PPN(physical page number)物理地址页号。 页表(Page Table, PT)记录虚拟地址到物理地址的映射的表 页表项(Page Table Entry, PTE)页表中一行PTE的索引即VPN 页表项地址(PTEA)在CPU中有个页表基址寄存器记录页表起始地址页表基址寄存器PTE索引PTEA MMU(Memory Management Unit)内存管理单元用于虚拟地址到物理地址寻址的硬件。 一个页表的常见结构如下图 图2 页表常见结构(有效位表示该PTE是否有VP到PP的映射)eg: 给定一个32位虚拟地址空间和一个24位物理地址空间对于下面的页大小确定VPN,VPO,PPN,PPO的位数。 P VPN位数 VPO位数 PPN位数 PPO位数 1KB 22 10 14 10 4KB 20 12 12 12 注VPO表示对象在页中的偏移VPOPPO,VPO位数log2§VPN表示虚拟页号对应PTE表索引PPN表示物理页号。 一个虚拟地址翻译成物理地址方法如下图 图3 虚拟地址翻译为物理地址地址翻译时给定虚拟地址低p位表示页偏移其中VPOPPO高n-p位表示虚拟页号即PTE的索引号找到对应PTE记录得到物理页号PPN跟PPO组合得到物理地址。所以访问一个对象首先访问页表从虚拟地址转化为物理地址再从访问物理地址得到对象。由于页表和物理地址都在内存中因此存在两次内存访问。 1.3 地址翻译加速 从1.2中得知为了访问对象需要两次内存访问每次内存访问一般几十到几百个周期为了加快地址翻译减少内存访问次数有两种辅助设备SRAM缓存和TLB缓存。 SRAM缓存在CPU和主存(DRAM)之间还有L1, L2, L3三级高速缓存(SRAM)。因此可以将部分PTE条目和对象存到SRAM中减少内存访问次数添加了SRAM的访问机制如下图。 图4 加入SRAM的对象访问过程可见在访问时优先访问SRAM获取PTE和数据没有再访问主存还没有则引起缺页中断。SRAM的访问通常几个时间周期。 TLB缓存在MMU中的虚拟地址缓存器称为翻译后备寄存器(Translantion Lookaside Buffer)。每一行由一个或多个PTE条目组成其中TLBI用于行号索引TLBT用于同一行某个PTE的选择。 图5 虚拟地址在TLB中的含义比如某一时刻TLB中的快照如下 图6 TLB快照四组四路组相联 页面大小64字节虚拟地址长度14位物理地址长度为12位。给定虚拟地址0x03d4,其二进制表示为0b 00 0011 1101 0100,低6位0b 01 0100为VPO,因为四路组相联所以第6-7位为TLBI(TLB索引)为0b 11,剩余为TLBT(TLB标记)TLBI表示TLB表的行号找到TLBT为0x03的位置得到PPN为0D。结合VPO得到物理地址为0b 0011 0101 0100,即0x0354。加入TLB之后的对象访问过程如下 图7 加入TLB的对象访问过程Linux虚拟内存 2.1 Linux虚拟内存组织机制 Linux系统为每个进程维护一个单独的地址空间如图8(a)所示同时为每个进程维护一个结构体其中包含虚拟内存相关信息如图8(b)所示。 (a) Linux进程的虚拟内存 b管理虚拟内存的结构体 图8 Linux虚拟内存其中vm_prot描述虚拟内存页的读写权限vm_flags记录该虚拟页是共享还是私有等其他常见信息。 2.2 内存映射 Linux系统将虚拟内存和一个磁盘对象关联起来以初始化虚拟内存区域的内容称为内存映射。有两种类型的内存映射 (1) 映射到Linux文件系统中的普通文件 (2) 映射到匿名文件匿名文件是由内核创建的全是二进制0的文件CPU第一次使用该虚拟页面时内核就选择一个物理页面进行覆盖(整个过程没有跟磁盘发生数据交互)。 一个对象映射到虚拟内存中要么以共享对象存在要么以私有对象存在。不论哪一种模式在物理内存中只有一份副本。共享对象一个进程的写操作其他进程都可见并且能反映到磁盘上私有对象一个进程的写操作其他进程不可见并且不能反映到磁盘上。 (a) 内存映射到共享区域 (b) 内存映射到私有区域图9 多个进程映射同一对象对于多个进程内存映射到私有区域时物理内存只有一份副本此时采用一种写时复制策略。即进程在写时复制修改的部分到内存其他区域。这样对其他进程来说对象没有修改过。 2.3 mmap函数 mmap函数提供用户级的内存映射该函数能够把某个磁盘文件映射到内存中函数的主要格式如下 复制代码 void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset); start内存起始地址通常为NULL,让系统自己选择 length内存的长度 prot PROT_READ数据可读 PROT_WRITE数据可写 PROT_EXEC数据可执行 PROT_NONE数据不可访问 flags: MAP_SHARED共享对象进程间可察觉修改并能反映到磁盘 MAP_PRIVATE私有对象一切操作只在本进程可见修改不会写入磁盘 MAP_FIXED基本不用 fd映射的文件的描述符通常应先打开文件再调用mmap此后关闭文件映射仍然存在 offset文件偏移量一般为0 该函数返回内存中对应的地址 复制代码 调用mmap之后内存与磁盘文件之间就建立了映射关系如下图所示 munmap用于解除映射关系 int munmap(void* start,size_t length); 使用mmap的作用主要有以下两个 (1) 将磁盘文件映射到内存中这样所有读写均针对内存读写(可以使用memcpy等内存操作函数而不是read,write等IO操作函数)加快访问速度 (2) 在无亲缘关系的进程间提供共享内存。 使用mmap函数需要注意以下问题 (1) 在文件映射之前必须打开该文件而且mmap的prot权限不能超过打开的权限。比如open打开时只设置了读文件那么prot就不能设置PROT_WRITE (2) 内存映射通常都是按虚拟内存的页为基本单位的。比如一个页512字节但是映射的文件只有12字节。那么剩下的500字节会自动填充为零即时修改了后面的500字节也不会写入到文件所以较好的操作是直到文件大小直接加长文件 (3) 如果试图访问不存在的映射关系比如页面大小512字节实际文件大小为12字节用mmap映射的时候映射1000个字节那么实际可操作的结果如下 (4) 将内存写入磁盘的操作通常由页守护进程完成如果想人为控制将内存数据写入磁盘可以调用以下函数 复制代码 #include sys/mman.h int msync(void *addr,size_t len,int flags); flags: MS_ASYC异步写入 MS_SYC同步写入等待写入之后才会返回 复制代码 (5) 进程终止或调用munmap时解除映射关系关闭文件描述符不会解除映射关系。 下面举一个简单的例子父子进程同时修改一个文件写入数据 复制代码 1 #include sys/mman.h 2 #include stdio.h 3 #include fcntl.h 4 #include unistd.h 5 #include sys/wait.h 6 #include sys/types.h 7 #include stdlib.h 8 #include string.h 9 10 #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH) 11 12 int main() 13 { 14 int fd; 15 if((fdopen(“map.txt”,O_RDWR|O_CREAT|O_TRUNC,FILE_MODE))0) 16 { 17 printf(“open file failed\n”); 18 exit(1); 19 } 20 21 22 if(ftruncate(fd,50)0) //文件大小50字节 23 { 24 printf(“ftruncate error\n”); 25 exit(1); 26 } 27 28 char buf;//起始地址 29 30 buf(char)mmap(NULL,50,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); 31 close(fd); 32 pid_t pid; 33 if((pidfork())0) 34 printf(“fork error\n”); 35 36 char* msg“hello world\n”; 37 char* msg1 “good news”; 38 if(pid0) //子进程 39 { 40 memcpy(buf,msg,strlen(msg)); 41 exit(0); 42 } 43 else 44 { 45 int stat; 46 wait(stat); 47 memcpy(bufstrlen(msg),msg1,strlen(msg1)); 48 } 49 return 0; 50 51 } 复制代码 第22-26行就是申请文件大小为50字节那么实际内存可修改的部分就是buf~(buf49)。注释该段再执行就会报SIGBUS错误。 执行结果是当前目录多了map.txt,其内容为 hello world good news 2.4 Linux进程分配内存的方式 关于此部分详细介绍参考博文https://www.cnblogs.com/vinozly/p/5489138.html 简单来说当我们调用分配内存的函数时(如malloc)底层通过调用brk()或mmap()实现。当遇到小于128KB的内存时调用brk()函数将数据段堆的_edata地址往高地址推(即图8a中brk指向的指针此时只分配虚拟内存没有物理内存。当产生缺页中断时才调用物理内存)。当申请内存大于128KB时调用mmap()在堆栈之间的共享区域分配内存(此部分内存可以单独释放)。 标签: 虚拟内存 , 计算机基础 , 操作系统 , mmap 好文要顶 关注我 收藏该文 微信分享 晨枫1 粉丝 - 2 关注 - 0 加关注 00 升级成为会员 « 上一篇 QT下多线程调用TCP的问题及可能的解决方案 » 下一篇 epollselectpoll的区别 posted 2020-05-18 12:17 晨枫1 阅读(1291) 评论(0) 编辑 收藏 举报
http://www.pierceye.com/news/395566/

相关文章:

  • 怎么写公司网站的文案建设网站技术公司简介
  • 陕西做网站的wordpress增加变量
  • 莒南县建设工程网站网站认证方式有几种
  • 举报网站建设自查报告相同网站名
  • 网站建设网站建设公司北京logo设计制作
  • 福州市交通建设集团有限公司 网站全国国家公示系统官网
  • 郑州网站建设蝶动2023年专升本最新政策
  • 江苏网站推广网络企业宣传画册设计公司
  • 沈阳设计网站公司哪家好个人养老保险怎么交费
  • 烟台seo网站推广如何给自己公司设计logo
  • wordpress 图片大小设置梧州网站优化公司
  • 360推广 网站建设豫建设标去哪个网站
  • 职高网站建设知识点国家免费技能培训有哪些
  • 哪个网站有帮忙做公开课课件怎么查那些人输入做网站
  • 怎么做qq钓鱼网站吗有哪些站内推广的方式
  • wap手机网站建设校园论坛网站怎么做
  • 北京专业网站的建设滨州做网站的
  • 网站点击排名wordpress 联系我们
  • 上街免费网站建设seo外包公司优化
  • 营销型网站的三大特点安徽网站设计方案
  • 优化网站推广教程排名做微信公众号页面的网站
  • 龙岗网站设计效果台州百度关键词排名
  • 政务类网站建设ps做全屏网站画布要多大
  • 百度广告搜索推广seo如何快速排名百度首页
  • 网站调用微信数据网站开发语言windows
  • 网站建设的公青岛专业网站制作设计
  • 东莞营销型网站学动漫设计有前途吗
  • 资讯网站wordpress实例配置
  • 营销网站建设哪里便宜最新房地产新闻
  • 有自己的网站怎么做淘宝客wordpress不自动安装