导航:首页 > 物理学科 > 怎么分配程序物理运行内存

怎么分配程序物理运行内存

发布时间:2022-10-21 00:03:21

A. win10系统,怎么增加分配给某个程序的物理内存

系统是动态分配内存的,小软件不占内存,所以1G足够运行。

B. 操作系统执行可执行程序时,内存分配是怎样的

在操作系统中,一个进程就是处于执行期的程序(当然包括系统资源),实际上正在执行的程序代码的活标本。那么进程的逻辑地址空间是如何划分的呢?

图1做了简单的说明(Linux系统下的):

图一

左边的是UNIX/LINUX系统的执行文件,右边是对应进程逻辑地址空间的划分情况。

一般认为在c中分为这几个存储区: 1. 栈 --有编译器自动分配释放 2. 堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3. 全局区(静态区) -- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。 4. 另外还有一个专门放常量的地方。程序结束释放。 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。比如:代码:

int a = 0; //全局初始化区

char *p1; //全局未初始化区

main(){

int b; //栈

char s[] = "abc"; //栈

char *p2; //栈

char *p3 = "123456"; //123456在常量区,p3在栈上。

static int c = 0; //全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456");//123456放在常量区,编译器可能会将它与p3所指向 的"123456"优化成一块。

}

还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。 栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。 堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。 在栈上存取数据比通过指针在堆上存取数据快些。 一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。

堆(heap)和堆栈(stack)的区别

2.1申请方式stack:由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间heap:需要程序员自己申请,并指明大小,在c中malloc函数

如p1 = (char *)malloc(10);

在C++中用new运算符

如p2 = (char *)malloc(10);

但是注意p1、p2本身是在栈中的。

2.2 申请后系统的响应栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

2.3

2.4申请效率的比较:栈由系统自动分配,速度较快。但程序员是无法控制的。堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

2.5堆和栈中的存储内容栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

2.6存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";

char *s2 = "bbbbbbbbbbbbbbbbb";

aaaaaaaaaaa是在运行时刻赋值的;

而bbbbbbbbbbb是在编译时就确定的;

但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

比如:#include <...>

void main(){

char a = 1;

char c[] = "1234567890";

char *p ="1234567890";

a = c[1];

a = p[1];

return;

}

对应的汇编代码

10: a = c[1];

00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]

0040106A 88 4D FC mov byte ptr [ebp-4],cl

11: a = p[1];

0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

00401070 8A 42 01 mov al,byte ptr [edx+1]

00401073 88 45 FC mov byte ptr [ebp-4],al

第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。

2.7小结:堆和栈的区别可以用如下的比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。堆和栈的区别主要分:操作系统方面的堆和栈,如上面说的那些,不多说了。还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

申请大小的限制栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放5、程序代码区(text)—存放函数体的二进制代码。

C. 双系统运行内存如何分配

不需要人为分配,系统本身就会管理。
系统自动管理即可,因为双系统不能同时运行,所以运行其中一个系统时,另一个系统是不占用内存的(没有运行),它只占用硬盘空间而已。

双系统在安装的时候,两个系统是分别装在不同的分区内,后安装的系统不会覆盖前一个系统。而且每个单独的系统都有自己的分区格式,不会造成冲突。安装了双系统后,在启动的时候,有一个多重启动的选择菜单,可以选择进入哪个操作系统。当前状态下,只有一个系统是在运行的,不能随意的切换。如果想要进入另外一个,就要重新启动,重新选择。

D. 编译时分配内存和运行时分配内存

编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。
我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。

当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区:
栈、堆、bss、data、code

代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。

E. 物理内存与虚拟内存的分配情况

虚拟内存是将物理硬盘的一部分充当内存使用,当运行程序较大时,在物理内存不够用的情况调用虚拟内存。虚拟内存一般设置为物理内存的1.5倍左右就可以的。为防止虚拟内存过低的情况发生,建议将虚拟内存位置设置在非系统盘的其他分区。

F. 虚拟内存和物理内存怎么分配啊

显卡的问题一般。
虚拟内存一般设定为物理内存的1.5到2倍。
你可以搜索下怎么分配显存
开机时按F2健进入BIOS设置.用键盘方向键选择Advanced选项.
再选择依次选择Chipest Configuration-->NorthBridge Configuration-->Share Memory.

这里应该有几个选择的,其中AUTO表示让系统自动分配显存,应该还有32/64/128M的选择. 选中你想要的.然后按ESC键退出,
选择Save changes and Exit键保存并退出~~~
建议你抄下选项的英文再重启操作~~~

````````````
如果你用的是AWARD的BIOS的话, 可以按一下的步骤:

