我和面试官之间关于操做系统的一场对弈!写了好久,但愿对你有帮助!

你们好,我是 Guide 哥!不少读者抱怨计算操做系统的知识点比较繁杂,本身也没有多少耐心去看,可是面试的时候又常常会遇到。因此,我带着我整理好的操做系统的常见问题来啦!这篇文章总结了一些我以为比较重要的操做系统相关的问题好比进程管理内存管理虚拟内存等等。html

文章形式经过大部分比较喜欢的面试官和求职者之间的对话形式展开。另外,Guide 哥也只是在大学的时候学习过操做系统,不过基本都忘了,为了写这篇文章这段时间看了不少相关的书籍和博客。若是文中有任何须要补充和完善的地方,你均可以在评论区指出。若是以为内容不错的话,不要忘记点个在看哦!java

我我的以为学好操做系统仍是很是有用的,具体能够看我昨天在星球分享的一段话:git

<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/image-20200329145912767.png" height="666"/>github

这篇文章只是对一些操做系统比较重要概念的一个概览,深刻学习的话,建议你们仍是老老实实地去看书。另外, 这篇文章的不少内容参考了《现代操做系统》第三版这本书,很是感谢。面试

一 操做系统基础

面试官顶着蓬松的假发向我走来,只见他一手拿着厚重的 Thinkpad ,一手提着他那淡黄的长裙。算法

<img src="http://wx4.sinaimg.cn/large/ceeb653ely1gd8wj5evc4j20i00n0dh0.jpg" height="300"></img>编程

1.1 什么是操做系统?

👨‍💻面试官 : 先来个简单问题吧!什么是操做系统?windows

🙋 :我经过如下四点向您介绍一下什么是操做系统吧!数组

  1. 操做系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;
  2. 操做系统本质上是运行在计算机上的软件程序 ;
  3. 操做系统为用户提供一个与系统交互的操做界面 ;
  4. 操做系统份内核与外壳(咱们能够把外壳理解成围绕着内核的应用程序,而内核就是能操做硬件的程序)。
关于内核多插一嘴:内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是链接应用程序和硬件的桥梁。
内核就是操做系统背后黑盒的核心。

操做系统份内核与外壳

1.2 系统调用

👨‍💻面试官什么是系统调用呢? 能不能详细介绍一下。缓存

🙋 :介绍系统调用以前,咱们先来了解一下用户态和系统态。

<img src="http://ww4.sinaimg.cn/large/006r3PQBjw1fbimb5c3srj30b40b40t9.jpg" height="200" width="2"/>

根据进程访问资源的特色,咱们能够把进程在系统上的运行分为两个级别:

  1. 用户态(user mode) : 用户态运行的进程或能够直接读取用户程序的数据。
  2. 系统态(kernel mode):能够简单的理解系统态运行的进程或程序几乎能够访问计算机的任何资源,不受限制。

说了用户态和系统态以后,那么什么是系统调用呢?

咱们运行的程序基本都是运行在用户态,若是咱们调用操做系统提供的系统态级别的子功能咋办呢?那就须要系统调用了!

也就是说在咱们运行的用户程序中,凡是与系统态级别的资源有关的操做(如文件管理、进程控制、内存管理等),都必须经过系统调用方式向操做系统提出服务请求,并由操做系统代为完成。

这些系统调用按功能大体可分为以下几类:

  • 设备管理。完成设备的请求或释放,以及设备启动等功能。
  • 文件管理。完成文件的读、写、建立及删除等功能。
  • 进程控制。完成进程的建立、撤销、阻塞及唤醒等功能。
  • 进程通讯。完成进程之间的消息传递或信号传递等功能。
  • 内存管理。完成内存的分配、回收以及获取做业占用内存区大小及地址等功能。

二 进程和线程

2.1 进程和线程的区别

👨‍💻面试官: 好的!我明白了!那你再说一下: 进程和线程的区别

