电脑虚拟内存怎么扩大

电脑虚拟内存怎么扩大,第1张

电脑物理内存不够用时就会调去我们的虚拟内存,那么,电脑虚拟内存怎么扩大?

虚拟内存

虚拟内存是计算机系统 内存管理的一种技术。它使得 应用程序认为它拥有连续的可用的 内存(一个连续完整的 地址空间),而实际上,它通常是被分隔成多个 物理内存碎片,还有部分暂时存储在外部 磁盘存储器上,在需要时进行 数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”Linux的'“交换空间”等。

电脑虚拟内存怎么扩大

启动电脑,选择桌面上的 “计算机”

然后单击鼠标右键,选择“属性”

在窗口中选择“高级系统设置”

在系统属性窗口中选择“高级”

然后单击“性能”下的设置

什么是虚拟内存

在Windows 2000(XP)目录下有一个名为pagefile.sys的系统文件(Windows 98下为Win386.swp),它的大小经常自己发生变动,小的时候可能只有几十兆,大的时候则有数百兆,这种毫无规律的变化实在让很多人摸不着头脑。其实,pagefile.sys是Windows下的一个虚拟内存,它的作用与物理内存基本相似,但它是作为物理内存的“后备力量”而存在的,也就是说,只有在物理内存已经不够使用的时候,它才会发挥作用。

虚拟内存的产生

我们都知道,虽然在运行速度上硬盘不如内存,但在容量上内存是无法与硬盘相提并论的。当运行一个程序需要大量数据、占用大量内存时,内存就会被“塞满”,并将那些暂时不用的数据放到硬盘中,而这些数据所占的空间就是虚拟内存。现在我们也明白为什么pagefile.sys的大小会经常变化了。

手动设置虚拟内存

在默认状态下,是让系统管理虚拟内存的,但是系统默认设置的管理方式通常比较保守,在自动调节时会造成页面文件不连续,而降低读写效率,工作效率就显得不高,于是经常会出现“内存不足”这样的提示,下面就自已动手来设置它吧。

①用右键点击桌面上的“我的电脑”图标,在出现的右键菜单中选择“属性”选项打开“系统属性”窗口。在窗口中点击“高级”选项卡,出现高级设置的对话框。

②点击“性能”区域的“设置”按钮,在出现的“性能选项”窗口中选择“高级”选项卡,打开其对话框。

③在该对话框中可看到关于虚拟内存的区域,点击“更改”按钮进入“虚拟内存”的设置窗口。选择一个有较大空闲容量的分区,勾选“自定义大小”前的复选框,将具体数值填入“初始大小”、“最大值”栏中,而后依次点击“设置→确定”按钮即可,最后重新启动计算机使虚拟内存设置生效。

一般情况下,如果你的物理内存在512MB以下(包括512MB),可将初始大小设为你物理内存的1.5倍,最大值设为物理内存的3倍即可,如果你的物理内存在512MB以上,可将虚拟内存初始大小设为物理内存的一半,最大值高为3倍.虽然最大值设为3倍,但实际上它首先会以最小值出现,待有扩展需要时才会递增.

虚拟内存不足的可能原因:

我用的电脑系统是WinXP,最近使用时,没开多少程序,却常常出现“虚拟内存不足”的系统提示。这是什么原因造成的呢?

可能有以下几个原因:

1、感染病毒

有些病毒发作时会占用大量内存空间,导致系统出现内存不足的问题。赶快去杀毒,升级病毒库,然后把防毒措施做好!

2、虚拟内存设置不当

虚拟内存设置不当也可能导致出现内存不足问题,一般情况下,虚拟内存大小为物理内存大小的2倍即可,如果设置得过小,就会影响系统程序的正常运行。重新调整虚拟内存大小以WinXP为例,右键点击“我的电脑”,选择“属性”,然后在“高级”标签页,点击“性能”框中的“设置”按钮,切换到“高级”标签页,然后在“虚拟内存”框中点击“更改”按钮,接着重新设置虚拟内存大小,完成后重新启动系统就好了。

3、系统空间不足

