1.操作系统提供给程序员创建进程的方法?这些方法分别都是怎么工作的?(参考)
fork()
vfork()
clone()
2.内存管理是什么,内存管理的内容有哪些(参考)
- 操作系统对内存空间进行合理的划分及动态分配。
- 操作系统负责内存空间的分配与回收。
- 操作系统需要提供某种技术从逻辑.上对内存空间进行扩充。
- 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换。
- 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰(上下限寄存器和重定位寄存器界地址寄存器)
3.内存空间的几种分配方法?
- 连续分配:为一个用户程序分配一个连续的内存空间,装入内存的程序逻辑地址相邻且物理地址也相邻。
- 单一连续分配:单道程序环境
- 固定分区分配:将整个用户空间划分成为固定大小的区域。
- 动态分区分配:根据进程的实际大小,分配内存空间。有外部碎片。
- 动态可重定位分区分配
- 非连续分配
- 分页存储
- 将程序数据分页,在内存中按物理块存储,使用页表记录物理块号
- 逻辑地址:页号=逻辑地址/页大小,页内偏移=逻辑地址%页大小
- 地址变换:物理地址=页表寄存器中的页表始址+页号(查到块号)+页内偏移(需要进行越界中断的判断)(只需要直到物理块的逻辑地址,一维)
- 具有TLB的地址变换机构:快表放在高速缓存中,查找页表时先去快表中查询,没有再去内存中的页表中查找
- 两次访存:页表和物理块
- 分段存储
- 按照程序自身的逻辑关系划分为若千个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址
- 逻辑地址:段号+段内偏移
- 段表内容:(段号)段长+基址
- 地址变换:物理地址=段表始址+段号+偏移量(查找段表需要知道段号和段内偏移量,二维)
- 两次访存:段表和段
- 段页式存储
- 将进程按逻辑模块分段,再将各段分页(如每个页面4KB )再将内存空间分为大小相同的内存块/页框/页帧/物理块进程前将各页面分别装入各内存块中
- 逻辑地址:段号+页号+页内偏移量
- 段表结构:(段号)段状态+页表大小+页表始址
- 地址变换:通过段号和段表寄存器找到页表始址,然后通过页表始址和提供的页号找到物理块号(通过段表长度和页表长度判断越界中断)
- 三次访存:段表、页表和物理块
- 请求分页
- 请求分段
- 请求段页式
- 分页存储
4.两级页表是怎么实现的?
5.什么是局部性原理?
- 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
- 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)
6.虚拟存储的作用?为什么虚拟存储可以实现?怎么实现的?
- 传统存储方式具有一次性驻留性的缺点:
- 一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:①作业很大时,不能全部装入内存,导致大作业无法运行;②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
- 驻留性:一旦作业被装入内存,就会- 直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一-小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。
- 虚拟存储即基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当所访问的信息不在内存时, 由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。在操作系统的管理下,在用户看来似乎有-一个比实际内存大得多的内存(操作系统虚拟性的一个体现,实际的物理内存大小没有变,只是在逻辑上进行了扩充)
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
7.几种页面置换算法?比如请求分页页面置换算法,clock置换算法?
LRU需要采用硬件机制实现:寄存器或者栈