• 虚拟内存


    牵扯到的概念大概有 进程,操作系统,虚拟内存,RAM,交换空间,可执行文件,磁盘

    可执行文件是一个文件,按指定格式记录了OS支持的可执行程序需要的数据,包括程序的指令,指令操作的数据,导出地址,导入的库、函数等。

    磁盘只是用来作为持久存储使用,段电后数据然后保留的。

    现代OS多为同时执行多个程序,为什么要这样?因为资源的利用率问题,CPU比其他硬件快太多,使得在等待IO的同时,CPU可以运行其他程序。

    OS用进程的概念管理程序,官方定义是一个进程代表了一个运行中的程序。

    另外进程的作用是让程序觉得自己是独占整个计算机资源,包括寄存器、CPU/GPU/RAM/磁盘、各种输入输出设备等。而真正的是计算机上同时存在多个程序,
    那怎么模拟这种假象,基本的思路是分时,每个程序运行一会,切换到其他进程。

    对CPU/GPU/寄存器等的模拟:
    大致是在每次进程切换时,保存正在执行进程的CPU/寄存器。。。状态到内存中,加载将要执行的进程上次保存的值到寄存器/CPU,

    对内存的模拟:
    因为指令寄存器是32位原因(32位机器),所以对独占计算机的程序来说,最大内存大小是2^32(4G)大小,OS怎么模拟这个大小,且不说
    一般计算机并没有4G的内存(至少那会是没有的),也不可能说只有一个程序在运行,

    这需要中断+内存映射来实现,比方说我现在计算机只有4M RAM,但我要分配4G内存怎么办,我把4G的空间划分成4K的页,把4M的RAM也划分成4K的页,这样页之间可以相互对

    应,然后我用一个内存管理器(MMC)管理RAM,每次进程需要访问内存时,不直接访问RAM,而是把要访问的地址(这个地址是对于4G大小内存而言)交给MMC,MMC查下这个

    地址所在的页是不是在RAM的某个页里,如果不在就触发一个中断,OS捕获中断后根据相关信息,把需要的数据从磁盘加载到RAM空闲的页(OS知道程序在哪,且可执行文件的

    格式固定),后继续运行中断之前的代码;而如果在,就直接运行。如果RAM已满,就是放满了东西,那就先把一部分能移动的移到交换空间(一般OS在磁盘上开辟一块作为

    交换空间),下次用到这些时会发生一个中断,从而又会加载到RAM里。

    这样看来这里说的4G内存并不是真正意义上的RAM,而是一个虚拟的内存。对进程来说,这就是它的内存。编码时参考的也是这个内存,并不关心用户有多少RAM,由OS完成从

    虚拟内存到实际计算机RAM的映射.

    RAM跟具体某个进程无关,进程看到的只有虚拟内存,RAM+中断+交换空间实现了虚拟内存。

    用这样的方式有很多好处,比如如果RAM中有了某个DLL,现在多个程序使用这个DLL,这时,OS只需要把这些程序的虚拟内存页全部映射到这些RAM也就好,避免了每个程序都

    对应一份RAM,节省了RAM的使用,加快了程序的启动,从这方面讲,内核代码是所有程序公用的,每个程序的高位内存地址全部映射到相同的RAM地址(内核代码)。

    另外进程之间交换数据也能用这种共享的方式,只要修改虚拟内存映射到相同的RAM就可以了。

    还有安全性,因为每个进程访问的都是自己的地址空间,不会轻易访问到其他进程的地址空间。

  • 相关阅读:
    SQL Server 造成cpu 使用率高的 6 原因
    SQL Server SQLOS
    flask数据库操作
    redis数据类型
    python3中__get__,__getattr__,__getattribute__的区别
    强弱类型,动静态语言
    函数式编程和面向对象编程
    数据库事务的四个特性和含义
    流畅的python
    Python中__repr__和__str__区别
  • 原文地址:https://www.cnblogs.com/dioncnblogs/p/VMM.html
Copyright © 2020-2023  润新知