开机时按着 Delete键进入BIOS。

选择: Advance Chipest Features

在 Frame Buffer Size 里用键盘上的“PageUP/PageDown ” 键来调节的。

接F10键保存,重启就可以了

我们知道,许多应用程序(包括操作系统在内)都要求显卡的内存容量达到最低要求值时才能正常运行(甚至才能完全运行),因此,集成显卡的芯片组都使用了一些智能技术,在需要的时候用共享内存的方法来增加显存的容量,达到能运行应用程序的目的。主流的AMD、NVIDIA、Intel集成显示芯片,在分配显存方面有各自的解决方案,下面就来看看在不同情况下它们分别共享了多少系统内存。
一、HyperMemory
HyperMemory是ATI提出的“允许图形卡和CPU共享系统内存,同时将可能出现的性能冲突降到最低的一项技术”,HyperMemory技术的主要特点在于允许核心通过System Bus Interface利用PCI Express总线庞大的带宽直接访问系统内存,在需要时将数据置于系统内存中进行操作,并通过新添加的Memory Controller对本地显存和系统内存的访问与操作进行协调管理,使核心能更加合理、充分地利用本地显存和系统内存的资源,达到最终扩展总显存容量的目的。
以下为映泰TA690G AM2主板搭配512MB、1GB、2GB内存,在采用HyperMemory技术后,能分配的容量。
BIOS设置“UMA Frame Buffer Size”为“Auto”时,物理内存总容量为2GB时候的测试图:

注:上表列出了BIOS设置的各种情况下,通过HyperMemory技术显存所分配的系统内存的值。当然,这只是最大限制值,实际使用仍然是按需获取的。
二、DVMT 动态显存技术
那么基于Intel 845G/865G/915G/945G/965G芯片组的集成显卡又能共享多少系统内存呢?答案是:视情况而定。
显存容量大小取决于系统以及动态分配共享显存技术(DVMT) 设置的预分配内存。DVMT用于动态分配系统内存作为显存,以确保最有效地利用可用资源来获得最佳2D/3D 图形性能。所分配的显卡内存容量取决于操作系统要求的内存量,当不再需要内存时,将它返还操作系统供其它应用程序或系统功能使用。DVMT根据系统需求分配内存。BIOS 选项(DVMT/FIXED Memory),用于调整可用于 DVMT 的内存容量。
动态分配的内存最高可达图形驱动程序设置的最大值,里面有提供64MB、128MB、256MB设置。DVMT 分配显存的最大限制取决于具体Intel芯片组和所安装的显卡驱动程序的版本。所以,运行应用程序时,通过各芯片组厂家的动态分配显存的方式,显存容量方面可以得到充足的保障,有效地提高了集成显卡的2D/3D图形性能。
三、TurboCache
TurboCache 技术利用额外的 PCI Express 图形总线带宽达到了超出传统显卡内存解决方案的更高图形性能,提供了你所期望的NVIDIA图形硬件的性能和功能。通过允许图形处理单元 (GPU) 共享专用显卡内存和动态可用系统内存的容量和带宽,TurboCache 提升了性能,提供了更大的图形总内存。
TurboCache 架构的主要功能特点:
1.专利硬件和软件技术,直接渲染到系统内存;
2.TurboCache Manager(TCM)可以动态分配内存以获得最大的系统性能;
3.智能软件算法可以最大化应用程序性能;
4.双向 PCI Express带宽配合 TurboCache 架构,提升了图形性能。
以下为七彩虹 C.N7050PV分别搭配512MB、1GB、2GB内存,在采用TurboCache技术后能分配到的显存容量:
在使用2GB内存时,默认物理分配64MB,不过采用TurboCache技术后最大可以获得256MB显存容量而在游戏过程中检测到的可使用显存容量为256MB。

G. 物理内存与虚拟内存该怎样分配

虚拟内存设置在系统分区以外的分区,有助于系统运行。
我的电脑-属性-高级-性能-设置-高级-虚拟内存-更改
点C:/

无分页文件

设置
选择一个剩余空间大的其他分区

自定义大小
输入
初始大小
和最大值

设置
确定
重启计算机。
再说虚拟内存应该设置到多少,才能让系统发挥好效果。
一般初始大小设置到物理内存的1到
1.5倍
,最大值设置到物理内存的2.5到3倍。
打个比方如果物理内存是1G,那初始大小设置1024MB或者1500MB,
最大值设置2500MB或者3000M
2G以上物理内存的电脑,不用设置虚拟内存。虚拟内存最大值为5000MB,不要超出范围。

H. 操作系统执行可执行程序时,内存分配是怎样的

