目录
一、一个线程占多大内存
一个Linux的线程大概占8M内存。
Linux的栈是通过缺页来分配内存的,不是所有栈地址空间都分配了内存。因此,8M是最大消耗,实际的内存消耗只会略大于实际需要的内存(内部损耗,每个在4K以内)。
二、简述页表及其存在的意义
页表是虚拟内存的概念。
原因:不可能每一个虚拟内存的Byte都对应到物理内存的地址。这张表将大得真正的物理地址也放不下,于是操作系统引入了页(Page)的概念。进行分页,这样可以减小虚拟内存对应物理内存页的映射表大小。
如果将每一个虚拟内存的 Byte 都对应到物理内存的地址,每个条目最少需要 8字节(32位虚拟地址->32位物理地址),在 4G 内存的情况下,就需要 32GB 的空间来存放对照表,那么这张表就大得真正的物理地址也放不下了,于是操作系统引入了页(Page)的概念。
在系统启动时,操作系统将整个物理内存以 4K 为单位,划分为各个页。之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G 内存,只需要 8M 的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且Linux 还为大内存设计了多级页表,可以进一页减少了内存消耗。
三、简述操作系统中的缺页中断
1、缺页异常
malloc和mmap函数在分配内存时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常,引发缺页中断。
2、缺页中断
缺页异常后将产生一个缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。
3、两者区别
缺页中断与一般中断一样,需要经历四个步骤:
保护CPU现场、分析中断原因、转入缺页中断处理程序、恢复CPU现场,然后继续执行。
缺页中断与一般中断的区别:
①在指令执行期间产生和处理缺页中断信号。
②一条指令在执行期间,可能产生多次缺页中断。
③缺页中断返回的是执行中产生中断的一条指令,而一般中断返回的是执行下一条指令。
四、简述虚拟内存分布,何时会由用户态陷入内核态
1、虚拟内存分布
用户空间:
①代码段.text:存放程序执行代码的一块内存区域。只读,代码段的头部还会包含一些只读的常数变量。
②数据段.data:存放程序中已初始化的全局变量和静态变量的一块内存区域。
③BSS段.bss:存放程序中未初始化的全局变量和静态变量的一块内存区域。
④可执行程序在运行时又会多出两个区域:堆区和栈区。
堆区:动态申请使用。堆从低地址到高地址增长。
栈区:存储局部变量、函数参数值、栈从高地址向低地址增长,是一块连续空间。
⑤最后一个是文件映射区,位于堆和栈之间。
2、内核空间
DMA区、常规区、高位区
3、何时进入内核态
①系统调用;
②异常;
③设备中断。
其中系统调用是主动的,另外两种是被动的。
五、简述为什么使用虚拟内存及其优缺点
操作系统为每一个进程分配了一个独立的地址空间,但是虚拟内存。虚拟内存与物理内存存在映射关系,通过页表寻址完成虚拟地址和物理地址的转换。
1、为什么要用虚拟内存?
因为早期的内存分配方法存在以下问题:
①进程地址空间不隔离,会导致数据被随意修改。
②内存使用效率低。
③程序运行的地址不确定。操作系统随机为进程分配内存空间,所以程序运行的地址是不确定的。
2、使用虚拟内存的优点
①扩大地址空间。每个进程独占一个4G空间,虽然真实物理内存没那么多。
②内存保护。防止不同进程对物理内存的争夺和践踏,可以对待定内存地址提供写保护,防止恶意篡改。
③可以实现内存共享,方便进程通信。
④可以避免内存碎片,虽然物理内存可能不连续,但映射到虚拟内存上可以连续。
3、使用虚拟内存的缺点
①虚拟内存需要额外构建数据结构,占用空间。
②虚拟地址到物理地址的转换,增加了执行时间。
③页面换入换出耗时。
④一页如果只有一部分数据,浪费内存。
六、简述虚拟地址到物理地址的映射
操作系统为每一个进程维护了一个从虚拟地址到物理地址的映射关系的数据结构,叫做“页表”。页表中每一项都记录了这个页的基地址。
三级页表转换方法:分为两步
1、逻辑地址转线性地址:段起始地址+段内偏移地址=线性地址
2、线性地址转物理地址:
①每一个32位的线性地址被划分为三部分:页目录索引(DIRECTORY,10位)、页表索引(TABLE,10位)、页内偏移(OFFSET,12位)。
②从cr3中取出进程的页目录地址(操作系统调用进程时,这个地址被装入寄存器中)
页目录地址+页目录索引=页表地址
页表地址+页表索引=页地址
页地址+页内偏移=物理地址
按照以上两步法,就可以完成一个三级页表从虚拟地址到物理地址的转换。