虚拟内存和物理内存

参考:

https://blog.csdn.net/lvyibin890/article/details/82217193

https://blog.csdn.net/u012861978/article/details/53048077

https://www.cnblogs.com/panchanggui/p/9288389.html

 

一:PCB

PCB(progress control block),进程控制块。

对于一个进程,它在被执行前其实是一个可执行程序。这个程序是被放在磁盘上的,当它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程。

操作系统通过一个双向链表把进程连起来。但是,对于进程其实它是一个抽象的概念,系统肯定要通过一个东西来描述进程,然后才能管理进程。于是PCB就出来了,操作系统通过PCB来描述进程,于是这个双向链表连接的其实是PCB,这个PCB是个什么玩意?它就是一个结构体,用来描述进程,在Linux下,就是task_struct结构体。

每个进程运行的时候,都会拿到4G的虚拟内存,在32位Linux下,其中3G是交给用户的,1G是交给内核的,而task_struct就是存储在这1G的内核系统空间中。

  • 每个进程都有各自的私有用户空间(0-3G),这个空间对系统中的其他进程是不可见的。
  • 最高的1GB内核空间则为所有进程以及内核所共享。
  • 至于为什么需要这个1G的内核空间,是因为进程需要调用一些系统调用,来交给内核跑,程序的一部分逻辑可能是要交给内核去跑的,所以一部分虚拟地址必须要留给内核使用。

 

PCB中有什么:

  1. 标识相关:pid,ppid等等
  2. 文件相关:进程需要记录打开的文件信息,于是需要文件描述符表
  3. 内存相关:内存指针,指向进程的虚拟地址空间(用户空间)信息
  4. 优先级相关:进程相对于其他进程的调度优先级
  5. 上下文信息相关:CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
  6. 状态相关:进程当前的状态,说明该进程处于什么状态
  7. 信号相关:进程的信号处理函数,以及记录当前进程是否还有待处理的信号
  8. I/O相关:记录进程与各种I/O设备之间的交互

 

二:虚拟内存和物理内存

概念:

1.每个进程都有自己独立的4G(32位系统下)内存空间,各个进程的内存空间具有类似的结构(64位是16EB,理论上。。。)

2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录

3.每个进程已经分配的内存空间,都与对应的磁盘空间映射

 

进程得到的这4G虚拟内存是一个连续的地址空间(这也只是进程认为),而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。

进程开始要访问一个地址,它可能会经历下面的过程

  1. 每次我要访问地址空间上的某一个地址,都需要把地址翻译为实际物理内存地址
  2. 所有进程共享这整一块物理内存,每个进程只把自己目前需要的虚拟地址空间映射到物理内存上
  3. 进程需要知道哪些地址空间上的数据在物理内存上,哪些不在(可能这部分存储在磁盘上),还有在物理内存上的哪里,这就需要通过页表来记录
  4. 页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)
  5. 当进程访问某个虚拟地址的时候,就会先去看页表,如果发现对应的数据不在物理内存上,就会发生缺页异常
  6. 缺页异常的处理过程,操作系统立即阻塞该进程,并将硬盘里对应的页换入内存,然后使该进程就绪,如果内存已经满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的哪个页,就需要看操作系统的页面置换算法是怎么设计的了。

 

 

 

页表的工作原理:

 

 

三:Linux的交换空间与Windows的虚拟内存

Linux 中的交换空间(Swap space)在物理内存(RAM)被充满时被使用。如果系统需要更多的内存资源,而物理内存已经充满,内存中不活跃的页就会被移到交换空间去。虽然交换空 间可以为带有少量内存的机器提供帮助,但是这种方法不应该被当做是对内存的取代。交换空间位于硬盘驱动器上,它比进入物理内存要慢。

Windows的虚拟内存是WINDOWS目录下的一个"WIN386.SWP"文件,这个文件会不断地扩大和自动缩小,拿出一部分硬盘空间来充当内存使用。

 

posted @ 2021-02-01 21:17  Asp1rant  阅读(312)  评论(0编辑  收藏  举报