如果是集显,执行程序时需要调动集显,有一部分的物理内存会被分配给集显来使用,如果是独显,那就没问题了,独显自己带有内存,不需要共享(部分显卡除外,有些性能强劲的显卡可以分享内存,增加性能),这时候的内存就是你系统所能识别的内存。

从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

(8)怎么分配程序物理运行内存扩展阅读:

C++的内存分配:

根据C++的语法规范,定义数组时数组长度必须用常量而不能用变量表示,此时可以使用动态内存分配解决这一问题。

动态内存分配是指在程序运行时为程序中的变量分配内存空间,它完全由应用程序自己进行内存的分配和回收。

程序运行时,特别要注意的是内存的分配。有以下六个地方都可以保存数据。

I. 如何分配物理内存

物理内存是你电脑本身的内存大小比如256,512或者更大1G,物理内存大小就取决于你的内存条大小,这是硬件是没办法设置的。
合理设置虚拟内存
1、内存的设定主要根据你的内存大小和电脑的用途来设定。所谓虚拟内存就是在你的物理内存不够用时把一部分硬盘空间所为内存来使用,不过由于硬盘传输的速度要比内存传输速度慢的多,所以使用虚拟内存比物理内存效率要慢。个人实际需要的值应该自己多次调整为好。
设的太大会差生大量的碎片,严重影响系统速度,设的太小就不够用,于是系统就会提示你虚拟内存太小。
2、一般情况下,可让Windows来自动分配管理虚拟内存,它能根据实际内存的使用情况,动态调整虚拟内存的大小。
3、定义虚拟内存,一般默认的虚拟内存大小是取一个范围值,最好给它一个固定值,这样就不容易产生磁盘碎片,具体数值根据你的物理内存大小来定,256MB一般设为512MB
,玩游戏可设大一些,设为768MB。
4、拟内存最好不要与系统设在同一分区内,内存是随着使用而动态地变化,C盘就容易产生磁盘碎片,影响系统运行速度,所以,最好将虚拟内存设置在其它分区中磁盘剩余空间较大而又不常用而又靠前的盘中,如D、E,这样可以避免系统在此分区内进行频繁的读写操作而影响系统速度。虚拟内存在一台电脑中,只能是一个,可放在磁盘的任何一个分区中。

J. 电脑内存如何分配(系统优化)

1、内存的大小是无法手动分配的,你所说的内存应该是在硬盘上划出的虚拟缓存。
2、虚拟缓存的大小是可以手动划分的,每个分区的上限一般是4095K(如果你的硬盘剩余空间足够的话)。
3、虚拟缓存并不是越大越好,是根据你的物理内存的大小来决定的。正常情况(内存小于256M)下是物理内存的1.5倍,当你的内存超过256M后,应当适当减少虚拟缓存的大小。应为内存的读写速度要远远超过硬盘的读写速度,当内存足够大的时候,减小虚拟缓存是有益于提高系统运行速度的。当然,如上所说,都是针对普通用户的,当你经常从事图像处理,影音编辑和运行大型游戏时,往往再大的物理内存都显得力不从心,这时就需要分配大一些的虚拟缓存,最好不要分配在C:盘上。
4、虚拟缓存的分配方法如下:鼠标右键点击我的电脑,选<属性>→<高级>,点击<性能>里的<设置>→<高级>,点击<虚拟内存>里的<更改>,这时 你就可以更改你的虚拟缓存了。建议将虚拟缓存设置在你不经常使用的分区上。

阅读全文

与怎么分配程序物理运行内存相关的资料

热点内容
word中化学式的数字怎么打出来 浏览:740
乙酸乙酯化学式怎么算 浏览:1406
沈阳初中的数学是什么版本的 浏览:1353
华为手机家人共享如何查看地理位置 浏览:1045
一氧化碳还原氧化铝化学方程式怎么配平 浏览:886
数学c什么意思是什么意思是什么 浏览:1411
中考初中地理如何补 浏览:1300
360浏览器历史在哪里下载迅雷下载 浏览:703
数学奥数卡怎么办 浏览:1388
如何回答地理是什么 浏览:1025
win7如何删除电脑文件浏览历史 浏览:1058
大学物理实验干什么用的到 浏览:1487
二年级上册数学框框怎么填 浏览:1701
西安瑞禧生物科技有限公司怎么样 浏览:976
武大的分析化学怎么样 浏览:1250
ige电化学发光偏高怎么办 浏览:1339
学而思初中英语和语文怎么样 浏览:1651
下列哪个水飞蓟素化学结构 浏览:1425
化学理学哪些专业好 浏览:1488
数学中的棱的意思是什么 浏览:1059