进程对动态内存的请求被认为是不紧迫的。例如,当进程的可执行文件被装入时,进程并不一定立即对所有的代码进行访问。类似地,当进程调用malloc() 请求动态内存时,并不意味着进程很快就会访问所有获得的内存。因此一般来说,内核总是尽量推迟给用户态进程动态分配内存。
The kernel succeeds in deferring the allocation of dynamic memory to processes by using a new kind of resource. When a User Mode process asks for dynamic memory, it doesn't get additional page frames; instead, it gets the right to use a new range of linear addresses, which become part of its address space. This interval is called a "memory region." 内核使用一种资源成功实现了对进程动态内存的推迟分配。当用户态进程请求动态内存时,并没有获得请求的页框,而仅仅获得对一个新的线性地址区的使用权,而 这一线性地址区间就成为进程地址空间的一部分。这个区间叫做线性区(memory region). brk()是最常用的系统调用,用户进程通过它向内核申请空间(memory region或许还有page frames)。通过malloc()一类的C语言库函数间接地用到brk()。如果把malloc()想像成零售,brk()就是批发。库函数 malloc()为用户进程维护一个小仓库,当进程需要使用更多的内存空间时就向小仓库要,小仓库中存量不足时就通过brk()向内核批发。alloc ()是如何间接用到brk()的?《情景分析(上)》P160 malloc() 注: calloc() malloc()实践 int main() char *b; 注: (2) |------------|------------|--------------| | -| | | | | | | | | -| | | | | | |---------| | -| | | | | | | a | | -| | | | | | | ... |10bytes | -| | | | | | | ... | +->| |--+ +-->| |--+ | | a | | | -| | | -| +--->|- -------| | | -| | | -| | | |---------| -+---->|---------| -+----->|---------| 页目录表 页表 存放有效数据的物理页 物理内存 memset(a, 'a', 10);执行后 (3) 如果有新的动态内存请求b = malloc(),指针a所释放的进程空间可能会被重新分配。用指针a然依然可以访问(读或者写)该进程空间所对应的物理空间(该物理空间是访问新指针时由缺页异常为新指针分配的,可能就是为指针p所分配的物理内存)(不会报错),但是这样的操作是非法的,因为该空间可能已经被新的主人(新指针)所管理。 (4) (5) |
malloc()和calloc()
2007年06月15日 星期五 15:57
【上篇】《Oracle Database 11g SQL 开发指南》学习笔记——第四章_使用简单函数(一)
【下篇】项目管理驾御术 项目管理学习笔记一:信息化知识项目管理学习笔记二:信息系统服务管理项目管理学习笔记三:项目管理一般知识项目管理学习笔记四:项目立项管理项目管理学习笔记五:项目整体管理项目管理学习笔记六:项目范围管理产品版本改造中的项目管理电信运营商系统集成项目需求调研日志
【下篇】项目管理驾御术 项目管理学习笔记一:信息化知识项目管理学习笔记二:信息系统服务管理项目管理学习笔记三:项目管理一般知识项目管理学习笔记四:项目立项管理项目管理学习笔记五:项目整体管理项目管理学习笔记六:项目范围管理产品版本改造中的项目管理电信运营商系统集成项目需求调研日志