物理内存(共10篇)
物理内存 篇1
0 引 言
计算机取证研究的重点在于如何从被入侵计算机系统的硬盘等永久性存储介质上提取犯罪证据,而对计算机取证中的物理内存取证分析方法的研究则相对较少,起步也较晚。国外对该领域的研究工作从2005年才开始[1,17],而国内迄今为止公开发表的有关物理内存取证分析方法的研究论文则少之又少[18,19]。由于有相当一部分的计算机犯罪证据无法从计算机系统的硬盘等永久性存储介质上提取,必须从计算机系统的物理内存中获取,包括入侵者的IP地址、正在运行的恶意进程信息、蠕虫、木马程序等等,而且一旦关机,这些信息将全部丢失。因此研究计算机取证中的物理内存取证分析方法对于推动计算机取证技术的发展、有效打击计算机犯罪具有非常重要的现实意义。
本文在介绍物理内存取证分析的基本概念及相关研究现状的基础上,重点研究了Windows 系统物理内存取证分析的关键技术,并给出了具体的分析实例,最后指出了目前物理内存取证分析技术存在的问题以及进一步的工作。
1 相关研究工作现状
2005年夏季,数字取证研究工作组DFRWS(Digital Forensic Research Workshop)发起了一次“内存分析挑战赛”,其目的在于鼓励内存取证分析技术的研究和相关工具的开发。DFRWS网站(www.dfrws.org)上提供了两个物理内存镜像文件(dfrws2005-physical-memory1.dmp和dfrws2005-physical-memory2.dmp,这两个镜像文件是用自启动取证工具Helix[2]从一台被入侵的Windows2000系统中获取的),参加挑战赛的选手要根据DFRWS提供的案件背景资料[3],通过分析这两个内存镜像文件来回答一些问题[3]。
最后,Chris Betz、George M.Garner和Robert-Jan Mora组合共同赢得了比赛,他们提供的分析报告[3]反映出他们对内存取证技术的研究取得了令人满意的结果,并且他们还开发了与之相适应的取证工具memparser[4]和kntlist。
这次挑战赛之后,其他一些研究人员沿着他们的思路,继续研究和工具开发工作。Andreas Schuster[5]在他的英文Blog中公开了他的一部分研究成果和实现的工具,同时公布的还有不同Windows版本中EPROCESS和ETHREAD结构的格式。Joe Stewart则在TRUMAN Project[6]中提供了一个名为pmodump.pl的Perl脚本工具,该工具可以从物理内存镜像中提取指定进程所使用的内存,这对恶意软件分析非常有用。2006年秋,Mariusz Burdach 在BlackHat[7]大会上提供了一些关于内存取证方面的信息。2006年夏,Nebraska大学的研究员Tim Vidas[8]发布了一个名为pro-cloc.pl的Perl脚本,该脚本可以从内存镜像或者崩溃转储文件中提取运行的进程列表。
2008年,数字取证研究工作组又组织了一次“Linux内存分析挑战赛”[9],其目的是推动Linux内存分析技术的发展,结果有五组参赛人员提交了最终的分析报告,取得了令人满意的结果[10]。
国内研制成功的物理内存取证分析工具主要有上海盘石数码信息技术有限公司研制的“盘石计算机现场取证系统”和山东省科学院计算中心研制的“计算机在线取证系统”等产品,但这些产品的具体技术细节都没有公开发布。
2Windows系统物理内存取证分析的关键技术
Windows系统物理内存取证分析的关键技术主要包括两个方面:一是如何获取物理内存,生成物理内存镜像文件;二是如何对物理内存镜像文件进行分析,从中找出重要的入侵证据。
2.1 如何获取物理内存
目前获取物理内存的方法主要有以下二种:
2.1.1 基于硬件的方法[1,17]
(1) 使用Tribble设备
2004年2月,《数字调查杂志》上刊登了Grand Idea Studio公司的研究人员Brian Carrier和Joe Grand的一篇研究文章,题目是“数字调查中基于硬件的内存获取过程(A Hardware-Based memory Acquisition Procedure for Digital Investigation,Journal of Digital Investigations,March 2004)”。在这篇文章中,Brian Carrier和Joe Grand提出了一种用名为“Tribble”的硬件扩展卡来获取系统物理内存的方法,可以用Tribble将系统的物理内存复制到外接存储设备中。这样调查人员就可以在既不引入任何新代码(不会更改系统内存)又不使用系统中代码(系统中的代码可能存在rootkit)的情况下完成系统物理内存的获取工作。作者构建了一个原理性(proof-of-concept)的Tribble设备,设计了一个可以插入到系统总线的PCI扩展卡。另外还设计了一些能获取系统物理内存的设备,主要用于系统硬件调试,也可以用于取证调查。
使用Tribble这类硬件设备的优点在于操作方便、易于理解。使用这种方法获取物理内存镜像不需要引入额外的代码,减少了获取的内容被篡改、覆盖的可能性;最大缺点在于硬件必须事先安装到系统中,所以Tribble设备还不能被广泛使用。
(2) 使用FireWire设备
FireWire(中文直译为“火线”)是以原苹果公司开发的技术为基础发展而来的一种高速I/O技术,它可连接外围设备与计算机。该技术于1995年被正式接纳为 IEEE 1394工业标准(FireWire 400)。凭借其强大的传输性能:可传输音频、视频、时间码,甚至是可用来控制机器的特性,FireWire现已成为数字音视频设备、外部硬件及其他高速外设产品的理想接口,其最高传输速度可达到400MB/S。
利用FireWire设备的特殊性能,使用相应的软件,调查人员可以获取系统的物理内存镜像。FireWire设备使用直接存储器访问(DMA)技术,可以不通过CPU直接访问系统内存。
使用FireWire设备的优点是现在许多计算机系统的主板上都集成了FireWire/IEEE1394接口,可以方便地直接访问系统内存;缺点是通过火线接口制作物理内存镜像可能会导致系统死机或者丢失部分内存中的信息。
2.1.2 基于软件的方法[1,11,17,18]
(1) 使用Microsoft崩溃转储技术
Windows NT、2000和XP都提供一种内置的“崩溃转储”功能来获取系统的物理内存镜像。在生成崩溃转储时,系统会被冻结,物理内存中的数据(加上大约4KB的头部信息)会被写入磁盘,这样就完整地保存了系统状态,并且保证从开始进行崩溃转储之时起,系统状态不会被人为地修改。
(2) 使用虚拟机技术
VMWare是一款非常流行的虚拟机软件,使用它可以在一台计算机硬件上创建多台虚拟计算机。当运行VMWare会话时,可以挂起(suspend)这个会话,也就是暂时“冻结”系统。当一个VMWare会话被挂起时,VMWare会将系统的“物理内存”镜像以DD格式存放到一个扩展名为.vmem的文件中。使用这种方法的优点是挂起一个VMWare会话的操作非常简单快捷,而且对系统内存的影响最小。
(3) 使用专用软件
目前用于物理内存转储的专用软件有许多种,这里主要介绍几种较常见的软件。
1) DD UNIX系统中数据转储工具DD的用途广泛,可以复制文件,也可以制作整个硬盘的镜像。GMG System公司发布了一个可以免费下载的取证获取工具包[12],其中包含可用于Windows系统的改进版DD工具(该工具支持Windows 2000和Windows XP SP1,不支持Windows XP SP2、Windows Vista和Windows Server 2003 SP1等系统)。在用户模式下访问DevicePhysicalMemory对象,该工具可以获取Windows系统的物理内存。运行下面的命令可以将本地系统的物理内存镜像到ram.img文件:
dd if=。PhysicalMemory of=ram.img bs=4096 conv=noerror
2) KntDD 由于DD不支持Windows XP SP2、Windows Vista和Windows Server 2003 SP1等系统,因此,GMG System公司又开发了一个称为KntDD的新工具用于生成物理内存镜像。KntDD包含在KntTools工具包中(http://www.gmgsystemsinc.com/knttools/),KntTools仅授权司法工作人员和安全专业人士使用。
3) Nigilant32 Nigilant32(www.agilerm.net/publications_4.html)是一个由Agile Risk Management开发的取证工具,具有浏览硬盘内容、获取物理内存镜像、获取当前正在运行的进程和打开的端口的“快照”等功能。当Nigilant32装入内存时,仅占用小于1MB的内存空间,因此对物理内存的影响非常小。目前Nigilant32仍处于测试状态,但用户可以免费下载使用。
4) Helix Helix是一个可由CDROM直接启动的功能强大的计算机取证工具,首发于2003年,目前世界著名的计算机取证机构SANS将Helix作为取证培训工具。Helix可在因特网上免费下载,下载网址是http://www.e-fense.com/helix/,下载下来的是一个ISO镜像文件,将其刻录到光盘上即可。Helix实际上是一个重新修改过的Knoppix(Knoppix是一个Linux 发行版本,网址:http://www.knopper.net/Knoppix/index-en.html)系统,其中增加了有关应急响应和计算机取证的内容。
2.2 如何分析物理内存
成功获取物理内存以后,接下来的工作就是要对镜像文件进行分析,从中提取有用的入侵证据。一般来说,我们可以从镜像文件中提取以下信息[13](这些信息是指在生成镜像文件那个时刻的信息):
(1) 所有正在内存中运行的进程;
(2) 所有的载入模块和DLL(动态链接库),包括被植入的各种恶意程序;
(3) 所有正在运行的设备驱动程序,包括隐藏的rootkits;
(4) 每个进程打开的所有文件;
(5) 每个进程打开的所有注册表的键值;
(6) 每个进程打开的所有网络套接字(sockets),包括IP地址和端口信息;
(7) 用户名和口令;
(8) 正在使用的email和web地址;
(9) 正在编辑的文件内容。
在拿到系统的物理内存镜像之后,该如何着手进行分析呢 2005年夏季之前,调查人员在获取内存镜像之后,标准处理流程是使用strings.exe[14]提取字符串或使用grep工具进行搜索,目的是得到email地址、IP地址等信息,或者是两种方法同时使用。虽然使用这种方法确实能得到一些信息(例如,用户名“附近”保存的类似口令的字符串),但是这种方法不能提供信息的上下文环境。例如,字符串是从哪里来的?哪个进程在使用这个字符串?
2005年的DFRWS内存分析挑战赛带动了对内存信息的进一步研究和分析。通过定位特定进程(或内存中的其他对象)及进程使用的内存,调查人员可以更深入地理解其中的信息,并且在分析时可以忽略正常进程,集中精力分析“不常见的”进程和数据。因此,目前物理内存取证分析的重点在于分析内存中的进程及进程所使用的内存,并从中找出有用的入侵证据。
2.2.1 Windows系统进程基础[1,17]
在Windows系统中,每个进程都用一个EProcess(Executive Process)结构来表示[11],它包含进程的多个属性以及指向进程相关的其他属性和数据结构的指针。由于数据结构就是字节序列,序列中有特殊的含义和目的,所以需要调查人员对其进行分析。在对EProcess结构进行分析时必须注意:对于不同版本的Windows操作系统来说,EProcess的大小和结构可能是不同的。甚至对于同一个版本的Windows操作系统来说,如果SP补丁包版本不同,EProcess的大小和结构也有可能不同。
EProcess结构中最重要的一个成员是指向进程环境块(PEB)的指针。进程环境块中包含大量的信息,对取证比较重要的信息有:
(1) 指向PPEB_LDR_DATA结构(其中存放的是进程的加载器使用的数据)的指针,PPEB_LDR_DATA结构中包含进程中使用的动态链接库的指针。
(2) 指向可执行文件镜像加载基地址(ImageBaseAddress,在PEB偏移0x008处)的指针,通过这个指针可以找到内存中可执行文件的起始位置。
(3) 指向包含进程参数结构(ProcessParameters,在PEB偏移0x010处)的指针,该结构包含进程中加载的动态链接库的路径、可执行文件镜像的原始路径以及创建进程时传递进来的参数等信息。
如果能从物理内存镜像中提取这些信息,对于案件的侦查是很有帮助的。
2.2.2 分析实例
2006年,Harlan Carvey编写了几个用于辅助分析Windows系统物理内存镜像的工具。由于当时可用的镜像是DFRWS2005内存分析挑战赛提供的Windows2000系统,因此这几个工具都是针对Windows2000系统的。Harlan Carvey编写的这几个工具都是Perl命令行脚本,分别是lsproc.pl、lspd.pl、lspm.pl和lspi.pl。在参考文献[17]的配套光盘中提供了与这几个Perl命令行脚本对应的可执行文件lsproc.exe、lspd.exe、lspm.exe和lspi.exe,同时还提供了实验用的物理内存镜像文件win2000.vmem。
(1) 用lsproc列出镜像中所有的进程
Lsproc是列举进程(List Process)的缩写,该脚本的作用是列出镜像中所有的进程。运行lsproc只需一个参数,即物理内存镜像文件的路径:
D:ch3code>lsproc win2000.vmem(该命令运行时间较长,约需10分钟左右)
(2) 用lspd列出指定进程的详细信息
Lspd可以列出进程更详细的信息。Lspd依赖lsproc的输出以获取信息。运行lspd时需要二个参数:镜像文件的路径名和lsproc输出的需要分析的进程偏移量:
(3) 用lspm获取指定进程的内存数据
Lspm.pl工具可以自动提取进程所使用的内存数据,并将其写到当前目录的一个文件中。
(4) 用lspi提取指定进程的可执行文件镜像
当进程开始启动的时候,对应的可执行文件会被读入内存。Lspi.pl是一个Perl脚本,它可以定位进程可执行文件的起始地址,如果该地址指向一个有效的可执行文件,Lspi.pl就会根据PE头部数据结构中的内容定位内存中的数据并重组可执行文件内容。
3 存在问题及进一步的工作
物理内存取证分析技术是一个全新的研究领域,该研究起步较晚。尽管目前研究有一定的进展,也有一定的成果,但总的来说还不够成熟,还存在许多问题,具体表现在:
(1) 缺乏可靠、实用的获取物理内存的硬件设备。用硬件方法获取系统的物理内存是比较理想的方案,因为这种方法对系统的物理内存几乎没有影响,不会破坏或者覆盖物理内存的内容,可以得到非常完整的物理内存。目前几种获取物理内存的硬件设备如Tribble和FireWire等还有很多不完善的地址,还需要进一步改进。
(2) 目前获取系统物理内存的软件工具较多,但用这些工具获取物理内存不可避免地会破坏甚至覆盖物理内存的内容。如何改进这些软件工具,使其对物理内存的影响降至最小,是目前需要重点研究的一个问题。
(3) 目前比较成熟的物理内存取证分析工具较少,需要进一步的研究和开发。
(4) 目前物理内存取证分析技术的研究重点是针对Windows系统的,而针对UNIX、Linux和Macintosh等系统的研究较少。由于目前UNIX、Linux和Macintosh等系统的应用也比较广泛,因此也必须加强对这些系统的物理内存取证分析技术的研究。
针对上述存在的问题,进一步的工作应包括以下几个方面:
(1) 重点研究获取系统物理内存的硬件设备;
(2) 改进现有的获取系统物理内存的软件工具,使其对物理内存的影响降至最小;
(3) 加强物理内存取证分析工具的研发工作;
(4) 加强对UNIX、Linux和Macintosh等系统的物理内存取证分析技术的研究;
(5) 通过因特网远程获取物理内存也是未来的一个重要研究方向。
物理内存 篇2
物理内存是真正的内存,在应用中顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。看机器配置的时候,看的就是这个物理内存。
虚拟内存是为了满足系统对超出物理内存容量的需求时在外存(如硬盘)上开辟的存储空间。由于虚拟内存其实是放在外存上,因而与物理内存相比读写速度都非常慢
那么虚拟内存有什么作用呢?
我们知道, 32位CPU,有32根地址线,那么它的寻址空间就是4GB,
物理内存 篇3
早在去年年末,内存规范厂商JEDEC就发布了DDR4内存的白皮书。而经过接近一年的发展和酝酿,DDR4内存终于要走向前台。相比目前的DDR3内存,DDR4内存在技术和规格上都有大幅度创新,即将引领下一个内存时代。
1 超高速 多通道 大容量
根据目前的规划,DDR4需要在预取数没有改变的情况下将等效频率从DDR4 1600起,短期内提升至DDR4 3200,未来会进一步发展到DDR4 4266及以上。由于架构的大幅度改进,DDR4的频率上升变得更容易,因此高频率、高速度是DDR4的最典型特征。但是,在工艺一定的情况下,频率上升带来的问题也很麻烦,主要是温度变高、工作稳定性降低、信号传输稳定性变差等。这些都是DDR4在高频率运作时需要解决的问题。为了解决这个问题,DDR4使用了很多新技术,比如Bank Group技术、TCSE、TCAR等。总线上DDR4采用了全新的点对点总线,内存设计上使用了3DS技术,整体实力令人惊叹。
为了更快的传输数据,DDR4采用了Bank Group分组架构技术,内部可以支持2个或者4个Group,能够同时对这些Group进行读写操作。每个Bank Group可以独立读写数据,这样一来内部的数据吞吐量大幅度提升,可以同时读取大量的数据,内存的等效频率在这种设置下也得到巨大的提升。Bank Group带来了DDR4内部数据传输能力的大幅度提升,让DDR4在物理频率没有太大提升的情况下能大幅度提升数据存取能力。凭借Bank Group的设计,DDR4获得了非常大的发展空间,这是技术型产品需要长期发展不可或缺的重要内容。只有在未来有持续的发展空间,DDR4才能在3~5年中对未来计算带宽提供足够支持。
解决了存储带宽问题后,DDR4还采用了超高速的点对点总线。点对点总线的特性是内存控制器每通道只能支持唯一的一根内存。它相当于为每个仓库都设计了一条道路,有效利用了每个内存的位宽。点对点总线设计比较简单,容易达到更高的频率。在弹性内存多通道技术发展后,用户有很大可能依旧可以在不同的通道上配置不同规格的内存,即能节约投资,又能提高性能。实际的性能数据方面,未来民用PC中支持DDR 4的产品可能使用4通道点对点内存控制器。以DDR 3200计算,在4通道的情况下,可以提供约102.4GB/s(3200×64×4÷8)的带宽,远远超出目前25GB/s左右的带宽,即使是普通的双通道,带宽也高达52.2GB/s,也超出目前主流水平100%还多。
目前限制内存发展的因素还有内存容量。DDR4准备启用堆叠封装来增大单颗芯片的容量,这也是DDR4内存中最关键的技术之一。这项技术在DDR4中被称作3DS(3-Dimensional Stack)。DDR4中,采用硅穿孔后的多层芯片中,只有一个主DRAM,其余的都是从DRAM(最多可以叠加7层,加上主DRAM,共8层)。芯片在工作时,只面向主DRAM,系统就像操作单层芯片那样操控所有的堆叠芯片。使用了3DS堆叠封装技术后,单条内存的容量最大可以达到目前产品的8倍之多。即使技术不成熟只能使用4层堆叠,DDR4内存至少可以达到单条32GB,双通道64GB,基本可以满足未来三五年内的内存容量需求了。
2 DDR4内存是弯的
DDR3内存和DDR2内存外观看起来基本相同,只是金手指上的缺口不太一样,那么DDR4呢?会有什么特色设计吗?
DDR4内存是“弯的”!DDR4内存的金手指不再是平直的了,而是呈现弯曲状。做出这样的改进是因为从结构来看,传统内存平直设计的摩擦力较大,因此内存存在难以拔出和难以插入的情况。而DDR4将内存下部设计为中间稍突出、边缘收矮的形状。在中央的高点和两端的低点以平滑曲线过渡。这样的设计既可以保证DDR4内存的金手指和内存插槽触点有足够的接触面,信号传输稳定无虞,又可以让中间凸起的部分和内存插槽产生足够的摩擦力而稳定内存。
除了典型的外观变化外,DDR4内存的金手指本身设计有较明显变化。金手指中间的“缺口”也就是防呆口的位置相比DDR3更为靠近中央。在金手指触点数量方面,普通DDR4内存有284个,比DDR3的240个要多,每一个触点的间距从1毫米缩减到0.85毫米,因此长度基本不变。笔记本电脑内存上使用的SO-DIMM DDR4内存有256个触点,触点间距从0.6毫米缩减到了0.5毫米,长度相比触点只有204个SO-DIMM DDR3内存也没有太大的变化。
在尺寸方面,由于DDR4芯片封装方式的改变以及高密度、大容量的需要,因此DDR4的PCB的厚度略微增加了0.2毫米,高度略有增高,长和宽分别增加了0.9毫米和1毫米,达到了68.6毫米长和31.25毫米高。不过仅仅从外观看,不经过仔细对比的话,是不会发现DDR4和DDR3在长宽高上有太过明显的区别的。
3 DDR4内存的上市时间
DDR4这么优异,什么时候上市呢?根据镁光等厂商的资料,DDR4从2013年开始试生产并开始正式出货,2014年开始大面积生产。在2016年左右,DDR4将会彻底取代DDR3成为主流产品,届时DDR4的市场占有率应该超过50%(DDR3应该还有约1/3的市场占有率)。平台方面,英特尔很可能在2014年首先在新的移动平台上宣布对DDR4的支持,AMD也应该差不多在同一时间开始支持DDR4,在2015年将有希望看到DDR4产品的大爆发。
不过早期上市的DDR4内存规格可能并不太高。根据镁光的路线图,DDR4内存在2013年首先推出DDR4 1866、DDR4 2133的规格,随着时间推移会在2015年延伸至DDR4 2667,在2016年还有可能更高。不过这份路线图显得较为保守,据其他方面的消息,DDR4在进入成熟期(2015年之后),很可能快速发展出高频版本,玩家级别的产品会使用到DDR4 3200乃至更高,最终可以达到DDR4 4266等高规格。
4 DDR4将在2015普及
尽管DDR4明年就会与大家见面,但和所有新产品一样,DDR4上市初期的价格必定是高高在上,令人难以接受的。不过随着技术发展,DDR4的价格肯定也会逐步亲民化,迅速走入平常用户和玩家电脑中。保守估计,DDR4在2015年左右价格会降低到比较令人满意的程度,各种支持DDR4控制器的主板或CPU产品也会更加丰富,那个时候DDR4应该会顺利走入千万玩家的电脑中了。
物理内存 篇4
GNU/Hurd操作系统是GNU设计用来替代Unix内核的新一代操作系统内核[1]。Hurd系统是基于CMU的Mach3.0微内核架构,由GNU小组对其进一步开发完成,并由Debian公司进行发布。
Hurd采用Mach微内核作为其内核,Mach微内核完成最基本的操作系统功能,例如进程通信、内存管理、硬件管理等。Hurd是架设在Mach上的一组服务,这一组服务贯彻了传统操作系统概念,实现了文件系统,网络协议,文件的访问控制,以及其它的操作系统功能。
Hurd与Mach系统在特点上各有千秋,例如Hurd的模块化以及微内核架构特点、Mach独有的IPC通信和内存管理特点等。本文将简单介绍Hurd与Mach系统特点,并分析Mach微内核的内存管理与接口实现。最后,讨论在Mach微内核下内存共享的实现。
1 Hurd操作系统与Mach微内核
1.1 Hurd操作系统及其特点
Hurd操作系统是GNU项目组设计用来取代Unix的新一代操作系统。虽然目前不是最流行的操作系统,但因其拥有很多独特的特性,从而与其它的操作系统相比,表现着更为出众的使用优势。Hurd的优点如下[2]:
(1)Hurd是开源的操作系统。任何人都可以使用并且修改,由GNU小组进行维护。
(2)兼容性。Hurd提供了一个通用的编程环境和用户环境,是一个类Unix的内核。Hurd使用GNU C库,并且兼容ANSI/ISO,POSIX,X/Open等标准。
(3)易于设计与扩展。Hurd不同于其他流行的操作系统内核,而是面向对象的结构。这种结构使得Hurd在进行扩展和修改时,无需重写内核,只需要修改相应的模块。
(4)多服务。Hurd实现了多线程,可高效地运行在单处理器和多处理机上。Hurd的运行性能非常稳定,还是一个很好的学习平台,各种想法实现起来也非常便捷。
GNU Hurd设计成多服务的面向对象的操作系统。可将其视为一组对象的集合,对象扩展了底层微内核Mach的功能,可以实现标准的操作系统功能以及实践系统设定的各项策略。系统的服务是通过专门的对象来实现的,这些对象在用户态下被称为server。一个服务也可以分解为一些对象,比如文件系统服务可以分解为后备存储、文件属性以及目录等。Hurd可以视为基于微内核Mach的服务的集合,包括文件系统、网络协议以及其他一些系统功能。GNU Hurd多服务操作系统的时新评论均详细介绍了Hurd的系统架构以及Hurd实现的详细细节,同时也给出了Hurd系统的优点和缺点[3]。
1.2 Mach微内核及其特点
Hurd作为GNU的操作系统,架设在微内核Mach之上,实现了传统意义上的操作系统功能。Mach是第一代的微内核结构,是由CMU大学设计并实现的微内核。GNU对其进行了修改和扩充,因而形成了GNU Mach微内核,GNU Mach兼容CMU的Mach 3.0系统。
GNU Mach是GNU项目的微内核。Mach并不显现操作系统的特点,而是借助一个简单的可扩展通信内核、用户模式的任务来实现传统操作系统功能。Mach所提供的基本功能包括控制流的管理(threads)、资源分配(tasks)、支持虚拟地址空间、管理硬件资源(如处理器、物理内存)等[4]。另外,Mach还具有强大的内存管理和进程间通信的功能,这是操作系统的基础功能,也为Hurd的server、GNU C库和用户程序提供了底层基础功能。微内核Mach本身虽不提供操作系统的功能,却也使得Hurd的服务和C库在Mach上实现了一个满足POSIX标准的操作系统。文献[5]给出了Mach微内核的设计创意和详细实现细节。
2 Mach微内核的虚拟内存管理
通常,操作系统的内存管理部分主要完成空间分配、虚拟地址映射和地址保护等功能,从而使得系统安全高效地使用有限的存储空间。Mach微内核的内存管理机制设计目标是:
(1)支持较大的、松散的虚拟地址空间。
(2)灵活的内存保护机制。
(3)copy-on-write操作。
(4)任务间内存共享,包括copy-on-write和read/write内存共享。
(5)内存映射文件。
(6)用户模式提供页和对象的后备存储[6,7]。
Mach的内存管理在设计上尽可能地独立于硬件,对硬件的唯一要求是提供页式管理机制支持,并且对于页的大小也不作限制,所有这些化简了在移植时的操作,使得Mach能够支持许多不同的体系结构。
2.1 Mach内核的5个基本抽象
Mach是一个支持并行分布多体系结构的操作系统微内核,有5个最基本的抽象概念,这些抽象概念对于理解Mach以及Mach的虚拟内存管理机制是必不缺少的。这五个概念分别是任务(Task)、线程(Thread)、端口(Port)、消息(Message)、内存对象(Memory object)[8],对其分析如下:
(1)任务(Task)。每个task是一个线程运行的执行环境,是最基本的资源分配单位。通常,task包括虚拟地址空间和系统资源(处理器、虚拟内存等),与UNIX进程的概念相类似。
(2)线程(Thread)。Thread是CPU使用的基本单位,是程序执行的实体。同一个任务内的所有thread共享全部资源。
(3)端口(Port)。port是一个信息通道。通过信道,Mach可以安全地进行消息传递。
(4)消息(Message)。message是线程之间通信使用的数据对象的类型集合。message大小不限,并可能包含指针和类型。
(5)内存对象(Memory Object)。Memory object是由server管理和提供的可以映射到一个任务的地址空间的数据备份。这是一种对存储的抽象,可以用来表示例如文件等存储实体。
2.2 Mach虚拟内存管理
Mach最著名的设计之一是其中的虚拟内存的设计,Mach将虚拟内存系统分为机器独立和机器依赖两部分。机器依赖提供一个简单的接口,负责管理硬件地址映射表;机器独立除了提供逻辑页表的管理,还提供映射表所组成的内存区域概念,同时也提供内存对象的支持和接口实现。Mach虚拟内存系统除支持单处理器外,还支持共享内存的多处理器系统,同时也具有很好的移植性,可以在各种不同的系统架构下加载运行。高性能也是Mach重要特点之一。Mach提供很大的、宽泛的虚拟地址空间、共享内存以及虚拟内存拷贝优化等等。Mach的每个任务(task)均拥有较大的地址空间范围,包括内存区域以及内存区域所映射的内存对象。Mach内规定任务的地址空间只由底层硬件的寻址限制所决定。
2.2.1 虚拟地址空间(Virtual Address Spaces)
虚拟地址空间定义了一组地址,这组地址指示线程thread在任务task执行的虚拟地址。虚拟地址空间由其对应的task命名。Mach的任务都拥有很大的虚拟地址空间,其线程的执行就是在此虚拟地址空间中。
虚拟地址空间由松散的已经索引的内存页面集合组成。Mach内核按照页面的属性值将这些内存页面分成不同的组,将其称为内存区域(memory regions)。页面的属性包括继承属性、保护属性、后备的抽象内存对象等等。系统的各项操作和运行机制均是基于内存区域的,但是用户对于内存区域的使用却无需限制,用户可以尽其所需地扩张内存区域。同时,Mach内核也可以按照适合的方式自由地合并和分割内存区域,从client的视角看,虚拟内存空间就是一个页面的集合。调用vm_region可以获得内存区域的属性。尽管内存区域是存在于内核的概念,调用vm_map也可以修改内存区域的继承和保护属性。
任务的虚拟地址空间是在任务创建时分配完成的,并于任务结束时一并销毁。当任务刚刚创建时,其虚拟内存空间是空的,必须通过执行一定操作申请地址内存空间。通过task_create调用,子任务可以继承其父任务的内存区域。而vm_inherit调用则可以修改内存区域的继承属性值,这些属性值包括:
(1)VM_INHERIT_NONE—该内存区域在新任务中不会被定义。
(2)VM_INHERIT_COPY—该内存区域将会以copy优化的方式在新任务中进行创建。
(3)VM_INHERIT_SHARE—新旧任务将完全共享同一内存区域。在此,可以看出Mach提供了父子任务的内存共享。
内存区域的语义识别是通过a memory manager的行为实现的。当一个内存区域在虚拟空间中创立时,一个虚拟内存对象(memory object)便和该内存区域联系在一起了。内存对象将负责内存区域的后备数据存储,其语义实现是通过一个称为memory manager的任务实现的。内核中不存在直接操作内存区域的系统调用,任务是通过memory manager的函数或者向memory manager发送消息来完成操作的。
vm_map调用是确定任务内存区域的唯一方法,借此可以设定该内存区域的基本信息(例如内存中位置、大小、保护属性、继承属性等)。需要指出的是,最重要的参数是对其抽象内存对象的指定,因其提供了内存区域的后备存储。
图1是以client的角度呈现的虚拟内存结构图。图中显示了三个内存区域,其中的两个共有一个相同的后备对象存储memory object,但是两者的继承属性或者保护属性可以不相同。
2.2.2 内存对象(Memory Objects)
内存对象代表了非常驻内存的内存区域,内存对象是内存区域的后备存储。而实现内存对象概念的任务则称为memory manager。memory manager实现了内存对象的完整语义,并且提供了若干接口,以方便用户使用。
用户态的任务操作内存的通用过程是:一个任务确定其内存区域,并指定该内存区域的内存对象;任务访问该内存区域的某部分,假如该内存区域不在内存中,则发生缺页中断,将其换入后继续访问;假如数据已修改,则将数据存入内存对象中,再将其换出内存;销毁内存区域以及内存对象。
内核使用内存可以将内存作为内存对象内容的缓存(cache)。该cache的一部分是常驻内存的,将此部分内存对象称之为memory cache object。内核维护cache,并对其适时、合理地进行管理、填充和刷新。
2.3 Mach虚拟内存管理接口的实现
GNU Mach很大程度上兼容了CMU的Mach 3.0,这一点在接口的层面上已经清晰地显现出来。文献[8,9]分别是Mach 3.0和GNU Mach的接口使用手册,经过分析,两者大部分相同,只是GNU Mach的接口实现简化了CMU Mach的接口,还对其进行了一定的封装处理。
在虚拟内存管理上,两者均提供了较为丰富的接口,同时,一个任务也可以修改其地址空间,例如:在页边界上分配虚拟内存区域、删除虚拟内存区域、设置虚拟内存区域的保护属性、指定虚拟内存区域的继承属性、创建和管理内存对象,内存对象可以映射另一个任务的虚拟地址空间。
Mach亦设有各类功能接口以实现其虚拟内存管理,可将这些接口分为两大类:虚拟内存接口和外部存储管理接口。
对于虚拟内存接口,主要有内存分配和回收、数据传输(读、写和拷贝数据)、内存区域属性设置(继承、保护属性)、映射内存对象。其中,映射内存对象可以将一个任务的地址映射到另外一个任务的地址空间中去,可以实现不同任务的内存共享。这一接口设置屏蔽了内存对象的操作,用户使用起来就像直接操作内存一样。其好处是大大降低了用户管理存储空间的难度,但是也有相应的不足,就是不可以使用高级的内存共享操作。
外部内存接口主要是针对于内存对象的接口,主要有设置内存对象服务、删除内存对象、内存对象的数据传输、内存对象锁定和设置内存对象属性等几类接口。使用外部内存管理接口可以实现较为复杂的内存管理,也包括内存共享操作。
3 Hurd的内存共享
通过对Mach微内核的内存管理的研究,本文提出在Hurd下的几种内存共享方案。
(1)考虑Hurd下POSIX标准的内存共享方案。为了便于实验和对比,同时在Linux和Hurd下进行了实验。
(2)使用Mach的内存对象的概念完成内存共享。这是重点阐述的部分,使用Mach内存对象的概念,并同时使用其IPC通信功能,实现内存共享与映射。
(3)考虑添加系统调用的方法完成内存共享。
3.1 内存共享
首先,介绍一下内存共享的概念。内存共享是指共享内存,从字面意义解释,就是多个进程可以将同一段内存映射到各自的进程空间,以此来实现数据的共享以及传输,这也是进程间最快的一种通信方式,图2是内存共享的示意图。
3.2 使用POSIX标准实现内存共享
Hurd系统支持POSIX标准,而POSIX标准对于内存共享是有规定含义的,所以可在Hurd系统下尝试使用POSIX的内存共享。POSIX标准对于内存共享的实现有两种方法。
(1)内存映射文件(memory-mapped file)。由open函数打开此类文件,并由mmap函数将得到的描述字映射到当前地址空间。
(2)共享内存区对象(shared-memory object)。由shm_open函数打开POSIX标准的一个IPC对象,并且使用mmap函数将其映射到进程地址空间中。
为了验证Hurd系统对于POSIX标准的内存共享,下面分别在Linux系统和Hurd系统下作了实验。
Linux系统下的POSIX内存共享有两种方法。一种是mmap系统调用映射普通文件完成内存共享;另一种是,shm_open函数打开对象,并且使用mmap函数完成内存共享。对于第二种方法,在Linux目录中存在共享内存区对象的目录dev/shm/,在此目录下可以发现打开的共享对象,符合POSIX标准。
Hurd系统是支持POSIX标准的,所以可假设Hurd系统也应该支持POSIX标准的内存共享。现将Linux下的程序移植到Hurd系统下进行对比。实验后发现,在Hurd目录中不存在共享内存区对象的目录/dev/shm,也不存在目标文件。同时,在程序执行的目录下发现了一个文件,该文件内容为共享内存对象的内容。这种情况说明了该文件是存储在本地磁盘上的,不是内存中的共享对象,因而不符合POSIX标准。
由此,得出结论:对于POSIX标准的支持,Hurd系统并没有完全实现,只是使用了文件进行模拟而已。所以,Hurd系统下,使用POSIX标准的内存共享是不可行的。
3.3 使用Mach自身接口实现内存共享
使用微内核Mach自身的接口和机制完成内存共享,可分为这样几种情况,即同一任务的不同线程之间、有父子关系的任务之间、无关系任务之间完成内存共享。对于前两种情况都比较简单,而对于第三种情况,稍微有些复杂。对其叙述如下:
(1)对于同一任务的不同线程之间的内存共享。这是共享任务全部资源的,所以,两个不同的线程可以直接完成最大限度的内存共享。这是内存共享中最为简单的情况。
(2)对于父子关系的任务之间的内存共享。可以通过设置内存区域(memory region)的继承属性来实现。
(3)对于无关系任务之间的内存共享。可以通过内存对象(memory object)和内存映射文件完成内存共享。本文将使用Mach微内核的内存管理以及内存对象(memory object)概念,完成内存共享。在Mach微内核中,结合Mach的IPC、Mach对于内存基本操作以及Mach对于内存对象的支持这三个方面的内容,即可完成内存共享的要求。整体思路是:首先建立共享的内存对象,设置内存对象属性,将内存对象映射到相应任务的地址空间,然后完成相应的访问,最后销毁内存对象。需要注意的是,在这一过程中,关键问题是实现任务间的交互、内存对象的保护和共享。
3.4 添加新的系统调用完成内存共享
虽然Hurd支持POSIX标准,但是对于内存共享并没有完全支持,在以后的版本中也可能会对其给予相应的支持。鉴于POSIX的内存共享标准,也可以在Hurd上实现符合POSIX标准或者其他形式的内存共享。这种实现则需要参考Linux和Mac OS的系统调用方式。
添加新的系统调用来实现内存共享的方法,需要添加至少两个系统调用,一个是内存区域的分配,另一个是内存区域的回收。详情请参考Mac OS的系统调用添加方式,这里就不再赘述了。
4 结束语
本文介绍了Hurd操作系统与Mach微内核,并解释了两者之间的关系,分别讲述了两者的特点和优点。着重阐述了微内核Mach的虚拟内存管理机制,并且分析其实现虚拟内存管理功能的接口实现。最后,给出了在GNU Hurd系统下的几种内存共享方法。经过实验分析,Hurd系统下POSIX标准的内存共享方法是不可行的,Hurd对于POSIX的标准没有达到完全兼容。而使用Mach内核自身的内存对象的概念可以实现内存共享,可以完成多种形式的内存共享,效果也十分理想,因而是一种很好的方法。另外,也可以考虑在Hurd下添加系统调用来完成内存共享。
参考文献
[1]GNU/Hurd[OL].http://www.gnu.org/software/hurd/hurd/doc-umentation.html
[2]BUSHNELL,THOMAS.The GNU Hurd Reference Manual[M].2007-11.
[3]WALFIELD N H,BRINKMANN M.A critique of the GNU H-urd multi-Server operating system[J].ACM SIGOPS Operatin-g Systems Review,2007.
[4]BRINKMANN,MARCUS.The GNU Mach reference manual[M].Free Software Foundation,2008-11.
[5]ACCETTA M,BARON R,BOLOSKY W.Mach:a new kernelfoundation for UNIX[J].Carnegie Mellon University.Citeseer,39(4864):1-16.
[6]RASHID,TEVANIAN R.Machine-independent virtual memo-ry management for paged uniprocessor and multiprocessor archi-tectures[J].IEEE Transactions on Computers,1988,37:896-908.
[7]王永杰,战超.MACH操作系统内存管理[J].计算机研究与发展,1992(10):27-30.
[8]BRINKMANN,MARCUS.Mach 3 Kernel Principles[M].Free S-oftware Foundation,2008:37-54.
物理内存 篇5
根据微软给出的规格,除Starter版仅支持1GB内存外,其他版本的Windows Vista(32位)均能够支持4GB的“内存”――当然,指32位x86系统,64位Windows Vista x64也没有对应的Starter版本――不过,需要注意的是,这里所谓的“4GB”并非等同于真正的物理内存,而是指可用的内存寻址空间。
相信有计算机基础的用户都清楚,对32位系统而言,4GB是其能够寻址空间的极限,除非通过PAE(Physical Address Extension : 物理地址扩展)将4GB之上的内存通过映射的方式作为4GB空间中的页面来扩展。而在这4GB的地址空间中,必须为计算机的系统资源如BIOS、显卡、PCI-Express等PCI接口留出位置。
让我们简单地看一下Windows Vista x86所支持的4GB寻址空间都包括哪些:首先,BIOS至少要占去512KB,当然,这是一个很小的数字;其次,显卡要占去略大于其视频RAM的空间,比如说,对于希望在高分辩率下使用Aero Glass的情况而言,256MB显存是必需的,这也意味着必须在4GB的寻址空间中为显卡的256MB视频RAM留出位置;第三,对基于x86的计算机系统而言,其还必须为其他的PCI设备保留相当部分的寻址空间,比如各种IO设备等。这样,Windows Vista在寻址真正的物理内存之前,系统中已经被各种资源占用512MB到1GB的寻址空间,也即是说,Windows Vista真正能够使用的物理内存大致在3 GB到3.4 GB之间,
这对于象Windows Vista这样一款以1GB RAM越跳的系统而言,系统内存的可扩充空间实在太小,尤其与当年Windows XP 128MB-4GB的内存范围相比。而且,虽然Windows Vista X86从内核上来说应该是能够支持PAE的,但似乎目前微软并没有相应的计划。也许,Windows Vista会在今后以Service Pack方式引入对PAE的支持?――当然,也需要硬件厂商特别是CPU、芯片组与主板厂商的配合。
另一方面,狂炒几年的桌面64位技术尽管并未给最终用户带来太多真正意义的好处,但负面影响则是巨大的:那便是软件开发商越来越习惯了“奢侈”地使用内存资源,以前那种在以较少的内存下实现尽可能多功能的“精致”设计越来越少见,或者说,内存总是至少不是软件开发商关注的重点,从而出现了动辄需上百兆甚至过GB内存才能保证运行的程序。而在32位的Windows系统――不仅仅Windows Vista――中,所支持的4GB寻址空间被分成两部分:其中2GB可被应用程序使用,而另外的2GB则被系统内核占用。因此,即使对于系统中安装了4GB内存的Windows Vista而言,应用程序所能够使用的内存也被限制在2GB之内,从而在某些情况下仍难免会出现“内存不足”的情况。对此,虽然可以通过微软的4GT RAM Tuning来将内核的内存起始位置移至3GB处――以在Boot.ini中添加“/3GB”开关实现,即将为内核分配的虚拟地址空间缩小到1GB,而将应用程序可使用的地址空间扩展到3GB――但距理想程度仍有距离。
购买内存谨防假冒 篇6
虚假内存危害大
内存条是电脑装机时必不可少的一项, 内存的好坏对电脑性能影响比较大。更重要的是, 内存能否正常工作直接关系到电脑能否正常运行, 所以内存的选择很关键。
业内专家表示, 假内存的危害极大, 可能导致电脑运行不稳定, 运行软件不稳定或内存读取错误, 严重的话可能导致内存或主机烧毁。如果消费者不幸买到假内存的话, 权益无法得到保障, 在售后服务方面也存在着很大问题。
三星原厂内存进入中国市场
三星内存在节能、环保、稳定方面表现出色, 采用40nm级半导体技术, 比60nm存储设备减少47%的能耗;同时, 三星内存更为绿色环保, 不含铅和卤素, 在产品上有显著的“GREEN”标示。
进入中国市场的三星内存, 包括DDR3台式机专用内存、DDR3笔记本专用内存、DDR2台式机专用内存、DDR2笔记本专用内存四款型号, 内存容量包括1G、2G、4G。三星原厂内存进入中国市场, 意味着市场上的内存种类更为丰富, 消费者在选购内存时将拥有更多的选择。
三星原厂内存防伪有高招
为了帮助消费者更好地选购正品, 三星内存在防伪方面做得比较到位。从外观上来看, 三星内存采用了十分少见的黑色窄版设计, 大小只有传统内存产品的三分之二。三星内存可识别度相当高, 提高了仿造的难度;同时, 三星正品内存的贴条号码和烫金号码一致, 消费者可以现场分辨真假。从而让消费者在购买之前就拒绝假冒品, 提高识别效率。
从细节上看, 三星正品内存做工精湛, 从内存颗粒到金手指, 质量绝非仿品可比。此外, 三星内存还提供“一年包换, 终身保修, 全国联保”服务, 让消费者可以高枕无忧。
Oracle内存组成分析 篇7
1. 系统全局区
系统全局区 (SGA, System Global Area) 。是一组包含一个Oracle实例的数据和控制信息的共享内存结构。其中具有两个很重要的特性:
(1) 系统全局区是共享的。多个用户可以同时登录这个实例, 并且能够同时访问系统全局区中的信息; (2) 一个系统全局区只为一个实例服务。即当一台机器上有多个实例运行时, 每个实例都有一个自己的系统全局区, 尽管系统全局区来自于操作系统的共享内存区, 但实例之间不能相互访问对方系统全局区区的信息。 (3) Oracle进程和一个系统全局区就构成了一个Oracle实例。当实例启动时, Oracle会自动从系统中分配内存给系统全局区, 而实例关闭时, 操作系统会回收这些内存。 (4) 系统全局区区是可读写的。所有登录到实例的用户都能读取系统全局区中的信息, 同时服务进程也会将oracle执行操作后修改的信息写入系统全局区区。
系统全局区主要包括以下的数据结构:数据缓存、重做日志缓存、共享池、Java池、大池、流池、数据字典缓存。
1.1 数据缓存
数据缓存专门用于存放从数据文件中读取的的数据块拷贝的区域。如果需要访问的数据块已经在数据缓存中, 就直接读写内存中的相应区域, 而无需读取数据文件, 从而大大提高性能。数据缓存对于所有oracle进程都是共享的, 即能被所有oracle进程访问。数据缓存被分为多个集合, 这样能够大大降低多CPU系统中的争用问题。
1.2 重做日志缓存
重做日志缓存是系统全局区中一段保存数据库修改信息的缓存。这些信息被存储在重做条目中。重做条目中包含了由于INSERT、UPDATE、DELETE、CREATE、ALTER或DROP所做的修改操作而需要对数据库重新组织或重做的必须信息。在必要时, 重做条目还可以用于数据库恢复。参数LOG_BUFFER决定了重做日志缓存的大小。它的默认值是512K, 最大可以到4G。当系统中存在很多的大事务或者事务数量非常多时, 可能会导致日志文件IO增加, 性能降低。这时可以考虑增加LOG_BUFFER值。
1.3 共享池
系统全局区中的共享池由库缓存、字典缓存、用于并行执行消息的缓冲以及控制结构组成。其大小由参数共享池大小决定。在32位系统中, 这个参数的默认值是8M, 而64位系统中的默认值位64M。最大为4G。对于共享池的内存管理, 是通过修正过的LRU算法表来实现的。
共享池包括下面几个组成部分:
(1) 库缓存
库缓存中包括共享SQL区、PL/SQL存储过程和包以及控制结构。任何用户都可以访问共享SQL区。因此库缓存存在于系统全局去的共享池中。
(2) 字典缓存
数据字典是有关于数据库的参考信息、数据库的结构信息和数据库中的用户信息的一组表和视图的集合。在SQL语句解析的过程中, Oracle可以非常迅速的访问这些数据字典。因为Oracle对数据字典访问比较频繁, 此内存中有两处地方被专门用于存放数据字典。数据字典缓存也被称为行缓存, 因为它是以记录行为单元存储数据的, 而不像数据缓存是以数据块为单元存储数据。内存中另外一个存储数据字典的地方是库缓存。所有Oracle的用户都可以访问这两个地方以获取数据字典信息。
(3) 保留共享池
为了拥有足够空间缓存大程序块, Oracle专门从共享池内置出一块区域来来分配内存保持这些大块。这个保留共享池的默认大小是共享池的5%。它的大小也可以通过参数SHARED_POOL_RESERVED_SIZE来调整。保留区是从共享池中分配, 不是直接从系统全局去中分配的, 它是共享池的保留部分, 用于存储大块段。
共享池中内存大于5000字节的大段就会被存放在共享池的保留部分。而这个大小限制是通过隐含参数_SHARED_POOL_RESERV ED_MIN_ALLOC来设定的。除了在实例启动过程中, 所有小于这个数的内存段永远都不会放到保留部分中, 而大于这个值的大内存段也永远不会存放到非保留区中, 即使共享池的空间不够用的情况下也是如此。
1.4 Java池
J ava池是系统全局区中的一块可选内存区, 属于系统全局区中的可变区。Java池的内存是用于存储所有会话中特定Java代码和JVM中数据。Java池的使用方式依赖于Oracle服务的运行模式。Java池的大小由参数JAVA_POOL_SIZE设置, 最大可到1G。在Oracle10g以后, 提供了一个新的Java池建议器, 来辅助数据库管理员调整Java池大小。
1.5 大池
大池是系统全局区中的一块可选内存池, 根据需要时配置。通过从大池中分配会话内存给共享服务或并行查询, oracle可以使用共享池主要来缓存共享SQL, 以防止由于共享SQL缓存收缩导致的性能消耗。此外, 为Oracle备份和恢复操作、IO服务进程和并行查询分配的内存一般都是几百K, 这么大的内存段从大池比从共享池更容易分配得到。
参数LARGE_POOL_SIZE设置大池的大小。大池是属于系统全局区的可变区的, 它不属于共享池。对于大池的访问, 是受到large memory latch保护的。它没有可重建内存段, 因此也不用LRU链表来管理。大池最大大小为4G。为了防止大池中产生碎片, 隐含参数_LARGE_POOL_MIN_ALLOC设置了大池中内存段的最小大小, 默认值是16K。
1.6 流池
流池是Oracle 10g中新增加的。是为了增加对流的支持。流池也是可选内存区, 属于系统全局区中的可变区。它的大小可以通过参数STREAMS_POOL_SIZE来指定。如果没有被指定, oracle会在第一次使用流时自动创建。如果设置了SGA_TARGET参数, Oracle会从系统全局区中分配内存给流池;如果没有指定SGA_TARGET, 则从数据缓存中转换一部分内存过来给流池。转换的大小是共享池大小的10%。Oracle同样为流池提供了一个流池建议器。
2. 程序全局区
程序全局区 (PGA, Program Global Area) , 是一块包含一个服务进程的数据和控制信息的内存区域。它是Oracle在一个服务进程启动时创建的, 是非共享的。一个Oracle进程拥有一个程序全局区内存区。一个程序全局区也只能被拥有它的那个服务进程所访问, 只有这个进程中的Oracle代码才能读写它。
程序全局区由两组区域组成:固定程序全局区和可变程序全局区。固定程序全局区的大小是固定的, 包含了大量原子变量、小的数据结构和指向可变程序全局区的指针。可变程序全局区是一个内存堆。程序全局区堆包含用于存放X$表的的内存。总的来说, 程序全局区的可变区中主要分为以下三部分内容:
1) 私有SQL区
2) 游标和SQL区
3) 会话内存
(1) 私有SQL区
私有SQL区包含了绑定变量值和运行时期内存结构信息等数据。每一个运行SQL语句的会话都有一个块私有SQL区。所有提交了相同SQL语句的用户都有各自的私有SQL区, 并且他们共享一个共享SQL区。因此, 一个共享SQL区可能和多个私有共享区相关联。
(2) 游标和SQL区
一个Oracle预编译程序或OCI程序的应用开发人员能够很明确的打开一个游标, 或者控制一块特定的私有SQL区, 将他们作为程序运行的命名资源。另外, oracle隐含的为一些SQL语句产生的递归调用也使用共享SQL区。私有SQL区是由用户进程管理的。如何分配和释放私有SQL区极大的依赖与你所使用的应用工具。而用户进程可以分配的私有SQL区的数量是由参数OPEN_CURSORS控制的, 它的默认值是50。
(3) 会话内存
会话内存是一段用于保存会话变量和其他预会话相关信息的内存。对于共享服务器模式下, 会话内存是共享的。对于复杂的查询, 运行区的很大一部分被那些内存需求很大的操作分配给SQL工作区。工作区的大小是可以调整的。一般来说, 大的工作区能让一些特定的操作性能更佳, 但也会消耗更多的内存。工作区的大小足够适应输入的数据和相关的SQL操作所需的辅助的内存就是最优的。如果不满足, 因为需要将一部分数据放到临时表空间磁盘上处理, 操作的响应时间会增长。
3. 用户全局区
程序全局区是一段包含一个Oracle服务或后台进程的数据和控制信息的内存。程序全局区的大小依赖与系统的配置。在专用服务模式下, 一个服务进程与一个用户进程相关, 程序全局区就包括了堆空间和用户全局区 (UGA, The User Global Area) 。而用户全局区由用户会话数据、游标状态和索引区组成。在共享服务模式下, 一个共享服务进程被多个用户进程共享, 此时用户全局区是共享池或大池的一部分。
程序全局区和用户全局区之间的区别可以理解为进程和会话之间的区别。在专用服务模式下, 进程和会话是一对一的;而在共享服务模式下, 进程和会话是一对多的关系。程序全局区是服务于进程的, 它包含的是进程的信息;而用户全局区是服务于会话的, 它包含的是会话的信息。因此, 在共享服务模式下, 程序全局区和用户全局区之间的关系也是一对多的。
4. 调用全局区
与其他的全局区不同, 调用全局区 (CGA, The Call Globa Area) 的存在是瞬间的。它只存在于一个调用过程中。对于实例的一些低层次的调用需要调用全局区, 包括:解析一条SQL语句;执行一条SQL语句;取一条SELECT语句的输出值。
如果语句产生了递归调用, 则需要为每个递归调用分配一个调用全局区。如上所述, 递归调用是在语句解析、优化器产生语句查询计划、DML操作时需要查询或修改数据字典信息的调用。因为无论那种模式, 会话在做调用时总需要一个进行进行处理。特别是在共享服务模式下时, 如果发现一次调用很久没有响应, 则可能需要增加程序全局区的大小。
5. 软件代码区
软件代码区 (SCA, Software Code Area) 是一部分用于存放那些正在运行和可以被运行的代码的内存区。Oracle代码一般存储在一个不同于用户程序存储区的软件代码区, 而用户程序存储区是排他的、受保护的区域。软件区的大小一般是固定的, 只有Oracle软件升级或重装后才会改变。在不同操作系统下, 这部分区域所要求的大小也不同。软件区是只读的, 可以被安装成共享的或非共享的。
金士顿系统指定内存 篇8
当年DIY红火的时候, 金士顿向来都是点名率很高的内存品牌, 经过这么多年的积累, 也把这种优势复制到了笔记本内存上。系统指定内存经过特殊设计, 各种延时设置针对特定品牌笔记本进行匹配。在选料上系统指定内存采用优质的组件, 并通过100%的测试与保证。同时, 系统指定内存的价格却要比原厂内存便宜得多, 尤其对于一些对兼容性和稳定性有较高要求的行业用户而言更具性价比。如今, 金士顿的系统指定内存共针对宏碁、苹果、华硕、戴尔、富士通、惠普、联想和东芝等品牌进行优化, 涵盖了目前主流的品牌。为了方便用户识别, 系统指定内存也有自己独特的命名规则——型号的前三位字母代表了具体优化的品牌。
金士顿会对每个新模组的模型执行一套严谨的测试流程, 确保模组设计的可靠性、统一性和兼容性, 以保证制造的每个模组都与使用模组的系统或系统类别100%兼容。每个新设计都要接受一系列审查和测试流程。同时, 金士顿一贯坚持对所有成品进行全面生产测试, 并采用不同类型的测试设备进行生产测试。设计和有效利用测试设备及软件方面的专业技术是使金士顿测试流程与众不同的关键因素之一。此外, 金士顿还聘请专业人员并采用必要资源以准确高效地执行测试程序, 并不断投资最新测试设备并改进个性化设计的测试硬件和软件。所有这些严格措施的执行都使得金士顿内存的质量数十年如一日, 早已成为行业不老的传奇。为了方便用户, 金士顿还强化了渠道体系, 推出了金士顿放心店, 仅有极少数有实力的代理商才能加入这一体系。同时, 各地完善的售后体系也保证了金士顿内存终生质保的实施。
金士顿助力内存升级 篇9
系统指定内存是最近日渐兴起的一种选择方案, 其创立者是内存知名品牌金士顿。系统指定内存又名定制内存, 是内存模组厂商针对具体品牌型号定制的内存, 这种内存的特色是100%兼容。金士顿提供的系统指定内存模组就承诺可享受媲美原厂的“100%测试”、“兼容性保证”和“终身保固”。为了避免用户在购买时遇到假货, 金士顿还专门在全国几十个大城市建立了“金士顿放心店”, 这些放心店对于商家的资质和实力有比较高的要求, 从源头上切断了假货的源头, 保证了用户的购买体验。同时, 金士顿还在全国主要城市打造了完善的售后网络, 保证用户能够在遇到产品问题时第一时间得到解决。堪称完美的售前售后保障, 也一直是金士顿数十年来称霸存储界的根基所在。
为了达到媲美原厂内存的承诺, 金士顿采用多层次的测试系统以确保整个制造程序的品质控制。除了严格测试DRAM和其他材料成份, 所有系统指定内存在出厂前还要在对应的硬件平台上进行信号品质测试、软件压力测试、热测试、特殊系统和长期稳定度测试。从而可保证其可以连续使用多年都不出问题。
包括苹果电脑在内的原厂内存很多也直接采购于金士顿系统指定内存, 或者由金士顿代工生产。金士顿为系统指定内存提供专用的包装, 易于识别, 同时还可以通过网站进行在线查找。在选择了所需升级的设备品牌以及具体型号后, 金士顿在线就可以给出所支持的内存型号, 甚至包括内存插槽数、BANK数在内的众多详细信息。
并行计算的内存访问方法 篇10
本发明主要涉及到计算机技术层面的内容, 尤其针对多线程的PDF格式文件操作中的内存访问控制, 同时由此引申到多线程并行计算时的内存访问有效策略及如何更好提高运行效率的方式, 下面就该发明的技术背景及发明内容做详细的介绍。
当前图书、图片、文件等实体资源的数字化, 通常是采用扫描——识别——提取的方式。先将文档扫描为PDF格式, 再进行文档模块和文字的识别, 之后提取识别后的信息, 供编档和供给搜索引擎以供建立索引。由于现有技术的限制, 在对大量文档处理过程中存在占据大量系统资源的问题, 导致处理速度减慢, 当前的多核处理器技术逐步成熟, 首选方式是在多个CPU上同时实现多线程的运行。但现实操作中仍存在提速有限且CPU未能完全利用的问题, 为此发明人结合业内多年工作经验及实验操作分析和研究该问题的成因, 发现要归因在内存操作中其分配和释放需要县城保护, 并且全部线程共享同个内存池, 这类因素导致访问需要等待, CPU效用率低, PDF的频繁操作会使得大量出现线程等待。
为了改善内存访问, 本领域技术人员提出了多种方法。例如, 专利授权公告号:CN100487660C, 名为“一种多线程处理器动态内存管理系统及方法”的中国发明专利公开了一种多线程处理器动态内存管理方法, 该方法在一定程度上解决了内核线程的内存释放问题, 能够避免某一时刻某一空闲的内核线程占用过多的空闲内存。由主控内核线程取代硬件仲裁器, 利用消息机制, 提高了内存在各个内核线程间的分配使用效率。但是该方法却无法解决共享一个内存池的多个线程均请求较大内存空间而必须排队等候的问题。并且应用此方法, 要改变内存管理代码, 并不适合代码的直接移植。
2 本发明具体内容阐述
(1) 本发明目的在于针对多个线程调用同一个执行模块时, 由于必须共享同一内存池, 且该内存池无法提供足够资源而导致内存访问等待时间过长的问题, 提供一种新的内存访问策略, 以缩短甚或消除并行计算时的内存访问等待时间, 使单个线程能够拥有独立的内存池。能在不改变或很少改变模块代码特别是完全不改变内存管理的情况下, 将单线程代码, 简单移植到多线程环境中。并让多核多线程的优势得到充分发挥。
(2) 本发明的并行计算的内存访问方法, 用于存在调用同一原始执行模块的n≥2个并行线程的情况, 其特征在于, 包括以下步骤:
S1) 根据线程数n确定需创建的映像执行模块的个数k, n-1≥k≥1;
S2) 确定该n个线程与原始执行模块及k个映像执行模块之间的映射策略F;
S3) 创建k个映像执行模块, 并为其分配各自私有的内存池;
S4) 执行所述并行的n个线程, 令各个线程按照所述映射策略F调用执行模块, 每个执行模块访问且仅访问其私有的内存池;
S5) 线程运行完成后删除创建的映像执行模块, 释放资源。
其中, 所述映像执行模块的个数为k可以是随时间变化的。或者, 所述映像执行模块的个数k在线程执行期间也可是固定不变的。较佳地, 可根据同一时间调用同一执行模块的线程个数的统计值来确定映像执行模块的数量。
根据本发明的一实施例, 所述映像执行模块的个数k为1个。根据本发明的另一实施例, 所述映像执行模块的个数k为n-1个。其中, 当所述映像执行模块的个数k为n-1个时, 所述映射策略F可为:每个线程分别调用一个不同的执行模块, 线程与执行模块是一一对应的。根据本发明的再一实施例, 所述映射策略F可为静态策略, 一个线程仅指向一个被它调用的执行模块, 而一个执行模块被一个或一个以上的线程调用。较佳地, 所述映射策略F为将调用执行模块频繁的线程, 配置为独享一个执行模块, 将相对调用执行模块频率较低的线程, 配置为共享执行模块。根据本发明的又一实施例, 所述映射策略F为动态策略的“多窗口排队”机制, 该策略F中, 为每个执行模块定义“空闲”、“繁忙”两个状态, 将所有的空闲执行模块排队需要调用执行模块的线程从空闲执行模块队列中择一调用, 若没有空闲的则等待;在线程对执行模块的调用进行中将该执行模块标记为繁忙, 执行完毕后, 线程释放该执行模块, 将其标记为空闲。
应用本发明的方法可令并行计算的效率随核心数增加而呈线性增长, 而不受内存访问瓶颈的限制。对各种操作系统均可适用。并且使用静态方式时, 甚至无需增加代码, 即可将单线程的程序直接移植到多线程环境。而灵活的动态方式和动态映射策略, 则可使本发明在占用不是那么多的系统资源的情况下显著提高效率, 事半功倍。
(3) 本发明目的在于, 在不改变操作系统的内存管理的前提下, 改变内存访问方式。为对便于对本发明进行更好的理解, 首先对一般的内存管理方式进行说明。内存管理的特点之一是执行模块是隔离的, 每一个执行模块被分配独立的内存池空间。其中, 执行模块可视为是系统在内存中建立的一个个数据结构, 用于管理运行时加载到内存中的程序代码, 数据以及资源。每个执行模块作为一个系统资源的分配单位, 享有其独自的内存池, 执行模块中的多个函数将共享该执行模块的内存池。所述执行模块可以是运行后被加载到进程中的一个windows下的.exe程序或一个动态链接库 (dll) 等。同一个执行模块, 不论多少个线程在调用, 只会被加载一次, 由同一个进程开启的所有线程, 对于同一执行模块, 它的内存池是共享的。依照操作系统类型的不同, 执行模块还可有其它形式。按照本领域技术人员的公知, 不同的操作系统的内存管理模式会有区别, 但是均会存在这样一种特定的单元, 其由一些数据和代码的集合构成, 表现为程序、函数等形式, 并且对该种代码组合操作系统会分配私有的 (private) 内存空间 (包括逻辑的或物理的) 以供其访问。因此, 在本发明中, 执行模块也可理解为在给定操作系统下, 依据该操作系统的默认内存管理方式而为其分配单独的内存池的一组代码和数据的集合。
专利名称:并行计算的内存访问方法
专利号:ZL 2010 1 0140502.6
申请日:2010.04.07公开日:2013.04.17
申请人:福州福昕软件开发有限公司林芝
摘要:本发明是一种有关计算机并行计算的内存访问的方法, 用于存在调用同一原始执行模块的n≥2个并行线程的情况, 包括以下步骤:S1) 根据线程数n确定需创建的映像执行模块的个数k, n-1≥k≥1;S2) 确定该n个线程与原始执行模块及k个映像执行模块之间的映射策略F;S3) 创建k个映像执行模块, 并为其分配各自私有的内存池;S4) 执行所述并行的n个线程, 令各个线程按照所述映射策略F调用执行模块, 每个执行模块访问且仅访问其私有的内存池;S5) 线程运行完成后删除创建的映像执行模块, 释放资源。本发明可令并行计算的效率随核心数增加而呈线性增长, 而不受内存访问瓶颈的限制。各种操作系统通用, 且便于将单线程的程序直接移植到多线程环境。