🙋 我: 好的! 下图是 Java 内存区域,咱们从 JVM 的角度来讲一下线程和进程之间的关系吧!

若是你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话能够阅读一下这篇文章: 《多是把 Java 内存区域讲的最清楚的一篇文章》>)

jvm运行时数据区域

从上图能够看出:一个进程中能够有多个线程,多个线程共享进程的方法区 (JDK1.8 以后的元空间)资源,可是每一个线程有本身的程序计数器虚拟机栈本地方法栈

总结: 线程是进程划分红的更小的运行单位,一个进程在其执行的过程当中能够产生多个线程。线程和进程最大的不一样在于基本上各进程是独立的,而各线程则不必定,由于同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。

2.2 进程有哪几种状态?

👨‍💻面试官 : 那你再说说进程有哪几种状态?

🙋 :咱们通常把进程大体分为 5 种状态,这一点和线程很像!

  • 建立状态(new) :进程正在被建立,还没有到就绪状态。
  • 就绪状态(ready) :进程已处于准备运行状态,即进程得到了除了处理器以外的一切所需资源,一旦获得处理器资源(处理器分配的时间片)便可运行。
  • 运行状态(running) :进程正在处理器上上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
  • 阻塞状态(waiting) :又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操做完成。即便处理器空闲,该进程也不能运行。
  • 结束状态(terminated) :进程正在从系统中消失。多是进程正常结束或其余缘由中断退出运行。

process-state

2.3 进程间的通讯方式

👨‍💻面试官进程间的通讯常见的的有哪几种方式呢?

🙋 :大概有 7 种常见的进程间的通讯方式。

