操作系统:详解物理内存与虚拟内存,用户空间与内核态空间

目录

0、基础知识:磁盘与物理内存

1、 通过虚拟地址访问物理内存

1.1 虚拟内存:

1.2 虚拟内存的优势:

1.3 举例说明:

 2、用户空间与内核态空间

2.1 为什么进程的寻址空间要划分为用户空间与内核态空间两部分??不划分呢?

2.2 划分这两部分空间后,用户的IO过程是什么?


0、基础知识:磁盘与物理内存

        磁盘是一种永久性存储介质,通常采用磁性材料制成。它的优点在于容量大、价格低廉、数据可以长期保存等特点。硬盘、光盘、U盘等都属于磁盘存储介质。磁盘上的数据需要通过读写头进行读写,并且相对于内存来说访问速度较慢,因此一般主要用来存储文件和数据,如操作系统、应用程序和用户数据等。

        物理内存(Physical Memory)也称为随机存储器(Random Access Memory,RAM),是计算机系统中的主要内存储器,具有读写速度快、能够直接访问等特点。物理内存是由存储芯片组成,可以在短时间内存取任何一块数据。它是计算机系统中的主要内存储器,用于存储当前正在运行的程序和数据,以便CPU随时读取和计算。物理内存的容量通常比磁盘小得多,但运行速度更快。计算机启动时,操作系统会把部分程序和数据加载到物理内存中,使其能够被CPU快速读取和执行。

        总的来说,磁盘能够保存更多数据,但读取慢,而内存反之。
        因此在操作数据时经常先读入内存在进行操作,但实际上, 电脑内的应用程序和内核空间都无法直接访问物理内存,原因如下:

1、 通过虚拟地址访问物理内存

        即使应用程序或内核空间已经加载到内存中,它们依然无法直接访问物理内存,而必须通过虚拟地址进行访问。这是因为:操作系统需要保证每个进程之间访问内存的隔离性,以避免恶意进程篡改其他进程的内存数据。因此,操作系统会对每个进程的内存操作进行监控和管理,保证每个进程只能访问自己的虚拟地址空间。(因为俩字安全!)

 1.1 虚拟内存:

        简言之,将一部分硬盘空间作为虚拟内存,让应用程序认为自己有更多的内存可用。

        虚拟内存是在磁盘上的一部分空间。当物理内存不足时,操作系统会将不常用的页(Page)或程序暂停使用的页从物理内存中换出(Swap out)到硬盘上的虚拟内存中,以释放空间供活跃进程(Active Process)使用。反之,当一个进程需要访问物理内存中没有被装入的页时,操作系统就会将这些页从磁盘上读取到物理内存中,供该进程进行访问和使用。

        通常,每个进程都拥有自己的虚拟内存空间,该空间被分为多个固定大小的页(Page),与物理内存相对应。当一个进程要访问某个页时,操作系统会将该页从磁盘中装载到物理内存中,并返回给该进程一个指向该页在物理内存中位置的指针(虚拟地址),使得进程可以像访问物理内存一样访问虚拟内存。

1.2 虚拟内存的优势:

(1)内存的动态分配和管理:进程只需要访问部分虚拟内存,而不需要将整个地址空间全部加载到物理内存中。当物理内存不足时,操作系统会选择一些不活跃的页(即长时间没有被访问过的页)进行置换,将其从物理内存中移出,并将需要访问的新页从磁盘中读入到物理内存中,从而实现了内存的动态分配和管理。

(2)虚拟内存的另一个好处是,它使得进程可以访问不连续的物理地址空间,因为虚拟地址是由操作系统进行映射,与实际物理地址没有直接的关系。这样就允许了操作系统对内存地址的动态分配和管理,从而提高了系统的可靠性、安全性和灵活性。

1.3 举例说明:

        比如一个进程要读取它内存中的变量 var,var 的虚拟地址为 0x1000,而它对应的物理地址是 0x2000。这时候,操作系统需要将进程中的虚拟地址 0x1000 映射到物理地址 0x2000,以便进程能够顺利地访问该变量。

        当进程访问一个虚拟地址时,CPU 会发起一个页表查找请求,将该虚拟地址转换成对应的物理地址,然后再进行访问。页表则是一张表格,记录了虚拟地址和物理地址之间的对应关系,由操作系统维护并根据需要进行更新。这是由CPU自动完成的。

操作系统:详解物理内存与虚拟内存,用户空间与内核态空间_第1张图片

 2、用户空间与内核态空间

2.1 为什么进程的寻址空间要划分为用户空间与内核态空间两部分??不划分呢?

        我们知道,计算机硬件包括,如cpu,内存,网卡等等,内核(通过寻址空间)可以操作硬件的,但是内核需要不同设备的驱动,有了这些驱动之后,内核就可以去对计算机硬件去进行 内存管理,文件系统的管理,进程的管理等等。
        当我们想要用户的应用来访问,计算机就必须要通过对外暴露的一些接口,才能访问到,从而简介的实现对内核的操控,但是内核本身上来说也是一个应用,所以他本身也需要一些内存,cpu等设备资源,用户应用本身也在消耗这些资源,如果不加任何限制,用户去操作随意的去操作我们的资源,就有可能导致一些冲突,甚至有可能导致我们的系统出现无法运行的问题,因此我们需要把用户和内核隔离。
        总结:为了安全与稳定。

2.2 划分这两部分空间后,用户的IO过程是什么?

        Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区buffer

        写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备

        读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区操作系统:详解物理内存与虚拟内存,用户空间与内核态空间_第2张图片

        针对这个操作:我们的用户在写读数据时,会去向内核态申请,想要读取内核的数据,而内核数据要去等待驱动程序从硬件上读取数据,当从磁盘上加载到数据之后,内核会将数据写入到内核的缓冲区中,然后再将数据拷贝到用户态的buffer中,然后再返回给应用程序,整体而言,速度慢,就是这个原因,为了加速,我们希望read也好,还是wait for data也最好都不要等待,或者时间尽量的短。

你可能感兴趣的:(数学建模)