虚拟内存的作用是什么 虚拟内存有什么用( 十 )


char s[8];int i;gets(s); /* reads "123456789" from stdin */第四种是没有正确理解指针的大小以及对应的操作 , 应该使用 sizeof(int *)
int *search(int *p, int val) { while (*p && *p != null) p += sizeof(int); return p;}第五种是引用了指针 , 而不是其指向的对象 , 下面的例子中 , *size– 一句因为 –的优先级比较高 , 所以实际上是对指针进行了操作 , 正确的应该是 (*size)–
int *BinheapDelete(int **binheap, int *size) { int *packet; packet = binheap[0]; binheap[0] = binheap[*size - 1]; *size--; Heapify(binheap, *size, 0); return (packet);}8.4.4 引用不存在的变量下面的情况中 , 没有注意到局部变量会在函数返回的时候失效(所以对应的指针也会无效) , 这是传引用和返回引用需要注意的 , 传值的话则不用担心
int *foo() { int val; return &val;}8.4.5 多次释放同一块内存这个不用多说 , 不能重复搞两次
x = malloc(N * sizeof(int));// <manipulate x>free(x);y = malloc(M * sizeof(int));// <manipulate y>free(x);8.4.6 引用已释放的块同样是很明显的错误 , 不要犯
x = malloc(N * sizeof(int));// <manipulate x>free(x);// ....y = malloc(M * sizeof(int));for (i = 0; i < M; i++) y[i] = x[i]++;8.4.7 内存泄漏用完没有释放 , 就是内存泄露啦
foo() { int *x = malloc(N * sizeof(int)); // ... return ;}或者只释放了数据结构的一部分:
struct list { int val;};foo() { struct list *head = malloc(sizeof(struct list)); head->val = 0; head->next = NULL; //... free(head); return;}9 垃圾回收垃圾回收自动回收堆分配的存储 , 程序不必显式地释放内存 , 这种机制在许多动态语言中都有实现:Python, Ruby, Java, Perl, ML, Lisp, Mathematica 。 C 和 C++ 中也有变种 , 但是注意 , 不可能回收所有垃圾 。
如何知道什么东西才是垃圾?只要没有任何指针指向的地方 , 不管有没有用 , 因为都不可能被使用 , 当然可以直接清理掉 。 不过这其实是需要一些前提条件的:
可以知道哪里是指针 , 哪里不是指针
每个指针都指向 block 的开头
指针不能被隐藏(by coercing them to an int, and then back again)
相关算法如下:
Mark-and-sweep collection (McCarthy, 1960)
Reference counting (Collins, 1960)
Copying collection (Minsky, 1963)
Generational Collectors(Lieberman and Hewitt, 1983)
9.1 Mark&Sweep垃圾收集器可在malloc/free包之上构建 , 用malloc分配直到空间耗尽 。 当空间不足时 , 在每个块的头用额外的标记位标记 , 标记阶段标记出根节点所有可达的和已分配的后继 , 在每个可达的块上设置标记位 , 后面的清除释放每个未被标记的已分配块

虚拟内存的作用是什么  虚拟内存有什么用

文章插图

9.2 简单实现应用:
new(n):返回指向清除所有位置的新块的指针
read(b,i):读块b在i处的值到寄存器
wreite(b,i,v):写v到块b的i处
每个块都有一个头:块b的头的地址是b[-1] , 在不同的收集器中用于不同目的
垃圾收集器使用的指令:is_ptr(p)检测p是否是指针 , length(b)返回块b的长 , 不包括头 , get_roots()返回所有的roots
虚拟内存的作用是什么  虚拟内存有什么用

文章插图

10 总结首先介绍虚拟内存等方面的知识 , 具体来说:
从程序员角度看虚拟内存:
每个进程有自己的私有线性地址空间
不能被其他进程破坏
从系统角度看虚拟内存:
通过缓存虚拟内存页更有效地使用内存(局部性原理)