我和面试官关于操作系统的一个游戏!写了好久。 看完之后你可以向面试官提问。

2024-03-19 -

将其设置为“顶级或星级”以尽快交付有用的货物。

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

来源、作者 指南哥

很多读者抱怨计算操作系统的知识点比较复杂,没有太多耐心去阅读,但在面试的时候却经常遇到。 那么,我整理的关于操作系统的常见问题就在这里! 本文总结了一些我认为重要的操作系统相关问题,比如进程管理、内存管理、虚拟内存等。

文章格式是通过面试官和求职者之间的对话制定的,这是大多数人首选的。 另外,指南哥在大学的时候才学过操作系统,但基本上都忘记了。 为了写这篇文章,我阅读了大量相关书籍和博客。 如果文章中有需要补充或者改进的地方,可以在评论区指出。 如果您觉得内容不错,别忘了点击阅读哦!

我个人认为学好操作系统是非常有用的。 具体可以看我昨天在上分享的一段话:

本文只是对操作系统一些比较重要的概念的概述。 如果你想深入学习,我建议你老老实实地看书。 另外,本文的很多内容参考了《现代操作系统》第三版这本书,非常感谢。

操作系统基础知识

面试官戴着蓬松的假发朝我走来。 他一手拿着一顶厚重的假发,另一只手拿着浅黄色的裙子。

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

1.1 什么是操作系统?

‍面试官:我们先问一个简单的问题! 什么是操作系统?

我:我通过以下四点给大家介绍一下什么是操作系统!

操作系统(OS,简称OS)是管理计算机硬件和软件资源的程序,是计算机系统的核心和基石;

操作系统本质上是在计算机上运行的软件程序;

操作系统为用户提供与系统交互的操作界面;

操作系统分为内核和外壳(我们可以把外壳看作是围绕内核的应用程序,而内核可以理解为可以直接操作硬件的程序)。

多说一句内核:内核负责管理系统的进程、内存、设备驱动、文件、网络系统等,决定着系统的性能和稳定性。 它是应用程序和硬件之间的桥梁。 内核是操作系统背后黑匣子的核心。

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

操作系统分为内核和外壳 1.2 系统调用

‍面试官:什么是系统调用? 能否请您详细介绍一下。

我:在介绍系统调用之前,我们先了解一下用户状态和系统状态。

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

根据进程访问资源的特点,我们可以将进程对系统的操作分为两个层次:

用户态:运行在用户态的进程可以直接从用户程序中读取数据。

系统模式(mode):可以简单理解为运行在系统模式下的进程或程序可以不受限制地访问计算机的几乎任何资源。

说完了用户模式和系统模式,那么什么是系统调用呢?

我们运行的程序基本上都运行在用户态。 如果我们调用操作系统提供的系统状态级子函数呢? 那么就需要系统调用了!

也就是说,我们运行的用户程序中,所有与系统级资源相关的操作(如文件管理、进程控制、内存管理等)都必须通过系统调用向操作系统提出服务请求,而操作系统会为您完成。

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

2. 进程和线程 2.1 进程和线程的区别

面试官:好的! 我懂了! 然后再告诉我一次:进程和线程的区别。

我:好的! 下图显示了Java内存区域。 我们从JVM的角度来谈谈线程和进程的关系吧!

如果你对Java内存区(运行时数据区)不太了解,可以阅读这篇文章:

jvm运行时数据区

从上图可以看出:一个进程中可以有多个线程。 多个线程共享进程的堆和方法区(JDK1.8以后的元空间)资源,但每个线程都有自己的程序计数器和虚拟机堆栈。 和本机方法堆栈。

摘要: 线程是划分为进程的更小的运行单元。 一个进程在执行过程中可以生成多个线程。 线程和进程最大的区别在于,每个进程基本上是独立的,但每个线程却不一定,因为同一个进程中的线程很可能会互相影响。 线程执行开销小,但不利于资源管理和保护; 对于进程来说则相反。

2.2 进程有哪些状态?

‍采访者:那你能告诉我这个进程有哪些状态吗?

我:我们一般把进程分为5种状态,这和线程很相似!

-.3 进程间的通信方法

‍面试官:进程间通信的常用方式有哪些?

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

以下部分总结参考:《进程间通信IPC()》这篇文章推荐阅读,总结的很好。

管道/匿名管道(Pipes):用于有关系的父子进程或兄弟进程之间的通信。

名称管道:匿名管道没有名称,只能用于相关关系的进程间通信。 为了克服这个缺点,提出了著名的管道。 著名的管道严格遵循先进先出(先进先出)。 命名管道以磁盘文件的形式存在,可以实现本机上任意两个进程之间的通信。

():信号是一种比较复杂的通信方法,用于通知接收进程有事件发生;