虚拟内存文件默认是在系统盘中,如WinXP的虚拟内存文件名为“pagefile.sys”,如果系统盘剩余空间过小,导致虚拟内存不足,也会出现内存不足的问题。系统盘至少要保留300MB剩余空间,当然这个数值要根据用户的实际需要而定。用户尽量不要把各种应用软件安装在系统盘中,保证有足够的空间供虚拟内存文件使用,而且最好把虚拟内存文件安放到非系统盘中。

4、因为SYSTEM用户权限设置不当

基于NT内核的Windows系统启动时,SYSTEM用户会为系统创建虚拟内存文件。有些用户为了系统的安全,采用NTFS文件系统,但却取消了SYSTEM用户在系统盘“写入”和“修改”的权限,这样就无法为系统创建虚拟内存文件,运行大型程序时,也会出现内存不足的问题。问题很好解决,只要重新赋予SYSTEM用户“写入”和“修改”的权限即可,不过这个仅限于使用NTFS文件系统的用户。

一个进程的虚拟地址空间主要由两个数据结来描述。一个是最高层次的:mm_struct,一个是较高层次的:vm_area_structs。最高层次的mm_struct结构描述了一个进程的整个虚拟地址空间。较高层次的结构vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。

1. MM_STRUCT结构

mm_strcut 用来描述一个进程的虚拟地址空间,在/include/linux/sched.h 中描述如下:

struct mm_struct {

struct vm_area_struct * mmap /* 指向虚拟区间(VMA)链表 */

rb_root_t mm_rb/*指向red_black树*/

struct vm_area_struct * mmap_cache/* 指向最近找到的虚拟区间*/

pgd_t * pgd /*指向进程的页目录*/

atomic_t mm_users /* 用户空间中的有多少用户*/

atomic_t mm_count /* 对"struct mm_struct"有多少引用*/

int map_count /* 虚拟区间的个数*/

struct rw_semaphore mmap_sem

spinlock_t page_table_lock /* 保护任务页表和 mm->rss */

struct list_head mmlist /*所有活动(active)mm的链表 */

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

unsigned long rss, total_vm, locked_vm

unsigned long def_flags

unsigned long cpu_vm_mask

unsigned long swap_address

unsigned dumpable:1

/* Architecture-specific MM context */

mm_context_t context

}

对该结构进一步说明如下:

在内核代码中,指向这个数据结构的变量常常是mm。

每个进程只有一个mm_struct结构,在每个进程的task_struct结构中,有一个指向该进程的结构。可以说,mm_struct结构是对整个用户空间的描述。

一个进程的虚拟空间中可能有多个虚拟区间(参见下面对vm_area_struct描述),对这些虚拟区间的组织方式有两种,当虚拟区较少时采用单链表,由mmap指针指向这个链表,当虚拟区间多时采用“红黑树(red_black

tree)”结构,由mm_rb指向这颗树。在2.4.10以前的版本中,采用的是AVL树,因为与AVL树相比,对红黑树进行操作的效率更高。

因为程序中用到的地址常常具有局部性,因此,最近一次用到的虚拟区间很可能下一次还要用到,因此,把最近用到的虚拟区间结构应当放入高速缓存,这个虚拟区间就由mmap_cache指向。

指针pgt指向该进程的页目录(每个进程都有自己的页目录,注意同内核页目录的区别),当调度程序调度一个程序运行时,就将这个地址转成物理地址,并写入控制寄存器(CR3)。

由于进程的虚拟空间及其下属的虚拟区间有可能在不同的上下文中受到访问,而这些访问又必须互斥,所以在该结构中设置了用于P、V操作的信号量mmap_sem。此外,page_table_lock也是为类似的目的而设置。

虽然每个进程只有一个虚拟地址空间,但这个地址空间可以被别的进程来共享,如,子进程共享父进程的地址空间(也即共享mm_struct结构)。所以,用mm_user和mm_count进行计数。类型atomic_t实际上就是整数,但对这种整数的操作必须是“原子”的。

另外,还描述了代码段、数据段、堆栈段、参数段以及环境段的起始地址和结束地址。这里的段是对程序的逻辑划分,与我们前面所描述的段机制是不同的。

mm_context_t是与平台相关的一个结构,对i386 几乎用处不大。

在后面对代码的分析中对有些域给予进一步说明。

2. VM_AREA_STRUCT 结构

vm_area_struct描述进程的一个虚拟地址区间,在/include/linux/mm.h中描述如下:

