Linux的进程与内存管理
学习这么linux这么长时间了,感觉还是没有深入进去了,今天重新看了一遍linux内存管理机制,将这些零碎的笔记写下来,以后也方便记忆,感觉现在真的是很喜欢linux,嘿嘿~ www.zhishiwu.com
Linux内存管理的基础知识
内存管理程序提供以下一些功能
1:大地址空间,用户程序使用的内存数量可以超过物理上实际所有的内存数量
2:内存保护,进程的内存是私有的,不能被其他的进程所读取和修改,而且内存管理程序可以防止进程覆盖代码和只读数据
3:内存映射,可以把一个文件映射到虚拟内存区域,并把该文件当作内存来访问
4;对物理内存的公平访问,内存管理程序确保所有的进程都能公平的访问计算机的内存资源,这样可以确保理想的系统性能
5:共享虚拟内存,内存管理程序允许共享他们的一部分
www.zhishiwu.com
存储空间:
在32为存储系统中,存储空间的地址范围从0*00000000到0*xFFFFFFFF。共4G存储范围
2:内存空间:系统的内存空间特指上面的RAM内存空间
3:内存页:Linux是以页为单位来管理物理内存的,一页大小一般等于4096B。也页容量越大,系统中可能存在的内存碎片越多
进程内存管理
对于任何一个普通文件来讲,都会涉及5种不同的数据段,即代码段,数据段,BBS段,堆和栈
1:代码段,代码段用来存放可执行文件的操作指令,也就是说它是可执行程序在内存中的映像。代码段需要防止在运行时被非法修改,所以只能运行读取操作,不允许写入操作
2:数据段;数据段用来存放可执行文件中已经初始化的全局变量,换句话说就是存放程序的静态分配的变量和全局变量
3:BBS段,BBS段包含了程序中未初始化的全局变量,在内存中BBS全部置零
4:堆(heap)堆用于存放进程中运行中被动态分配的内存段,它的大小并不固定,可以扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态的添加到堆上,当利用free函数释放内存时,被释放的内存从堆中删除
5:栈,栈是用户存放程序临时创建的局部变量。由于栈有先进先出的特点,所以特别方便用来保存/恢复调用现场
~
进程内存的分配与释放
创建进程fork(),程序载入execve(),映射文件mmap(),动态内存分配malloc()等进程相关操作都需要分配内存给进程。不过这时进程申请和获得的还不是实际的内存,而是虚拟内存。进程所能直接操作的地址读为虚拟地址,当进程没有获得物理内存时,从内核获得的仅仅是虚拟的内存区域,而不是实际的物理地址,进程没有获得物理内存,获得仅仅是对一个新的线性地址的使用权。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请求页机制”产生缺页中断,从而进入分配实际页面的例程。
虚拟空间的管理
内核空间和用户空间
在linux系统中,内核在最高级执行,也称为“系统态”,在这一级可以执行任何操作。而在应用程序则执行在最低级,即所谓的“用户态”。在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间运行的”。他们分别应用不同的内存映射,也就是程序代码使用不同的“地址空间”。
模块的作用就是扩展内核的功能,是运行在内核空间的模块化代码。模块的某些函数作为系统调用执行,而某些函数则负责处理中断。各个模块被分别编译并连接成一组目标文件,这些文件能被载入正在运行的内核,或从正在运行的内核中卸载。模块采用的是另一种途径,内核提供一个插槽,它就像一个插件,在需要时,插入内核中使用,不需要从内核中拔出。
内核模块与应用程序存在这区别。应用程序从头到尾完成一个任务,而模块则是为以后处理某些请求而注册自己,完成这个任务后,它的主函数就立即中止了。