消息队列( Queue):消息队列是消息的链表,具有特定的格式,存储在内存中,由消息队列标识符来标识。 管道和消息队列的通信数据遵循先进先出的原则。 与管道(无名管道:仅存在于内存中的文件;命名管道:存在于实际磁盘介质或文件系统上)不同,消息队列存储在内核中,只有在内核重新启动时才能显示(即操作系统重启)或显示永久删除消息队列时,该消息队列将被真正删除。 消息队列可以实现消息的随机查询。 消息不必按照先进先出的顺序读取,也可以按照消息的类型读取。 它比先进先出有更多的优点。 消息队列克服了信号携带少量信息、管道只能携带无格式字节流以及缓冲区大小有限的缺点。

信号量():信号量是用于多进程访问共享数据的计数器。 信号量的目的是在进程之间进行同步。 这种通信方法主要用于解决同步相关问题并避免竞争条件。

共享内存():允许多个进程访问同一内存空间,不同进程可以及时看到对方进程中共享内存中数据的更新。 该方法需要某种同步操作,例如互斥锁和信号量。 可以说这是进程间通信最有用的形式。

():该方法主要用于客户端和服务器之间通过网络进行通信。 是支持TCP/IP的网络通信的基本操作单元。 它可以被视为不同主机之间进程之间双向通信的端点。 简单来说,就是双方在沟通中达成的协议。 使用插座。 相关函数完成通信过程。

2.4 线程间同步的方法

‍面试官:线程间的同步有哪些方法?

我:线程同步是两个或多个共享关键资源的线程的并发执行。 线程应该同步以避免严重的资源使用冲突。 操作系统一般有以下三种线程同步的方法:

