windows 地址空间分配
当系统创建一个进程同时为其创建它地址空间时,此地址空间中大部分都是闲置的。为了使用这部分地址空间,我们必须调用VirtualAlloc来分配其中的区域。分配区域的操作被称为预定。
当应用程序预定地址空间区域时,系统会确保预定的区域的起始地址正好是分配粒度的整数倍。分配粒度根据不同的平台而有所不同。现在所有的平台都是用相同的分配粒度。大小为64KB。
而对于预定的地址空间的大小,系统会确保区域的大小正好是系统页面大小的整数倍。X86和x64系统使用的页面大小为4KB。
如果应用程序预定一块大小为10KB的地址空间区域。那么系统会将该请求取整到页面大小的整数倍。在x86和x64系统中系统会预定一块大小为12KB的区域。
当程序不再需要访问所预定的地址空间区域时,应该释放该区域可以调用VirtualFree函数来完成。
调拨物理存储区
前面预定的地址空间仅仅是标记此块空间已有人使用,其他程序不能再次预定此块区域。为了使用所预定的地址空间区域,我们还必须分配物理存储器,并将存储器映射到所预定的区域。这个过程叫做调拨物理存储器。
可以通过调用VirtualAlloc来调拨物理存储器。物理存储器的调拨是以页面为单位来调拨的。并不需要为所有预定的区域都调拨物理空间。可以仅调拨需要使用的区域。调拨后程序就可以访问内存空间了。
当程序不需要访问所预定的区域中已调拨的物理存储器,应该释放物理存储器。这个过程被称为撤销调拨物理存储器。这是通过调用VirtualFreee函数来完成。
物理存储器和页交换文件
如今的操作系统可以对磁盘进行虚化,来扩展内存,这部分区域被称为分页文件或页交换文件,其中包含虚拟内存,可用程序使用。
内存和磁分页文件共同构成了总内存。
页交换文件增大了应用程序可用内存的总量。实际上,这时操作系统与cpu分工协作,把内存中的一部分保存到页交换文件,并在应用程序的时候再将页交换文件中的对应部分载入内存。
当应用程序调用VirtualAlloc函数来把物理存储器调拨给地址空间区域时,该空间实际上是从硬盘的页交换文件中得到的。
为了能够使用虚拟内存,当线程试图访问存储器中的一个字节中,cpu必须知道该字节是在内存中还是在磁盘上。
当线程试图访问所属进程地址空间中的一块区域时,有可能出现两种情况:
一:要访问的区域就在内存中。此时cpu会把数据的虚拟地址映射到内存的物理地址,然后访问内存。
二:不在内存中,而是位于页交换文件中。这次不成功的访问将会触发缺页中断。发生缺页中断时中断处理程序会在内存中找到一个闲置的页面,然后将数据从页交换文件复制到内存中。
当用户执行一个程序时,系统会打开应用程序对应的exe文件。计算出应用程序的代码和数据的大小。然后系统会预定一块地址空间,并注明与该区域相关联的物理存储器就是exe文件本身。系统并没有从页交换文件中分配空间,而是将exe文件作为程序预定空间的后备存储器。这样一来,程序载入很快,页交换文件也可以保持在一个合理的大小。
当一个程序位于硬盘上的文件映像作为地址空间区域对应的物理存储器时,我们称这个文件映像为内存映射文件。当载入一个dll或exe时,系统会自动预定地址空间并把文件映像映射到该区域。除此之外系统还允许我们手动将数据文件映射到地址空间。
Windows可以使用多个页交换文件。如果多个页交换文件位于不同的物理硬盘上,那么系统就可以运行得更快。我们可以在设置页交换文件大小。
windows 地址空间分配的更多相关文章
- 为什么地址空间分配粒度为64K?Why is address space allocation granularity 64K?
您可能想知道为什么VirtualAlloc在64K边界分配内存,即使页面粒度为4K. 你有Alpha AXP处理器,感谢你. 在Alpha AXP上,没有“加载32位整数”指令.要加载32位整数,实际 ...
- windows地址转发
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=192.168.8.108 connectport=8080 把 ...
- [百度空间] [转]将程序移植到64位Windows
from : http://goooder.bokee.com/2000373.html (雷立辉 整理) 简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- Windows API 之 VirtualAlloc
Reserves, commits, or changes the state of a region of pages in the virtual address space of the cal ...
- Windows Internals 笔记——线程
1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...
- 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。
windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...
- IPv6笔记-地址结构与分类
1.地址基础 IPv6地址由被划分为8个16位块的128位组成. 然后将每个块转换为由冒号符号分隔的4位十六进制数字. 2001::3238:00E1:0063:0000:0000:FEFB 每一块多 ...
- Linux 与 Linux Windows 文件共享 小知识
Linux 与 Linux Windows 文件共享 前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.1 ...
随机推荐
- 用Django Rest Framework和AngularJS开始你的项目
Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...
- PHP下的命令行执行
PHP 的命令行模式 以下是 PHP 二进制文件(即 php.exe 程序)提供的命令行模式的选项参数,您随时可以通过 PHP -h 命令来查询这些参数. Usage: php [options] [ ...
- mysql配置主从数据库
1.目的 1.1 实现数据备份 1.2 项目访问时可以实现读写分离,提高访问和操作数据的速度<读写分离好处> 2.背景 这次的主从配置主要实现主库数据的改变可以实现同步到从库中: 此次试验 ...
- django QuerySet里那些常用又不常见的技巧
QuerySet 像Entry.Objects.all(),这些操作返回的是一个QuerySet对象,这个对象比较特别,并不是执行Objects.all(),或者filter之后就会与数据库交互,具体 ...
- Spring 之 示例(Java之负基础实战)
接 Spring 之 配置 里面的代码. 现在要进行Controller的开发. 1.引用类 import org.springframework.web.servlet.mvc.Controller ...
- HTML模块化:使用HTML5 Boilerplate模板
HTML5 Boilerplate 是一个由 Paul Irish(Google Chrome 开发人员.jQuery 项目成员.Modernizr 作者.yayQuery 播客主持人)主导的“前端开 ...
- HDU-1232-畅通工程(并查集)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1232考察并查集,(最小生成树)题目很简单用k记录树根的个数,k-1就是还需要建设的路 #include& ...
- Bootstrap 输入组
Bootstrap 输入组: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...
- GreenOpenPaint的实现(一)基本框架
Win7下的MSPaint是Ribbon的典型运行.这种SDI程序对于图像处理来说是很适合的.利用春节时间,基于之前的积累,我实现GreenOpenPaint,主要就是模拟MSPaint的界面,实现出 ...