07 数据管理

7.1 内存管理

虚拟内存

linux不允许程序直接访问内存,而是为程序提供了一个虚拟内存。linux还提供内存保护机制,避免不同程序之间的相互干扰。每个程序只会看到自己的内存镜像,只有操作系统知道物理内存是如何安排的。

交换空间(swap space)是在磁盘中的一段地址,被内核用作虚拟内存的一部分。如果程序要读写的内容不在实际的物理内存中,则内核会进行换页。但注意,这属于IO操作,会很慢。

虚拟内存机制可以让程序访问到比实际内存大得多的空间,我们的linux内存是2048mb,下面的例子中malloc函数一共为程序分配了4096mb。

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#define A_MEGABYTE (1024 * 1024)
#define PHY_MEM_MEGS 2048
int main()
{
char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
int megs_obtained = 0;
while (megs_obtained < (PHY_MEM_MEGS * 2)) {
some_memory = (char *)malloc(size_to_allocate);
if (some_memory != NULL) {
megs_obtained++;
sprintf(some_memory, "Hello World");
printf("%s - now allocated %d Megabytes\n", some_memory, megs_obtained);
} else {
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}

滥用内存

#include<stdio.h>
#include<stdlib.h>
#define ONE_K (1024)
int main()
{
char *some_memory;
char *scan_ptr;
some_memory = (char *)malloc(ONE_K);
if (some_memory == NULL) exit(EXIT_FAILURE);
scan_ptr = some_memory;
while (1) {
*scan_ptr = '\0';
scan_ptr++;
}
exit(EXIT_SUCCESS);
}

上面的程序无止尽的改分配的内存,当scan_ptr直到分配的内存的后面时,内核就会包下面的错误

leo@ubuntu:~/c_test$ ./a.out
Segmentation fault (core dumped)