互斥体(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有权限访问公共资源。 因为只有一个互斥对象,所以可以保证公共资源不会被多个线程同时访问。 比如Java中的关键字、各种Lock都是这样的机制。

信号量():它允许多个线程同时访问同一个资源,但需要控制同时访问此资源的线程的最大数量。

Event:Wait/:通过通知操作保持多线程同步,还可以轻松实现多线程优先级比较操作。

2.5 进程调度算法

‍面试官:你知道操作系统中进程采用什么调度算法吗?

我:嗯嗯! 这是我们在大学里学过的,是一个非常重要的知识点!

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

三种操作系统内存管理基础 3.1 内存管理简介

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

Me:操作系统的内存管理主要负责内存的分配和回收(功能:申请内存,free功能:释放内存)。 另外,地址转换,即将逻辑地址转换为对应的物理地址等功能也由操作系统内存管理来完成。 事情。

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

‍ 面试官:你了解操作系统的内存管理机制吗? 内存管理的方法有哪些?

我:这个是我在学习操作系统的时候了解到的。

可以简单分为连续分配管理方法和非连续分配管理方法两种。 连续分配管理方式是指为用户程序分配连续的内存空间,常见的是块管理。 类似地,非连续分配管理允许程序使用的内存分布在离散或非连续的内存中,例如页管理和段管理。

块管理:古代计算机操作系统的内存管理方法。 将内存划分为固定大小的块,每个块仅包含一个进程。 如果程序需要内存来运行,操作系统就会为其分配一块内存。 如果程序只需要少量的空间来运行,那么分配的内存的很大一部分几乎会被浪费。 每个块中这些未使用的空间称为片段。

页面管理:将主存划分为大小相等且固定的页面。 页更小,划分比块管理更强,提高了内存利用率,减少碎片。 页管理通过页表对应逻辑地址和物理地址。

段管理:页管理虽然提高了内存利用率,但是页管理中的页实际上没有实际意义。 段管理将主存划分为段,每个段的空间比一页的空间小得多。 但最重要的是,细分具有实际意义。 每个段定义了一组逻辑信息,如主程序段MAIN、子程序段X、数据段D、堆栈段S等。段管理通过段表将逻辑地址和物理地址对应起来。

‍采访者:这个答案非常好! 然而,遗漏了一个非常重要的段页管理机制。 段和页管理机制结合了段管理和页管理的优点。 简单来说,段页管理机制将主存分为若干段,每个段又分为若干页。 也就是说,在段页管理机制中,段之间和段内的一切都是离散的。

我:谢谢面试官! 我刚刚忘记了这个~

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

3.3 快速表和多级页表

‍面试官:页表管理机制中有两个非常重要的概念:快速表和多级页表。 这两件事分别解决了页表管理中两个非常重要的问题。 请您简单介绍一下!

我:在分页内存管理中,非常重要的两点是:

虚拟地址到物理地址的转换应该很快。

解决虚拟地址空间大、页表大的问题。

快速观看

为了解决虚拟地址到物理地址的转换速度问题,操作系统引入了基于页表解决方案的快速表来加速虚拟地址到物理地址的转换。 我们可以将块表理解为一种特殊的高速缓冲存储器(Cache),其内容是页表的部分或全部。 作为页表的Cache,其作用与页表类似,但提高了访问速率。 由于页表用于地址转换,CPU在读写内存数据时必须访问主存两次。 有了快表,有时只需访问一次高速缓冲存储器,就可以访问一次主存,这样可以加快查找速度,提高指令执行速度。

使用快速表后的地址转换过程如下:

根据虚拟地址中的页号检查缓存表;

如果该页在fast表中,则直接从fast表中读取对应的物理地址;

如果该页不在快速表中,则访问内存中的页表,从页表中获取物理地址,并将页表中的映射项添加到快速表中;

当快速表满了,需要注册新的页面时,按照一定的淘汰策略淘汰快速表中的页面。

读完本文你会发现快表和我们开发的系统中经常使用的缓存(比如Redis)非常相似。 确实是这样的。 操作系统中的很多思想、很多经典算法都可以运用到我们的日常生活中。 在用于开发的各种工具或框架中找到他们的影子。

多级页表

引入多级页表的主要目的是避免将所有页表都保存在内存中,占用过多的空间。 特别是根本不需要的页表不需要保存在内存中。多级页表就是一个典型的以时间换空间的场景。 详细内容请看下面的文章。

总结

为了提高内存的空间性能,提出了多级页表的概念; 但空间性能是建立在浪费的时间性能基础上的,因此为了补充损失的时间性能,提出了快速表(即TLB)的概念。 快速表和多级页表实际上都利用了程序的局部性原则。 局部性原理会在后面的虚拟内存部分介绍。

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

‍面试官:分页机制和分段机制有什么共同点和不同点?

我:

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

共同点:

区别:

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

‍面试官:您刚才提到了逻辑地址和物理地址两个概念。 我不确定。 你能给我解释一下吗?

我:嗯……好吧! 我们的编程一般只能处理逻辑地址。 例如,在C语言中,指针存储的值可以理解为内存中的地址。 这个地址就是我们所说的逻辑地址。 逻辑地址由操作系统决定。 物理地址是指真实物理内存中的地址,更具体地说是内存地址寄存器中的地址。 物理地址是内存单元的真实地址。

3.6 你了解CPU寻址吗? 为什么需要虚拟地址空间?

‍面试官:你了解CPU寻址吗? 为什么需要虚拟地址空间?

我:这部分我真的不知道!

电脑系统时间同步出错_电脑系统时间同步出错_电脑系统时间同步出错

所以面试完之后我就默默的查阅了相关的文件! 留下了没有技术的眼泪。 。 。

这部分内容参考了官网的介绍,地址:(v=vs.85).aspx

现代处理器使用一种称为虚拟寻址()的寻址方法。 使用虚拟寻址时,CPU需要将虚拟地址转换为物理地址,以便能够访问真实的物理内存。 真正完成虚拟地址到物理地址转换的硬件是CPU中一个称为内存管理单元(MMU)的硬件。 如下所示:

d

为什么我们需要虚拟地址空间?

我们先从没有虚拟地址空间的时代说起吧! 当没有虚拟地址空间时,程序直接访问和操作物理内存。 但这有什么问题呢?

用户程序可以访问任意内存并对内存的每个字节进行寻址,从而很容易(有意或无意)损坏操作系统并导致其崩溃。

同时运行多个程序尤其困难。 比如你想同时运行一个微信和一个QQ音乐,那是不行的。 为什么? 举个简单的例子:微信运行时给内存地址1xxx赋值后,QQ音乐也给内存地址1xxx赋值。 那么QQ音乐对内存的赋值就会覆盖之前微信分配的值,从而导致微信的程序崩溃。

综上所述:如果直接暴露物理地址,将会导致严重的问题,比如可能损坏操作系统、难以同时运行多个程序等。

通过虚拟地址访问内存有以下优点:

4. 虚拟内存 4.1 什么是虚拟内存( )?

‍面试官:我再问你一个常识问题! 什么是虚拟内存()?

我:这种情况在我们使用计算机尤其是系统时很常见。 很多时候我们会打开很多消耗内存的软件,而这些软件所占用的内存可能远远超过我们电脑本身的物理内存。 为什么这可能? 正是因为虚拟内存的存在,虚拟内存才使得程序拥有超过系统物理内存大小的可用内存空间。 另外,虚拟内存为每个进程提供了一致且私有的地址空间,这给了每个进程独占主内存的错觉(每个进程都有连续完整的内存空间)。 这会带来更高效的内存管理和更少的错误。

虚拟内存是一种计算机系统内存管理技术。 我们可以手动设置电脑的虚拟内存。 不要简单地认为虚拟内存只是一种“利用硬盘空间来扩展内存”的技术。 虚拟内存的重要意义在于它定义了一个连续的虚拟地址空间,并将内存扩展到了硬盘空间。 推荐阅读:《关于虚拟内存的那些事》

维基百科中有几个描述虚拟内存的句子。

虚拟内存使应用程序认为自己拥有连续的可用内存(连续且完整的地址空间),但实际上它通常被划分为多个物理内存碎片,有的暂时存放在外部磁盘存储上。 数据交换在需要时发生。 使用虚拟内存技术的系统比不使用虚拟内存技术的系统更容易编写大型程序并且更有效地使用真实物理内存(例如RAM)。 目前,大多数操作系统都使用虚拟内存,例如家庭的“虚拟内存”; Linux的“交换空间”等来自:虚拟内存

4.2 局部性原理

‍面试官:为了更好地理解虚拟内存技术,你必须知道计算机中著名的局部性原理。 另外,局部性原则对于程序结构和数据结构都适用,这是一个非常重要的概念。

我:局部性原理是虚拟内存技术的基础。 正是由于程序运行的局部性原理,才使得程序只能加载到内存中的一部分并开始运行。

以下内容摘自《计算机操作系统教程》第四章内存管理。

早在1968年,就有人指出我们的程序在执行时经常表现出局部性。 也就是说,在短时间内,程序执行仅限于程序访问的一小部分存储空间。 也仅限于一定的区域。

局部性原则体现在以下两个方面:

时间局部性:程序中的一条指令如果执行过一次,那么该指令可能很快就会再次执行; 如果某个数据已经被访问过,那么该数据可能很快就会被再次访问。 时间局部性的典型原因是程序中存在大量循环操作。

空间局部性:一旦程序访问某个存储单元,其附近的存储单元也会很快被访问。 即一段时间内程序访问的地址可能集中在一定范围内。 这是因为指令通常是顺序存储和执行的,而数据一般以向量、数组、表等形式存储在簇中。

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

4.3 虚拟内存

‍采访者:我已经讲过虚拟内存了。 我们再来说说虚拟内存吧!

我:

这部分内容来自:网道考研操作系统知识点整理。

基于局部性原理,当程序被加载时,可以将程序的一部分加载到内存中,而其他部分可以留在外部内存中开始程序执行。 由于外部存储器往往比内存大很多,所以我们运行的软件的内存大小实际上可以大于计算机系统的实际内存大小。 程序执行过程中,当所访问的信息不在内存中时,操作系统将需要的部分转移到内存中,然后继续执行程序。 另一方面,操作系统将内存中暂时未使用的内容替换到外部存储器中,从而释放空间来存储将要传输到内存中的信息。 这样,计算机似乎就为用户提供了一块比实际内存大得多的内存——虚拟内存。

其实我觉得虚拟内存也是一种以时间换空间的策略。 你用CPU的计算时间和页面传入传出所花费的时间,来换取更大的虚拟空间来支持程序的运行。 不得不感叹,在编程世界里,几乎总是用时间换空间或者用空间换时间。

4.4 虚拟内存的技术实现

‍采访者:虚拟内存技术的实现怎么样?

我:虚拟内存的实现需要基于离散分配的内存管理方式。 虚拟内存的实现方式有以下三种:

请求分页存储管理:在基本分页系统的基础上,为了支持虚拟内存功能,增加了请求分页功能和页面替换功能。 请求分页是目前最常用的实现虚拟内存的方法。

请求暂存存储管理:

请求段分页存储管理:

不管上面的实现方式如何,我们一般需要:

一定量的内存和外部存储:加载程序时,只需将程序的一部分加载到内存中,将其他部分留在外部存储中,即可执行程序;

页丢失中断:如果要执行的指令或要访问的数据尚未在内存中(称为页丢失或段丢失),则处理器通知操作系统将相应的页或段转移到内存中,然后继续执行程序;

虚拟地址空间:逻辑地址到物理地址的转换。

4.5 页面替换算法

‍面试官:虚拟内存管理中一个非常重要的概念就是页面替换算法。 那么您能介绍一下页面替换算法的作用吗? 常见的页面替换算法有哪些?

我:

这个问题经常以笔试题的形式出现,网上也有非常好的答案。 我只是总结到这里。

在地址映射过程中,如果在页面中发现要访问的页面不在内存中,就会发生页错误中断。

页错误中断是指要访问的页面不在主存中,操作系统需要将其转移到主存中才能访问。 这时,内存映射文件实际上就变成了分页交换文件。

当发生页面错误时,如果当前内存中没有空闲页面,操作系统必须在内存中选择一个页面并将其移出内存,为要调入的页面腾出空间。用于选择的规则消除哪些页面称为页面替换算法。 我们可以将页面替换算法视为消除页面的规则。

结尾

点击“看看”你就明白了

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。

扫一扫在手机阅读、分享本文