Discussion:
=?x-gbk?Q?=D5=E2=C0=EF=BB=E1C=B5=C4=C8=CB=D3=A6=B8=C3=BA=DC=B6=E0?= =?x-gbk?Q?=B5=C4=B0=C9=3F=C0=B4=CD=E6=CD=E6=D5=E2=B8=F6?=
(时间太久无法回复)
snnn
2010-02-02 15:29:27 UTC
Permalink
������solaris������������

���Դ������£�
#include <stdlib.h>
#include <unistd.h>
int main(){
void* p=malloc(512*1024*1024);
if(p==NULL) return -1;
sleep(10000000);
return 0;

}


Ȼ������g++ 4.3.2����
g++-4.3.2 -o testm testm.c

����5�������6����ʱ����malloc�ͷ���-1�ˡ����ǣ����ǣ����˾�������
����ʱ��������������vmstat������mdb�����Ҷ����д���Ŀ��е������ڴ�
::memstat
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 144849 565 14%
ZFS File Data 62043 242 6%
Anon 146323 571 14%
Exec and libs 3640 14 0%
Page cache 34357 134 3%
Free (cachelist) 35896 140 3%
Free (freelist) 600734 2346 58%

Total 1027842 4015
Physical 1027841 4015
�����ҿ��⼸������֮ǰ��û�����Եı仯�������ȶ��£���windows�£�����ʱ
��ϵͳ�Ѿ����Ŀ���ƨ�ˣ�

Ȼ������ps���
# ps -eo pid,vsz,rss,args |grep testm
1298 527292 1356 ./testm
1309 4224 1256 grep testm
1300 527292 1356 ./testm
1302 527292 1356 ./testm
1296 527292 1356 ./testm
1304 527292 1356 ./testm

# pmap 1296
1296: ./testm
08046000 8K rwx-- [ stack ]
08050000 4K r-x-- /tmp/testm
08060000 8K rwx-- /tmp/testm
08062000 524296K rwx-- [ heap ]
FEB70000 320K r-x-- /lib/libm.so.2
FEBCF000 8K rwx-- /lib/libm.so.2
FECD0000 24K rwx-- [ anon ]
FECE0000 1280K r-x-- /usr/lib/libc/libc_hwcap1.so.1
FEE20000 28K rwx-- /usr/lib/libc/libc_hwcap1.so.1
FEE27000 8K rwx-- /usr/lib/libc/libc_hwcap1.so.1
FEE30000 52K r-x-- /usr/lib/libgcc_s.so.1
FEE4C000 4K rwx-- /usr/lib/libgcc_s.so.1
FEE50000 4K rwx-- [ anon ]
FEE60000 856K r-x-- /usr/lib/libstdc++.so.6.0.10
FEF45000 160K rwx-- /usr/lib/libstdc++.so.6.0.10
FEF6D000 24K rwx-- /usr/lib/libstdc++.so.6.0.10
FEF80000 4K r--s- /var/ld/ld.config
FEF90000 4K rwx-- [ anon ]
FEFA0000 4K rw--- [ anon ]
FEFB0000 4K rw--- [ anon ]
FEFBE000 180K r-x-- /lib/ld.so.1
FEFFB000 8K rwx-- /lib/ld.so.1
FEFFD000 4K rwx-- /lib/ld.so.1
total 527292K


ϵͳ��ȷ���������̷����˵�ַ�ռ䣨������heap�ж��󣩣�����ѹ������û�и�
�����������ڴ档���벻�����ǣ������ʲô��ܾ��µ����롣
���ڻ������ޣ���û���ҵ���õĻ�����freebsd���ظ�����ʵ�顣����
freebsd.unix-center.net�����������ԣ����ǰ�ÿ�����̷������ڴ���С��64M,
Ȼ������100�������Ľ��̣��ݹ��������Ҫ6G���ڴ棬mallocһֱ���dzɹ��ģ�
�ҵ������ˣ����Ū�ˡ�


����Ȥ������������
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(){
void* p=malloc(512*1024*1024);
if(p==NULL) return -1;
memset(p,0,512*1024*1024);
free(p);
sleep(10000000);
return 0;

}

��ps/pmapȥ������ʵ֤����free����������û���ͷ������ڴ档free�ǰ�malloc
�õ��������ڴ滹�����Լ����̣������ǻ����˲���ϵͳ��
����һ���ϣ�freebsd���в����ġ�ִ����free֮����rss���Խ������
acc
2010-02-03 05:45:46 UTC
Permalink
我想不出的是,它依据什么来拒绝新的申请。
是不是它把自己的虚拟内存地址耗尽了,所以拒绝继续分配(因为已经没有可用的地址了)?
这与我开这几个程序之前,没有明显的变化。(相比而下,在windows下,这个时
候系统已经卡的快嗝屁了)

Windows 的 malloc 调用 HeapAlloc,如果够一定数量(好像是一页?),就调用
VirtualAlloc,提交物理存储器,这个时候就实际占有内存了。而这个 solaris 你也看到了,它并没有分配物理存储器,所以不使用那些虚拟内存时不影响速度。但是在实际用到的时候,肯定是页面失效,然后再映射到物理存储器。
memset(p,0,512*1024*1024);
free(p);
这里你使用了这块内存,然后 free。solaris 是不是这样的:使用时提交物理存储器,用完后不交还,这样第一次的页面失效并重新映射就变成了一次性开销,再次使用这些虚拟内存时,速度会较快?
然后开了100个这样的进程,据估计至少需要6G的内存,malloc一直都是成功的,
我的手酸了,懒得弄了。

开一百个线程试试,看看能不能坚持分到 6G 内存。进程各自的地址空间独立,累计起来应该可以超过 6G。


"snnn" <***@gmail.com> 写入消息 news:hk9gcm$rh5$***@www.shinco.com...
acc
2010-02-03 06:12:34 UTC
Permalink
==========
#include <stdlib.h>
#include <unistd.h>
int main(){
void* p=malloc(512*1024*1024);
if(p==NULL) return -1;
sleep(10000000);
return 0;

}
==========

不过你这个也是进程,怎么开 6 个就不行了……
Post by acc
进程各自的地址空间独立,累计起来应该可以超过 6G。
acc
2010-02-03 06:26:21 UTC
Permalink
#include <stdlib.h>
#include <tchar.h>
int main()
{
void* p = malloc(512 * 1024 * 1024);

if (p)
_tprintf(TEXT("succeed\n"));
else
_tprintf(TEXT("failed\n"));

Sleep(-1);
}

这次我开 3 个系统就慢的不行了,这才知道 Moses 所言非虚。

"snnn" <***@gmail.com> 写入消息 news:hk9gcm$rh5$***@www.shinco.com...
Loading...