Linux你必须知道的小知识-5

422 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

2.15 简述操作系统中的缺页中断。

参考回答

  1. 缺页异常:malloc和mmap函数在分配内存时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常,引发缺页中断
  2. 缺页中断:缺页异常后将产生一个缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存

答案解析

两者区别。

缺页中断与一般中断一样,需要经历四个步骤:保护CPU现场、分析中断原因、转入缺页中断处理程序、恢复CPU现场,继续执行。
缺页中断与一般中断区别:
(1)在指令执行期间产生和处理缺页中断信号
(2)一条指令在执行期间,可能产生多次缺页中断
(3)缺页中断返回的是执行产生中断的一条指令,而一般中断返回的是执行下一条指令。

2.16 说说虚拟内存分布,什么时候会由用户态陷入内核态?

参考回答

  1. 虚拟内存分布

image-20201219142536149

​ 用户空间

​ (1)代码段.text: 存放程序执行代码的一块内存区域。只读,代码段的头部还会包含一些只读的常数变量。

​ (2)数据段.data: 存放程序中已初始化的全局变量和静态变量的一块内存区域。

​ (3)BSS 段.bss:存放程序中未初始化的全局变量和静态变量的一块内存区域。

​ (4)可执行程序在运行时又会多出两个区域:堆区和栈区

​ 堆区: 动态申请内存用。堆从低地址向高地址增长。

​ 栈区: 存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。

​ (5)最后还有一个文件映射区,位于堆和栈之间。

​ 内核空间:DMA区、常规区、高位区。

  1. 什么时候进入内核态:共有三种方式:a、系统调用。b、异常。c、设备中断。其中,系统调用是主动的,另外两种是被动的。

2.17 简述一下虚拟内存和物理内存,为什么要用虚拟内存,好处是什么?

参考回答

  1. 物理内存:物理内存有四个层次,分别是寄存器、高速缓存、主存、磁盘。

    寄存器:速度最快、量少、价格贵。

    高速缓存:次之。

    主存:再次之。

    磁盘:速度最慢、量多、价格便宜。

    image-20201219105446608

    操作系统会对物理内存进行管理,有一个部分称为内存管理器(memory manager) ,它的主要工作是有效的管理内存,记录哪些内存是正在使用的,在进程需要时分配内存以及在进程完成时回收内存。

  2. 虚拟内存:操作系统为每一个进程分配一个独立的地址空间,但是虚拟内存。虚拟内存与物理内存存在映射关系,通过页表寻址完成虚拟地址和物理地址的转换。

  3. 为什么要用虚拟内存:因为早期的内存分配方法存在以下问题:

    (1)进程地址空间不隔离。会导致数据被随意修改。

    (2)内存使用效率低。

    (3)程序运行的地址不确定。操作系统随机为进程分配内存空间,所以程序运行的地址是不确定的。

  4. 使用虚拟内存的好处

    (1)扩大地址空间。每个进程独占一个4G空间,虽然真实物理内存没那么多。

    (2)内存保护:防止不同进程对物理内存的争夺和践踏,可以对特定内存地址提供写保护,防止恶意篡改。

    (3)可以实现内存共享,方便进程通信。

    (4)可以避免内存碎片,虽然物理内存可能不连续,但映射到虚拟内存上可以连续。

  5. 使用虚拟内存的缺点

    (1)虚拟内存需要额外构建数据结构,占用空间。

    (2)虚拟地址到物理地址的转换,增加了执行时间。

    (3)页面换入换出耗时。

    (4)一页如果只有一部分数据,浪费内存。