【面试题】操作系统面试题(第三篇)

1.什么是内核

内核(Kernel)是操作系统中至关重要的组成部分,它负责管理系统资源、提供硬件抽象、并确保应用程序对硬件的安全访问。以下是关于内核的详细解释:

  1. 定义:

    • 内核是操作系统的核心部分,它是基于硬件的第一层软件扩充,为操作系统提供最基本的功能。

  2. 功能:

    • 资源管理:内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统。

    • 硬件抽象:内核为应用程序提供对硬件的安全和有限访问,决定一个程序在什么时候对某部分硬件操作多长时间。它通常提供一种硬件抽象的方法,使应用进程可间接控制所需的硬件资源。

    • 性能与稳定性:内核的性能和稳定性直接影响到整个操作系统的性能和稳定性。

  3. 分类:

    • 内核可分为单内核(Monolithic Kernel)、双内核(Dual Kernel)和微内核(Microkernel)等类型。这些分类主要基于内核的架构和设计理念。

  4. 历史发展:

    • 以Linux为例,其内核的发展经历了多个版本。从1991年10月的0.02版本开始,到后来的稳定版本(如1.0.0),Linux内核不断发展并成熟。内核的版本号通常采用两“路”编号方法,偶数号的内核是稳定的版本,而奇数号的内核是前沿或“发展中”的版本。

  5. 设计与实现:

    • 现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的模块(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。这一部分通常被称为操作系统的内核。

  6. 与应用程序的关系:

    • 内核是连接应用程序和硬件的桥梁。应用程序通过系统调用来请求内核服务,如文件读写、进程创建等。内核则负责处理这些请求,并管理相关的系统资源。

总结来说,内核是操作系统的核心部分,它负责管理系统资源、提供硬件抽象、并确保应用程序对硬件的安全访问。内核的性能和稳定性直接影响到整个操作系统的性能和稳定性。在设计和实现上,现代操作系统通常将内核设计为常驻内存的一部分,以减少系统开销并提高性能。

2.什么是用户态和内核态

用户态和内核态是操作系统的两种运行状态。

内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。

用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。

3.为什么要有用户态和内核态呢?

这个主要是访问能力的限制的考量,计算机中有一些比较危险的操作,比如设置时钟、内存清理,这些都需要在内核态下完成,如果随意进行这些操作,那你的系统得崩溃多少次。

4.用户态和内核态是如何切换的?

所有的用户进程都是运行在用户态的,但是用户程序的访问能力有限,一些比较重要的比如从硬盘读取数据,从键盘获取数据的操作则是内核态才能做的事情,而这些数据却又对用户程序来说非常重要。所以就涉及到两种模式下的转换,即用户态 -> 内核态 -> 用户态,而唯一能够做这些操作的只有 系统调用,而能够执行系统调用的就只有 操作系统。

一般用户态 -> 内核态的转换我们都称之为 trap 进内核,也被称之为 陷阱指令(trap instruction)。

5.虚拟内存

虚拟内存就是让每个进程看起来都好像拥有一个大而独立的地址空间。目的是为了解决物理内存空间可能不够的问题。

独立的意思是说尽管每个进程的虚拟地址空间长得都一样,但它们都是私有的。不同进程的同一个虚拟地址可以映射到不同的物理地址

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。

这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。

6.虚拟内存地址空间分配

  • 用户空间

代码段:存放由程序代码生成的二进制文件的机器码

数据(data)段:存放已经被初始化的全局和静态变量

BSS段:存放未初始化的全局和静态变量,并默认初始化为0

堆:存放程序运行时动态申请空间的变量(new、malloc)

文件映射与匿名映射区:用于共享内存的映射区以及加载依赖的动态库的空间

栈:存放程序的局部变量、函数参数等

  • 内核空间

32位操作系统

自动分配4GB虚拟地址空间

windows中2:2分配

0-64KB、空指针模式:不允许访问,调试程序使用。

64KB-2GB、用户模式:进程的私有地址空间

2GB-4GB 内核模式:所有进程共享

Linux中 1 :3分配

0~3G为用户空间

3G~4G为内核空间

64位操作系统

Windows自动分配16TB虚拟地址空间

0-8TB、用户模式

8TB-16TB 内核模式

Linux分配256TB虚拟地址空间

64 位系统下只使用了 48 位来描述虚拟内存空间,寻址范围为 2^48 ,所能表达的虚拟内存空间为 256TB。

其中低 128 T 表示用户态虚拟内存空间,虚拟内存地址范围为:0x0000 0000 0000 0000 - 0x0000 7FFF FFFF F000 。

高 128 T 表示内核态虚拟内存空间,虚拟内存地址范围为:0xFFFF 8000 0000 0000 - 0xFFFF FFFF FFFF FFFF 。

7.为什么要有虚拟内存?

需要虚拟地址空间的原因有以下几点:

  • 内存地址空间的隔离:不同进程之间的内存地址空间应该是相互隔离的,否则一个进程可以访问另一个进程的内存,导致数据的不安全和系统的不稳定。

  • 内存地址空间的扩展:虚拟地址空间可以扩展到非常大的范围,远远超过物理内存的大小,这样就可以满足一些需要大量内存的应用程序的需求。

  • 内存管理的灵活性:虚拟地址空间可以实现内存的动态分配和回收,以及内存映射等功能,提高了内存的利用率。

  • 进程的隔离性和安全性:虚拟地址空间的隔离性和安全性可以保证进程之间不会互相干扰,同时也可以保证进程内部数据的安全性,防止数据泄露和篡改。

8.分段和分页以及他们之间的区别

分页是将物理内存划分成固定大小的页面(Page),将逻辑地址空间划分成相同大小的页(Page)并映射到物理内存中。通过这种方式,可以将逻辑地址空间与物理内存空间分离,使得操作系统可以更加灵活地管理内存。在分页机制中,操作系统将内存划分成相同大小的页面,通常是4KB或者8KB。当应用程序访问某个内存地址时,操作系统会将该地址转换为对应的物理地址,然后访问该物理地址对应的内存单元。分页机制的优点是管理简单,适用于内存碎片较多的情况,缺点是由于每个内存块的大小相同,导致了一些浪费。

分段是将逻辑地址空间划分成若干个大小不同的段(Segment),每个段都有自己的逻辑地址空间和长度,并且可以按照应用程序的需要进行分配和释放。分段机制可以更好地反映应用程序的逻辑结构,使得内存使用更加高效。在分段机制中,每个段都有自己的基地址和长度,当应用程序访问某个地址时,操作系统会将该地址转换为对应的物理地址,然后访问该物理地址对应的内存单元。分段机制的优点是更加灵活,适用于内存碎片较少的情况,缺点是管理复杂,容易产生外部碎片。

分页和分段的主要区别在于内存管理的单位不同。分页是按照固定大小的页面进行管理,而分段是按照应用程序的逻辑结构进行管理。分页可以更好地控制内存使用,而分段可以更好地反映应用程序的逻辑结构。实际上,现代操作系统通常会将分页和分段结合起来使用,以充分发挥两种机制的优点。

9.内部碎片外部碎片

内部碎片是已经被分配出去能明确指出属于哪个进程的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片

外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块

10.page cache

Page Cache(页高速缓冲存储器,简称页高缓)是计算机内存中的一种缓存机制,主要用于加速对磁盘上文件和数据的访问。以下是关于Page Cache的详细解释:

  1. 定义和用途:

    • Page Cache,也称为pcache,是Linux等操作系统中用于缓存文件逻辑内容的一种机制。

    • 当操作系统需要读取磁盘上的文件时,它会首先检查该文件的内容是否已经在Page Cache中。如果文件内容已经在缓存中,则可以直接从内存中读取,而无需访问磁盘,从而大大减少了磁盘I/O操作,提高了系统的响应速度。

  2. 大小和结构:

    • Page Cache的大小通常为一页,而在Linux系统中,一页的大小通常为4KB(但具体大小可能因系统而异)。

    • Page Cache通过radix tree和双向链表等数据结构进行管理。Radix tree用于快速查找脏页(dirty page)和需要回写的页面,而双向链表则用于实现物理内存的回收。

  3. 工作原理:

    • 当一个文件被读取时,操作系统会将该文件的数据块加载到内存中的一页中,并将该页标记为缓存页。

    • 当需要读取该文件的另一个数据块时,操作系统会先检查缓存页表。如果该数据块已经在缓存中,则可以直接访问;否则,需要从磁盘中读取。

    • 当内存中的缓存页不足时,操作系统会根据一定的策略(如LRU算法)将最近一段时间没有访问到的数据块从缓存中清除,以便为新的数据块腾出空间。

  4. 优势:

    • Page Cache能够显著减少磁盘访问次数,提高系统的磁盘I/O吞吐量和响应速度。

    • 与传统的文件缓存相比,Page Cache能够更好地利用系统内存资源,加快文件读写速度,提高系统的性能水平。

  5. 应用场景:

    • Page Cache在大数据组件中发挥着重要作用,如Kafka、HDFS等文件层级的读写操作底层都会使用到Page Cache技术。

    • Kafka使用Page Cache作为缓存而不是JVM缓存,这主要是因为JVM中的对象元数据会浪费空间,并且在大数据量场景下会造成频繁的GC操作,影响程序的稳定性。

  6. 注意事项:

    • 由于Page Cache是由操作系统内核管理的,因此开发者在编写应用程序时需要注意避免直接操作Page Cache,而是应该通过系统调用等机制来使用它。

    • 同时,开发者也需要注意Page Cache的容量限制和回收策略,以避免因缓存溢出而导致的数据丢失或性能下降等问题。

11.如何确定缓存页还是匿名页

  1. Page Flags(页标志): struct page 中通常包含一组标志位,用于表示页的不同状态和属性。其中一些标志与页的类型有关。例如,PageAnon标志表示页是匿名页,而PageUptodate标志表示页的内容是最新的。

  2. Mapping(映射关系): 如果页属于文件缓存,它通常会与一个文件相关联,这个关联关系可以通过页的mapping字段来确定。如果一个页有mapping字段,它通常是文件缓存页。如果没有mapping字段,它可能是匿名页。

  3. Page Cache(页缓存): 文件缓存页通常存在于操作系统的页缓存中,这些页存储着从磁盘加载的文件数据。匿名页通常是为进程的堆栈、堆或内存映射等用途而分配的,不与具体文件关联。

  4. 用户空间映射: 匿名页通常是进程的用户空间地址映射的一部分,而文件缓存页通常不与用户空间地址相关联。

  5. 分配来源: 在一些情况下,页的分配来源可以用来确定其类型。例如,通过kmalloc分配的页通常是用于内核数据结构,而不是文件缓存或匿名页。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值