struct vm_area_struct

struct mm_struct * vm_mm /* 虚拟区间所在的地址空间*/

unsigned long vm_start/* 在vm_mm中的起始地址*/

unsigned long vm_end /*在vm_mm中的结束地址 */

/* linked list of VM areas per task, sorted by address */

struct vm_area_struct *vm_next

pgprot_t vm_page_prot /* 对这个虚拟区间的存取权限 */

unsigned long vm_flags/* 虚拟区间的标志. */

rb_node_t vm_rb

/*

* For areas with an address space and backing store,

* one of the address_space->i_mmap{,shared} lists,

* for shm areas, the list of attaches, otherwise unused.

*/

struct vm_area_struct *vm_next_share

struct vm_area_struct **vm_pprev_share

/*对这个区间进行操作的函数 */

struct vm_operations_struct * vm_ops

/* Information about our backing store: */

unsigned long vm_pgoff/* Offset (within vm_file) in PAGE_SIZE

units, *not* PAGE_CACHE_SIZE */

struct file * vm_file /* File we map to (can be NULL). */

unsigned long vm_raend/* XXX: put full readahead info here. */

void * vm_private_data/* was vm_pte (shared mem) */

}

vm_flag是描述对虚拟区间的操作的标志,其定义和描述如下

标志名描述

VM_DENYWRITE 在这个区间映射一个打开后不能用来写的文件。

VM_EXEC 页可以被执行。

VM_EXECUTABLE 页含有可执行代码。

VM_GROWSDOWN 这个区间可以向低地址扩展。

VM_GROWSUP 这个区间可以向高地址扩展。

VM_IO 这个区间映射一个设备的I/O地址空间。

VM_LOCKED 页被锁住不能被交换出去。

VM_MAYEXEC VM_EXEC 标志可以被设置。

VM_MAYREAD VM_READ 标志可以被设置。

VM_MAYSHAREVM_SHARE 标志可以被设置。

VM_MAYWRITEVM_WRITE 标志可以被设置。

VM_READ 页是可读的。

VM_SHARED 页可以被多个进程共享。

VM_SHM页用于IPC共享内存。

VM_WRITE页是可写的。

较高层次的结构vm_area_structs是由双向链表连接起来的,它们是按虚地址的降顺序来排列的,每个这样的结构都对应描述一个相邻的地址空间范围。之所以这样分割,是因为每个虚拟区间可能来源不同,有的可能来自可执行映象,有的可能来自共享库,而有的则可能是动态分配的内存区,所以对每一个由vm_area_structs结构所描述的区间的处理操作和它前后范围的处理操作不同。因此Linux

把虚拟内存分割管理,并利用了虚拟内存处理例程(vm_ops)来抽象对不同来源虚拟内存的处理方法。不同的虚拟区间其处理操作可能不同,Linux在这里利用了面向对象的思想,即把一个虚拟区间看成一个对象,用vm_area_structs描述了这个对象的属性,其中的vm_operation结构描述了在这个对象上的操作,其定义在/include/linux/mm.h中:

/*

* These are the virtual MM functions - opening of an area, closing and

* unmapping it (needed to keep files on disk up-to-date etc), pointer

* to the functions called when a no-page or a wp-page exception occurs.

*/

struct vm_operations_struct {

void (*open)(struct vm_area_struct * area)

void (*close)(struct vm_area_struct * area)

struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused)

}

vm_operations结构中包含的是函数指针;其中,open、close分别用于虚拟区间的打开、关闭,而nopage用于当虚存页面不在物理内存而引起的“缺页异常”时所应该调用的函数。

3.红黑树结构

Linux内核从2.4.10开始,对虚拟区的组织不再采用AVL树,而是采用红黑树,这也是出于效率的考虑,虽然AVL树和红黑树很类似,但在插入和删除节点方面,采用红黑树的性能更好一些,下面对红黑树给予简单介绍。

一颗红黑树是具有以下特点的二叉树:

每个节点着有颜色,或者为红,或者为黑

根节点为黑色

如果一个节点为红色,那么它的子节点必须为黑色

从一个节点到叶子节点上的所有路径都包含有相同的黑色节点数


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/50554.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-25
下一篇2023-02-25

发表评论

登录后才能评论

评论列表(0条)

    保存