学习Linux如何申请内存 (linux申请内存)

随着现代计算机所需的资源越来越大,内存对于计算机来说变得越来越重要。在Linux中,申请内存可以使用多种方法。本文将介绍如何在Linux操作系统中申请内存的方法。

一、使用malloc和free

在C语言中,可以使用malloc和free来申请和释放内存。 malloc函数接受一个整数参数,用于指定要申请的内存的大小(以字节为单位),并返回一个指向所申请内存的指针。free函数用于释放通过malloc函数申请的内存。

例如,在以下示例中,我们使用malloc函数申请了10个字节的内存,然后使用指针a指向了这10个字节的内存。最后使用free函数释放了这10个字节的内存。

“`

#include

#include

int mn()

{

char *a;

/* malloc 为指针 a 分配内存 */

a = (char *) malloc(10);

if( a == NULL )

{

printf(“内存分配失败\n”);

exit(0);

}

else

{

printf(“内存分配成功\n”);

}

/* 在内存中写入字符 */

strcpy(a, “coderX”);

printf(“最终的字符串是:%s\n”, a);

/* 释放内存 */

free(a);

return (0);

}

“`

二、使用calloc和realloc

Linux系统还提供了calloc函数和realloc函数来从操作系统申请内存。calloc函数分配指定数量的连续内存块,每块大小为指定大小。重分配函数realloc是在已经分配的内存块属性上进行修改的。如果内存不够用时,它将重新分配更大的内存块,然后将原有内容复制到新的内存块中。

例如,在以下示例中,我们使用calloc函数申请了5个int类型的内存块,然后使用指针p指向这5个内存块。接着使用realloc函数重新分配该内存块,并将其大小加倍。

“`

#include

#include

int mn()

{

int *p;

/* calloc 分配内存 */

p = (int*) calloc(5, sizeof(int));

if( p == NULL )

{

printf(“内存分配失败\n”);

exit(0);

}

else

{

printf(“内存分配成功\n”);

}

/* 写入值到分配的内存中 */

for(int i = 0; i

*(p+i) = i;

}

printf(“数组中的值是:\n”);

for(int i = 0; i

printf(“%d “, *(p+i));

}

printf(“\n”);

/* 重新分配大小 */

p = realloc(p, 10*sizeof(int));

if( p == NULL )

{

printf(“内存分配失败\n”);

exit(0);

}

else

{

printf(“内存重新分配成功\n”);

}

/* 写入新值到扩展的内存中 */

for(int i = 5; i

*(p+i) = i;

}

printf(“扩展后数组中的值是:\n”);

for(int i = 0; i

printf(“%d “, *(p+i));

}

printf(“\n”);

/* 释放内存 */

free(p);

return (0);

}

“`

三、使用mmap

mmap函数可以将外部设备(如文件)映射到进程地址空间中,并可以在进程地址空间内访问它。这是一种申请内存的方法。 mmap(一般情况下)不是用来分配内存的,而是把文件或其他对象映射到虚存中。但是它的确可以用来分配内存,因为内存申请的本质是申请一段虚拟地址空间。只不过,使用mmap()我们还可以从文件(或其他对象)中把内容读入这片地址空间中。

例如,在以下示例中,我们使用mmap函数申请了10个字节的内存,并使用该内存写入了一个字符串。

“`

#include

#include

#include

#include

int mn(int argc, char *argv[])

{

int fd;

char *addr;

fd = open(“/dev/zero”, O_RDWR);

addr = mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);

if (addr == MAP_FLED) {

perror(“mmap fled”);

exit(EXIT_FLURE);

}

close(fd);

strcpy(addr, “coderX”);

printf(“最终的字符串是:%s\n”, addr);

/* 解除映射 */

if (munmap(addr, 10) == -1) {

perror(“munmap fled”);

exit(EXIT_FLURE);

}

return 0;

}

“`

相关问题拓展阅读:

请问一个关于linux内存的问题

我的如下:

$ cat /proc/self/status

Name: cat

State: R (running)

Tgid: 4003

Pid: 4003

PPid: 2694

TracerPid: 0

