当前位置: 首页 > Web前端 > CSS

Linux中的内存分页

时间:2023-03-31 11:50:42 CSS

内存是计算机的主内存。内存为进程开辟了一个进程空间,让进程在里面保存数据。我会从内存的物理特性出发,深入内存管理的细节,特别是虚拟内存和内存分页的概念。简单地说,内存就是一个数据架子。内存有最小的存储单位,大部分是字节。内存使用一个内存地址(memoryaddress)对每个字节的数据进行顺序编号。因此,内存地址告诉数据在内存中的位置。内存地址从0开始,每次递增1。这种线性增加的内存地址称为线性地址。为了方便,我们用十六进制数来表示内存地址,比如0x00000003、0x1A010CB0。这里“0x”用来表示十六进制。“0x”后面跟一个十六进制数作为内存地址。内存地址的数量是有上限的。地址空间的范围与地址总线中的位数直接相关。CPU使用地址总线向内存指示它要访问数据的地址。以Intel的32位80386CPU为例。这个CPU有32个引脚可以传输地址信息。每个引脚对应一个位。如果引脚上存在高电压,则该位为1。如果是低电压,则该位为0。32位的电压电平信息通过地址总线传输到内存的32个引脚,内存可以将电压电平信息转换成32位的二进制数,从而知道CPU想要什么。数据在哪里。用十六进制表示,32位地址空间为0x00000000到0xFFFFFFFF。存储器的存储单元采用随机存取存储器(RAM,RandomAccessMemory)。所谓“随机读取”,就是内存的读取时间与数据的位置无关。相反,许多存储器的读取时间与数据的位置有关。以磁带为例。如果我们想听其中的一首歌,我们必须打开磁带。如果该歌曲是第一首,则可以立即播放。如果那首歌恰好是最后一首,我们需要很长时间才能快进到可以播放的位置。我们已经知道一个进程需要调用内存中不同位置的数据。如果数据读取时间与位置有关,计算机就很难控制进程的运行时间。因此,随机读取特性是内存成为主存的关键因素。内存提供的存储空间,除了满足内核的运行需要外,通常还可以支持正在运行的进程。即使进程需要的空间超过了内存空间,也可以通过少量扩展来弥补内存空间。也就是说,内存的存储容量相当于计算机运行状态下的数据总量。内存的缺点是不能持久化存储数据。一旦断电,内存中的数据就会消失。因此,即使计算机拥有内存等主存,也仍然需要硬盘等外存来提供持久的存储空间。虚拟内存内存的主要任务之一是存储进程相关的数据。之前我们已经看到了进程空间的程序段、全局数据、栈和堆,以及这些存储结构在进程运行中所起的关键作用。有趣的是,尽管进程和内存之间关系密切,但进程并不能直接访问内存。在Linux下,进程不能直接读写内存中0x1地址的数据。进程中可以访问的地址只能是虚拟内存地址(virtualmemoryaddress)。操作系统将虚拟内存地址翻译成实际内存地址。这种内存管理方式称为虚拟内存。每个进程都有自己的一组虚拟内存地址,用来给自己的进程空间编号。进程空间中的数据也是以字节为单位,顺序递增。从功能上讲,虚拟内存地址与物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址是相互独立的。因此,两个进程空间可以有相同的虚拟内存地址,比如0x10001000。虚拟内存地址和物理内存地址之间存在一定的对应关系,如图1所示,进程对虚拟内存地址的操作会被CPU翻译成对具体内存地址的操作。