• 【2024秋招】2023-9-14 最右线下后端开发二面


    1 OS

    1.1 讲讲什么是虚拟内存,怎么实现的

    虚拟内存是一种存储器管理能力,它使得一个应用程序似乎有更多的物理内存(RAM)可用,而实际上,系统使用了一部分硬盘空间来模拟额外的 RAM。通过使用虚拟内存,系统可以运行更大、更复杂的应用程序,甚至在物理内存不足的情况下也不会崩溃。

    以下是虚拟内存的工作原理和它是如何实现的:

    1. 分页和分段:大多数现代操作系统都使用分页或分段技术来实现虚拟内存。分页是将物理内存分为固定大小的页面,而分段是根据应用程序的需求将内存分为不同大小的段。

    2. 页表:页表是一个数据结构,用于映射虚拟地址到物理地址。每当应用程序访问一个地址,页表被用来找出这个地址在物理内存中的位置。

    3. 页面错误:当一个程序尝试访问一个当前不在物理内存中的页面时,会发生页面错误。这时,操作系统需要从磁盘上将所需的页面载入到物理内存中。

    4. 置换算法:当物理内存满了,并且需要为新的页面腾出空间时,操作系统必须决定哪个页面被移出物理内存。这是通过所谓的置换算法来完成的,如LRU(最近最少使用)或FIFO(先进先出)。

    5. 后备存储:当页面从物理内存被移除时,它们被存放在一个称为后备存储或交换空间的磁盘区域。这样,当这个页面再次被访问时,它可以被重新载入到物理内存中。

    6. 写回与写通过:当数据被修改时,有两种方法可以更新后备存储中的数据。写回方法是在页面被移出物理内存时才更新后备存储。而写通过方法是在数据被修改时立即更新后备存储。

    7. 页大小:页的大小可以根据硬件和操作系统的设计而变化,常见的页大小有4KB、8KB等。

    虚拟内存的实现和管理涉及操作系统、硬件和应用程序之间的密切协作。虽然虚拟内存为应用程序提供了更多的可用内存,但过度的页面交换(称为"页面抖动")可能导致性能下降,因为访问磁盘要比访问物理内存慢得多。

    1.2 每一个进程都有自己独立的虚拟地址空间嘛?

    1. 每个进程是否都有一个页表?

      是的,每个进程都有其自己的页表。这是因为每个进程都有自己的虚拟地址空间,需要一个独立的映射机制来映射其虚拟地址到物理地址。这样,进程A中的虚拟地址0x1000可能映射到物理地址0x2000,而进程B中的同一个虚拟地址0x1000可能映射到一个完全不同的物理地址,例如0x3000。这个独立的地址空间为进程提供了隔离,确保一个进程不能轻易地访问或干扰另一个进程的内存。

    2. 每个进程可以是分页、分段或段页式布局吗?

      是的,进程的内存布局可以基于分页、分段或者两者的组合,即段页式布局。

      • 分页:这是现代操作系统中最常用的方式,它将虚拟内存和物理内存都分割成固定大小的页。每一页都有一个独立的虚拟到物理的映射。

      • 分段:分段是基于变长区段的,这些区段是根据程序的不同部分(如代码段、数据段)来划分的。每个段都有其自己的基址和限制。

      • 段页式布局:这是分段和分页的结合。首先,内存被分成多个段,每个段再进一步被分页。这样,首先会使用段表找到对应的段,然后在该段中使用页表找到具体的页。

      这三种布局中,分页是最常用的,因为它简化了内存管理并允许更细粒度的内存保护。而段页式布局则结合了分段和分页的优点,但也增加了一些复杂性。纯分段的布局现在在现代操作系统中不太常见。

    1.2 进程和线程的区别

    进程和线程都是操作系统中用于并发执行的基本单位,但它们之间存在明显的区别。以下列举了进程和线程之间的主要区别:

    1. 定义

      • 进程:进程是程序在执行时的一个实例。它是一个独立的执行实体,拥有自己的私有地址空间和系统资源。
      • 线程:线程是进程内的一个执行单位或执行路径。它分享父进程的地址空间和资源,但执行自己的指令序列。
    2. 资源独立性

      • 进程:每个进程都有其独立的地址空间、数据栈以及系统资源。这使得进程之间相对隔离,但也增加了进程切换的开销。
      • 线程:所有线程共享同一进程的地址空间和系统资源。线程之间的切换因此比进程切换要快得多。
    3. 通信

      • 进程:进程间通信 (IPC) 相对复杂,通常涉及如管道、消息队列、共享内存、套接字等机制。
      • 线程:由于线程共享相同的地址空间,所以它们之间的通信比进程间通信更为简单。线程可以直接读写同一进程中的数据结构,但这也带来了同步问题。
    4. 创建和终止开销

      • 进程:创建或终止一个进程的开销通常比线程更大,因为涉及到更多的资源分配和回收。
      • 线程:线程的创建和终止相对更为轻量级。
    5. 故障隔离

      • 进程:由于进程拥有独立的地址空间,一个进程崩溃不太可能影响其他进程。
      • 线程:一个线程在执行中出现问题(如访问非法内存)可能会影响同一进程中的其他线程。
    6. 调度和上下文切换

      • 进程:进程的上下文切换涉及更多的开销,因为要保存和恢复更多的信息。
      • 线程:线程的上下文切换相对较快,因为大部分资源(如地址空间)都是共享的。
    7. 应用场景

      • 进程:适用于需要更强隔离或运行在不同地址空间的应用。
      • 线程:适用于需要频繁的通信和快速上下文切换的应用。

    总之,进程和线程都有各自的优点和缺点。在设计并发系统或应用时,开发者需要根据特定需求来选择合适的执行实体。

    1.3 进程间的通信方式

    进程间通讯的7种方式

    2 java

    2.1 讲讲jvm的垃圾回收机制吧

    3 快手实习

    3.1 基础crud启动器是怎么回事

  • 相关阅读:
    如何避免重复创建线程?创建线程池的方式有哪些?各自优缺点有哪些?
    Android 9.0 ~ 12 获取系统内存大小、存储空间大小
    使用idea运行VUE项目
    【Make YOLO Great Again】YOLOv1-v7全系列大解析(Head篇)(尝鲜版)
    Linux ALSA 之二:ALSA 声卡与设备
    Rust 从入门到精通05-数据类型
    Maven工程开发
    基于RTLS的资产追踪
    安卓手机连接电脑实用技巧:实现文件传输与共享
    Vue Vue3
  • 原文地址:https://blog.csdn.net/yxg520s/article/details/133973671