Uid:0 1000

Gid:0 1000

FDSize: 256

Groups:

VmPeak:kB

VmSize:kB

VmLck:kB

VmHWM:kB

VmRSS:kB

VmData:kB

VmStk:kB

VmExe:kB

VmLib:kB

VmPTE:kB

Threads: 1

SigQ: 0/16382

SigPnd:000

ShdPnd:000

SigBlk:000

SigIgn:000

SigCgt:000

CapInh:000

CapPrm:000

CapEff:000

CapBnd: ffffffffffffffff

Cpus_allowed: f

Cpus_allowed_list: 0-3

Mems_allowed:,

Mems_allowed_list: 0

voluntary_ctxt_switches: 3

nonvoluntary_ctxt_switches: 1

有些系统会设置碰让硬盘一定的空间为内存不足时的存储区如卖,就是平常指的“虚拟内存”

Linux看你用的什么版本了。很正常的。渣吵逗

VMsize是虚拟内存..大于物理内存是正常的。对于VMRSS就不懂了

嗯。。。不了解你说的东东,不过是不是因为虚拟内存啊?

linux怎么管理空闲内存

内存组织层次:页式管理—>(numa)—>node的zonelist—>32位DMA/NORMAL/HIGHMEM三个区,64位没有高端内存—>伙伴分配系统—>slab/slub/slob

2.创建进程时内存分配:实际上只分配task_struct和thread_info的内存,而且很可能是从slab缓存中分配的高圆,当进程运行时由于缺页中断,才由内核层具体分配物理内存并与vm挂接

3.malloc是c runtime中的实现,是上层库的内存分配层,至于液念返内核层的,可以看看__alloc_pages/alloc_pages/kmalloc(小内存直接slab,大内存还是alloc_pages)/vmalloc(alloc_page分配不连续的物理页,映射到连续的vm_struct中的闹饥pages指针数组)/vmap/map_vm_area等几个函数

这个不是很清楚呢

Linux释放内存的命令:

sync

echo 1 > /proc/sys/vm/drop_caches

drop_caches的值可以是0-3之间的数字,代表不同的含义:

0:不释放(系统默认值)

1:释放页缓存

2:释放dentries和inodes

3:释放所有缓存

释放完内存后改回去让系统重新自动分配内存。

echo 0 >/proc/sys/vm/drop_caches

free -m #看内存是否已经释放掉了。

如果我们需要释放所有缓存,就输入下面的命令:迹蠢清

echo 3 > /proc/sys/vm/drop_caches

######### Linux释放内存的相关知识 ###############

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好档手。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空 间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。,此时就需 要执行释放内存(清理缓存)的操作了。

Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分 缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉吗?所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是 释放缓存的操作了。/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改 /proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。要达到释 放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就 是不释放缓存。

一般复制了文件后,可用内存会变少,都被cached占用了,这是linux为了提高文件读取效率的做法:为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。”

释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲姿前区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

# free -m

totalusedfree shared buffers cached

Mem:

-/ buffers/cache:

Swap:

之一行用全局角度描述系统使用的内存状况:

total 内存总数

used 已经使用的内存数,一般情况这个值会比较大,因为这个值包括了cache 应用程序使用的内存

free 空闲的内存数

shared 多个进程共享的内存总额

buffers 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)

cached 缓存,用于已打开的文件

第二行描述应用程序的内存使用:

-buffers/cache 的内存数:used – buffers – cached

buffers/cache 的内存数:free buffers cached

前个值表示-buffers/cache 应用程序使用的内存大小,used减去缓存值

后个值表示 buffers/cache 所有可供应用程序使用的内存大小,free加上缓存值

第三行表示swap的使用:

used 已使用

free 未使用

可用的内存=free memory buffers cached。

为什么free这么小,是否关闭应用后内存没有释放?

但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/ buffers/cache:,这才是系统可用的内存大小。

实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffer或cache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。

一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、OOM错 误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可 能只是把问题给暂时屏蔽了,所以说一般情况下linux都不用经常手动释放内存。

关于linux申请内存的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 学习Linux如何申请内存 (linux申请内存)