下面这部分总结参考了: 《进程间通讯 IPC (InterProcess Communication)》 这篇文章,推荐阅读,总结的很是不错。
  1. 管道/匿名管道(Pipes) :用于具备亲缘关系的父子进程间或者兄弟进程之间的通讯。
  2. 有名管道(Names Pipes) : 匿名管道因为没有名字,只能用于亲缘关系的进程间通讯。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,能够实现本机任意两个进程通讯。
  3. 信号(Signal) :信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生;
  4. 消息队列(Message Queuing) :消息队列是消息的链表,具备特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通讯数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不一样的是消息队列存放在内核中,只有在内核重启(即,操做系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列能够实现消息的随机查询,消息不必定要以先进先出的次序读取,也能够按消息的类型读取.比 FIFO 更有优点。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。
  5. 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通讯方式主要用于解决与同步相关的问题并避免竞争条件。
  6. 共享内存(Shared memory) :使得多个进程能够访问同一块内存空间,不一样进程能够及时看到对方进程中对共享内存中数据的更新。这种方式须要依靠某种同步操做,如互斥锁和信号量等。能够说这是最有用的进程间通讯方式。
  7. 套接字(Sockets) : 此方法主要用于在客户端和服务器之间经过网络进行通讯。套接字是支持 TCP/IP 的网络通讯的基本操做单元,能够看作是不一样主机之间的进程进行双向通讯的端点,简单的说就是通讯的两方的一种约定,用套接字中的相关函数来完成通讯过程。

2.4 线程间的同步的方式

👨‍💻面试官那线程间的同步的方式有哪些呢?

🙋 :线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以免关键的资源使用冲突。操做系统通常有下面三种线程同步的方式:

  1. 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。由于互斥对象只有一个,因此能够保证公共资源不会被多个线程同时访问。好比 Java 中的 synchronized 关键词和各类 Lock 都是这种机制。
  2. 信号量(Semphares) :它容许同一时刻多个线程访问同一资源,可是须要控制同一时刻访问此资源的最大线程数量
  3. 事件(Event) :Wait/Notify:经过通知操做的方式来保持多线程同步,还能够方便的实现多线程优先级的比较操

2.5 进程的调度算法

👨‍💻面试官你知道操做系统中进程的调度算法有哪些吗?

🙋 :嗯嗯!这个咱们大学的时候学过,是一个很重要的知识点!

为了肯定首先执行哪一个进程以及最后执行哪一个进程以实现最大 CPU 利用率,计算机科学家已经定义了一些算法,它们是:

  • 先到先服务(FCFS)调度算法 : 从就绪队列中选择一个最早进入该队列的进程为之分配资源,使它当即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再从新调度。
  • 短做业优先(SJF)的调度算法 : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它当即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再从新调度。
  • 时间片轮转调度算法 : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每一个进程被分配一个时间段,称做它的时间片,即该进程容许运行的时间。
  • 多级反馈队列调度算法 :前面介绍的几种进程调度的算法都有必定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的做业获得响应又能使短做业(进程)迅速完成。,于是它是目前被公认的一种较好的进程调度算法,UNIX 操做系统采起的即是这种调度算法。
  • 优先级调度 : 为每一个流程分配优先级,首先执行具备最高优先级的进程,依此类推。具备相同优先级的进程以 FCFS 方式执行。能够根据内存要求,时间要求或任何其余资源要求来肯定优先级。

三 操做系统内存管理基础

3.1 内存管理介绍

👨‍💻 面试官: 操做系统的内存管理主要是作什么?

🙋 我: 操做系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操做系统内存管理作的事情。

3.2 常见的几种内存管理机制

👨‍💻 面试官: 操做系统的内存管理机制了解吗?内存管理有哪几种方式?

🙋 我: 这个在学习操做系统的时候有了解过。

简单分为连续分配管理方式非连续分配管理方式这两种。连续分配管理方式是指为一个用户程序分配一个连续的内存空间,常见的如 块式管理 。一样地,非连续分配管理方式容许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的如页式管理段式管理

  1. 块式管理 : 远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每一个块中只包含一个进程。若是程序运行须要内存的话,操做系统就分配给它一块,若是程序运行只须要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每一个块中未被利用的空间,咱们称之为碎片。
  2. 页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提升了内存利用率,减小了碎片。页式管理经过页表对应逻辑地址和物理地址。
  3. 段式管理 : 页式管理虽然提升了内存利用率,可是页式管理其中的页实际并没有任何实际意义。 段式管理把主存分为一段段的,每一段的空间又要比一页的空间小不少 。可是,最重要的是段是有实际意义的,每一个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理经过段表对应逻辑地址和物理地址。

👨‍💻面试官 : 回答的还不错!不过漏掉了一个很重要的 段页式管理机制 。段页式管理机制结合了段式管理和页式管理的优势。简单来讲段页式管理机制就是把主存先分红若干段,每一个段又分红若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的。

🙋 :谢谢面试官!刚刚把这个给忘记了~

<img src="http://ww4.sinaimg.cn/large/6af89bc8gw1f8txoxc2asj20k00k0mxv.jpg" alt="这就很尴尬了_尴尬表情" height="200" width="200"/>

3.3 快表和多级页表

👨‍💻面试官 : 页表管理机制中有两个很重要的概念:快表和多级页表,这两个东西分别解决了页表管理中很重要的两个问题。你给我简单介绍一下吧!

🙋 :在分页内存管理中,很重要的两点是:

  1. 虚拟地址到物理地址的转换要快。
  2. 解决虚拟地址空间大,页表也会很大的问题。

快表

为了解决虚拟地址到物理地址的转换速度,操做系统在 页表方案 基础之上引入了 快表 来加速虚拟地址到物理地址的转换。咱们能够把块表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者所有内容。做为页表的 Cache,它的做用与页表类似,可是提升了访问速率。因为采用页表作地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提升指令执行速度。

使用快表以后的地址转换流程是这样的:

  1. 根据虚拟地址中的页号查快表;
  2. 若是该页在快表中,直接从快表中读取相应的物理地址;
  3. 若是该页不在快表中,就访问内存中的页表,再从页表中获得物理地址,同时将页表中的该映射表项添加到快表中;
  4. 当快表填满后,又要登记新页时,就按照必定的淘汰策略淘汰掉快表中的一个页。

看完了以后你会发现快表和咱们平时常常在咱们开发的系统使用的缓存(好比 Redis)很像,的确是这样的,操做系统中的不少思想、不少经典的算法,你均可以在咱们平常开发使用的各类工具或者框架中找到它们的影子。

多级页表

引入多级页表的主要目的是为了不把所有页表一直放在内存中占用过多空间,特别是那些根本就不须要的页表就不须要保留在内存中。多级页表属于时间换空间的典型场景,具体能够查看下面这篇文章

总结

为了提升内存的空间性能,提出了多级页表的概念;可是提到空间性能是以浪费时间性能为基础的,所以为了补充损失的时间性能,提出了快表(即 TLB)的概念。 不管是快表仍是多级页表实际上都利用到了程序的局部性原理,局部性原理在后面的虚拟内存这部分会介绍到。

3.4 分页机制和分段机制的共同点和区别

👨‍💻面试官分页机制和分段机制有哪些共同点和区别呢?

🙋

<img src="http://wx3.sinaimg.cn/large/de80a5ably1gcuslckpygg208c08cwfu.gif" height="200" width="200"></img>

  1. 共同点

    • 分页机制和分段机制都是为了提升内存利用率,较少内存碎片。
    • 页和段都是离散存储的,因此二者都是离散分配内存的方式。可是,每一个页和段中的内存是连续的。
  2. 区别

    • 页的大小是固定的,由操做系统决定;而段的大小不固定,取决于咱们当前运行的程序。
    • 分页仅仅是为了知足操做系统内存管理的需求,而段是逻辑信息的单位,在程序中能够体现为代码段,数据段,可以更好知足用户的须要。

3.5 逻辑(虚拟)地址和物理地址

👨‍💻面试官 :你刚刚还提到了逻辑地址和物理地址这两个概念,我不太清楚,你能为我解释一下不?

🙋 我: em...好的嘛!咱们编程通常只有可能和逻辑地址打交道,好比在 C 语言中,指针里面存储的数值就能够理解成为内存里的一个地址,这个地址也就是咱们说的逻辑地址,逻辑地址由操做系统决定。物理地址指的是真实物理内存中地址,更具体一点来讲就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。

3.6 CPU 寻址了解吗?为何须要虚拟地址空间?

👨‍💻面试官CPU 寻址了解吗?为何须要虚拟地址空间?

🙋 :这部分我真不清楚!

<img src="http://wx2.sinaimg.cn/bmiddle/a9cf8ef6ly1fhqpdipcyfj20ce0b4wex.jpg " height="300px" />

因而面试完以后我默默去查阅了相关文档!留下了没有技术的泪水。。。

这部份内容参考了 Microsoft 官网的介绍,地址: https://msdn.microsoft.com/zh...

现代处理器使用的是一种称为 虚拟寻址(Virtual Addressing) 的寻址方式。使用虚拟寻址,CPU 须要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为 内存管理单元(Memory Management Unit, MMU) 的硬件。以下图所示:

MMU_principle_updated

为何要有虚拟地址空间呢?

先从没有虚拟地址空间的时候提及吧!没有虚拟地址空间的时候,程序都是直接访问和操做的都是物理内存 。可是这样有什么问题呢?

  1. 用户程序能够访问任意内存,寻址内存的每一个字节,这样就很容易(有意或者无心)破坏操做系统,形成操做系统崩溃。
  2. 想要同时运行多个程序特别困难,好比你想同时运行一个微信和一个 QQ 音乐都不行。为何呢?举个简单的例子:微信在运行的时候给内存地址 1xxx 赋值后,QQ 音乐也一样给内存地址 1xxx 赋值,那么 QQ 音乐对内存的赋值就会覆盖微信以前所赋的值,这就形成了微信这个程序就会崩溃。

总结来讲:若是直接把物理地址暴露出来的话会带来严重问题,好比可能对操做系统形成伤害以及给同时运行多个程序形成困难。

经过虚拟地址访问内存有如下优点:

  • 程序可使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
  • 程序可使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(一般大小为 4 KB)保存到磁盘文件。数据或代码页会根据须要在物理内存与磁盘之间移动。
  • 不一样进程使用的虚拟地址彼此隔离。一个进程中的代码没法更改正在由另外一进程或操做系统使用的物理内存。

四 虚拟内存

4.1 什么是虚拟内存(Virtual Memory)?

👨‍💻面试官 :再问你一个常识性的问题!什么是虚拟内存(Virtual Memory)?

🙋 :这个在咱们平时使用电脑特别是 Windows 系统的时候太常见了。不少时候咱们使用点开了不少占内存的软件,这些软件占用的内存可能已经远远超出了咱们电脑自己具备的物理内存。为何能够这样呢? 正是由于 虚拟内存 的存在,经过 虚拟内存 可让程序能够拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每一个进程提供了一个一致的、私有的地址空间,它让每一个进程产生了一种本身在独享主存的错觉(每一个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减小出错。

虚拟内存是计算机系统内存管理的一种技术,咱们能够手动设置本身电脑的虚拟内存。不要单纯认为虚拟内存只是“使用硬盘空间来扩展内存“的技术。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,而且 把内存扩展到硬盘空间。推荐阅读:《虚拟内存的那点事儿》

维基百科中有几句话是这样介绍虚拟内存的。

虚拟内存 使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它一般是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在须要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如 RAM)的使用也更有效率。目前,大多数操做系统都使用了虚拟内存,如 Windows 家族的“虚拟内存”;Linux 的“交换空间”等。From: https://zh.wikipedia.org/wiki...

4.2 局部性原理

👨‍💻面试官 :要想更好地理解虚拟内存技术,必需要知道计算机中著名的局部性原理。另外,局部性原理既适用于程序结构,也适用于数据结构,是很是重要的一个概念。

🙋 :局部性原理是虚拟内存技术的基础,正是由于程序运行具备局部性原理,才能够只装入部分程序到内存就开始运行。

如下内容摘自《计算机操做系统教程》 第 4 章存储器管理。

早在 1968 年的时候,就有人指出咱们的程序在执行的时候每每呈现局部性规律,也就是说在某个较短的时间段内,程序执行局限于某一小部分,程序访问的存储空间也局限于某个区域。

局部性原理表如今如下两个方面:

  1. 时间局部性 :若是程序中的某条指令一旦执行,不久之后该指令可能再次执行;若是某数据被访问过,不久之后该数据可能再次被访问。产生时间局部性的典型缘由,是因为在程序中存在着大量的循环操做。
  2. 空间局部性 :一旦程序访问了某个存储单元,在不久以后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在必定的范围以内,这是由于指令一般是顺序存放、顺序执行的,数据也通常是以向量、数组、表等形式簇聚存储的。

时间局部性是经过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。空间局部性一般是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是创建了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。

4.3 虚拟存储器

👨‍💻面试官 :都说了虚拟内存了。你再讲讲虚拟存储器把!

🙋

这部份内容来自: 王道考研操做系统知识点整理

基于局部性原理,在程序装入时,能够将程序的一部分装入内存,而将其余部分留在外存,就能够启动程序执行。因为外存每每比内存大不少,因此咱们运行的软件的内存大小其实是能够比计算机系统实际的内存大小大的。在程序执行过程当中,当所访问的信息不在内存时,由操做系统将所须要的部分调入内存,而后继续执行程序。另外一方面,操做系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。这样,计算机好像为用户提供了一个比实际内存大的多的存储器——虚拟存储器

实际上,我以为虚拟内存一样是一种时间换空间的策略,你用 CPU 的计算时间,页的调入调出花费的时间,换来了一个虚拟的更大的空间来支持程序的运行。不得不感叹,程序世界几乎不是时间换空间就是空间换时间。

4.4 虚拟内存的技术实现

👨‍💻面试官虚拟内存技术的实现呢?

🙋 虚拟内存的实现须要创建在离散分配的内存管理方式的基础上。 虚拟内存的实现有如下三种方式:

  1. 请求分页存储管理 :创建在分页管理之上,为了支持虚拟存储器功能而增长了请求调页功能和页面置换功能。请求分页是目前最经常使用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在做业开始运行以前,仅装入当前要执行的部分段便可运行。假如在做业运行的过程当中发现要访问的页面不在内存,则由处理器通知操做系统按照对应的页面置换算法将相应的页面调入到主存,同时操做系统也能够将暂时不用的页面置换到外存中。
  2. 请求分段存储管理 :创建在分段存储管理之上,增长了请求调段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式同样,在做业开始运行以前,仅装入当前要执行的部分段便可运行;在执行过程当中,可以使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又须要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
  3. 请求段页式存储管理

这里多说一下?不少人容易搞混请求分页与分页存储管理,二者有何不一样呢?

请求分页存储管理创建在分页管理之上。他们的根本区别是是否将程序所有所需的所有地址空间都装入主存,这也是请求分页存储管理能够提供虚拟内存的缘由,咱们在上面已经分析过了。

它们之间的根本区别在因而否将一做业的所有地址空间同时装入主存。请求分页存储管理不要求将做业所有地址空间同时装入主存。基于这一点,请求分页存储管理能够提供虚存,而分页存储管理却不能提供虚存。

无论是上面那种实现方式,咱们通常都须要:

  1. 必定容量的内存和外存:在载入程序的时候,只须要将程序的一部分装入内存,而将其余部分留在外存,而后程序就能够执行了;
  2. 缺页中断:若是需执行的指令或访问的数据还没有在内存(称为缺页或缺段),则由处理器通知操做系统将相应的页面或段调入到内存,而后继续执行程序;
  3. 虚拟地址空间 :逻辑地址到物理地址的变换。

4.5 页面置换算法

👨‍💻面试官 :虚拟内存管理很重要的一个概念就是页面置换算法。那你说一下 页面置换算法的做用?常见的页面置换算法有哪些?

🙋

这个题目常常做为笔试题出现,网上已经给出了很不错的回答,我这里只是总结整理了一下。

地址映射过程当中,若在页面中发现所要访问的页面不在内存中,则发生缺页中断 。

缺页中断 就是要访问的 不在主存,须要操做系统将其调入主存后再进行访问。 在这个时候,被内存映射的文件实际上成了一个分页交换文件。

当发生缺页中断时,若是当前内存中并无空闲的页面,操做系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫作页面置换算法,咱们能够把页面置换算法当作是淘汰页面的规则。

  • OPT 页面置换算法(最佳页面置换算法) :理想状况,不可能实现,通常做为衡量其余置换算法的方法。
  • FIFO 页面置换算法(先进先出页面置换算法) : 老是淘汰最早进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。
  • LRU 页面置换算法(最近未使用页面置换算法) :LRU(Least Currently Used)算法赋予每一个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
  • LFU 页面置换算法(最少使用页面排序算法) : LFU(Least Frequently Used)算法会让系统维护一个按最近一次访问时间排序的页面链表,链表首节点是最近刚刚使用过的页面,链表尾节点是最久未使用的页面。访问内存时,找到相应页面,并把它移到链表之首。缺页时,置换链表尾节点的页面。也就是说内存内使用越频繁的页面,被保留的时间也相对越长。

Reference

做者介绍: Github 70k Star 项目 JavaGuide(公众号同名) 做者。每周都会在公众号更新一些本身原创干货。公众hao后台回复“1”领取Java工程师必备学习资料+面试突击pdf。

相关文章
相关标签/搜索