为了更加有效的管理存储器并且少出错,现代系统提供了一种对主存的抽象概念,叫做:虚拟存储器
虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
重点:
进程是操作系统建立的概念,这使得程序并发得以实现。
每个进程都拥有自己私有的地址空间。
网络编程:每个程序都在其电脑网卡上登记了一个端口。 网络编程就是面向端口的。
以下出自:
blog.csdn.net/sergery/article/details/8033164
地址空间:
这个很重要,不理解地址空间,你就不理解进程,不理解用户空间,不理解内核空间,不理解虚拟存储,不理解分页机制,你就没学过计算机。操作系统为了支持多任务,保护各个任务合理的共享和隔离一些数据和代码,还为了其他很多原因,必须要让每个任务都有自己的地址空间,就是说你在给编写每个程序代码的时候可以随意读写地址空间内的数据,而不用担心会不会读写到其他程序的代码块中去了。32位OS中,每个程序都有4G的内存空间,就是说A程序可以往0X12345中写一个值,B程序也可以往0X12345中写一个值,两个值虽然表面上写到一个地方去了,但是你根本不用担心,它们根本没有写到一个地方去了,它们都是写在自己的用户空间中,经过几次地址映射就映射到不同的物理地址上去了。4G内存空间的地址就是线性地址,也就是说线性地址就是用来标识这个4G的虚拟的用户空间的。
1、创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟 进程地址空间。之所以是 4GB ,是因为在 32 位的操作系统中,一个指针长度是 4 字节,而 4 字节指针的寻址能力是从 0x00000000~0xFFFFFFFF ,最大值 0xFFFFFFFF 表示的即为 4GB 大小的容量。
2、每个进程只能访问自己虚拟地址空间中的数据,无法访问别的进程中的数据,通过这种方法实现了进程间的地址隔离。
3、4GB 的虚拟地址被分成了 4 部分: NULL 指针区、用户区、 64KB 禁入区、内核区。应用程序能使用的只是用户区而已,大约 2GB 左右 ( 最大可以调整到 3GB) 。内核区为 2GB ,内核区保存的是系统线程调度、内存管理、设备驱动等数据,这部分数据供所有的进程共享,但应用程序是不能直接访问的。
4、目前PC上页面大小为4K,程序运行到哪页就为哪页分配内存,并建立虚拟地址空间页和刚刚建立的物理内存页间的映射。
5、一个PE是一些编译好的数据和指令的集合,也被分为很多页。4G的地址空间并非真正创建,只是创建虚拟地址空间到物理地址空间映射的页表。
6、PE文件中所有的段会一一映射到虚拟地址空间中相应的页。
7、当CPU访问某一个虚拟地址时,发现该地址并没有相关联的物理地址时,产生一个缺页错误,于是CPU将控制权交回OS,OS为该页面映射物理内存。
8、当CPU要访问的数据在内存中时,可以直接访问。
当CPU要访问的数据不再内存中,而位于页交换文件中,OS会在内存中找到一个闲置的页面,如果找不到闲置的页面,先释放一个已分配的页面。
9、页交换文件的左右时物理内存不够时,将部分数据从内存中移到页交换文件中,否则要释放物理内存,删除页面映射关系。