1.介绍copy on write(写时复制)
2.copy on write节省了什么资源?
3.malloc 1KB和1MB 有什么区别?
4.介绍一下brk,mmap
5.操作系统内存不足的时候会发生什么?
6.页面置换有哪些算法?
7.什么是中断?
8.中断的类型有哪些?
9.中断的作用是什么?
10.你了解过哪些io模型?
1.介绍copy on write(写时复制)
其基本思想是在多个进程或操作中共享资源时,推迟资源的复制,直到有必要进行修改时才进行实际的复制操作。来减少不必要的资源浪费、提高内存利用率、优化性能以及简化系统管理。这种技术可以大幅度提升系统的并发能力、内存利用率和存储效率,尤其在高负载、大规模应用环境中表现尤为突出。
例如,发生在fork时,子进程创建新的虚拟地址(与父进程不同),但都指向父进程的物理地址。只有子进程发生写操作的时候才会对物理地址进行复制。这么做的原因是子进程在创建时就复制物理地址,耗时太长,也会造成不必要的内存占用。
2.copy on write节省了什么资源?
Copy on Write(COW)节省了内存和存储资源。它通过推迟资源复制,只有在数据被修改时才进行复制,从而避免了不必要的重复数据占用内存和磁盘空间,提升了系统的资源利用效率。
3.malloc 1KB和1MB 有什么区别?
malloc是C语言的函数,用于动态内存分配。
如果用户分配的内存小于 128 KB,则通过 brk() 申请内存;
如果用户分配的内存大于 128 KB,则通过 mmap() 申请内存;
char *mem_1KB = (char *)malloc(1024); // 1KB = 1024 字节
char *mem_1MB = (char *)malloc(1024 * 1024); // 1MB = 1024 * 1024 字节
注意,不同的 glibc 版本定义的阈值也是不同的。
4.介绍一下brk,mmap
1、brk是就是通过 brk() 函数将「堆顶」指针,向高地址移动,获得新的内存空间。
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
下图是 32 位系统典型的虚拟地址空间分布(来自《深入理解计算机系统》)。

5.操作系统内存不足的时候会发生什么?
- 应用程序通过 malloc 函数实际上申请的是虚拟内存,此时并不会分配物理内存。
- 当应用程序读写了这块虚拟内存,CPU发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断 。进程从用户态转到内核态,并交由内核的Page Fault Handler (缺页中断函数)处理。
- 处理函数会看是否有空闲的物理内存,有则直接分配;否则会进一步涉及内存回收(包含内存置换),甚至out of memory报错。
内核的回收内存分为异步和直接,区别就在内存回收是同步的还是放到后台异步进行。
空闲的物理内存仍然无法满足此次物理内存的申请—触发 OOM (Out of Memory)机制。

6.页面置换有哪些算法?
内存不足时,需要部分内存数据写入磁盘,再把需要的写入内存。为了面对各种场景,尽可能减少页面置换的次数,提出了很多的页面置换算法。
-
先进先出(FIFO)
原理: 先进先出算法按照页面进入内存的顺序来选择置换页面。最早进入内存的页面会被最先移出。
优点: 简单易实现。
缺点: 可能会将频繁访问的页面置换出去,即产生“ Belady 异常”(页面访问越多,缺页率反而越高)。 -
最近最少使用(LRU)
原理: 最近最少使用算法选择最近一段时间内最少被访问的页面进行置换。可以通过维护一个页面访问的时间戳或使用栈来跟踪页面的使用情况。
优点: 一般情况下表现较好,因为它倾向于保留最近常用的页面。
缺点: 实现较为复杂,尤其在硬件或低级系统中,可能会导致额外的性能开销。 -
最不常用(LFU)
原理: 最不常用算法选择访问次数最少 的页面进行置换。它会跟踪每个页面的访问频率,选择访问最少的页面移除。
优点: 能有效减少因偶尔访问的页面带来的性能问题。
缺点: 难以维护,特别是频繁更新访问计数,且当页面访问模式发生变化时可能表现不好。 -
时钟(Clock)
原理: 时钟算法通过维护一个循环队列,模拟时钟的指针。当需要置换页面时,指针按顺序检查页面,选择那些被标记为“不常访问”的页面进行置换。
优点: 实现简单,且能提供类似LRU的效果,性能较好。
缺点: 虽然较LRU简单,但在某些情况下可能不如LRU准确。

-
最佳(OPT)
原理: 最佳置换算法选择当前不会在未来一段时间内被使用的页面进行置换。理论上,这是最优的页面置换策略。
优点: 这是一个理想的算法,能实现最低的缺页率。
缺点: 实际应用中无法预测未来访问的页面,因此无法实现。常用于性能测试或理论分析。
7.什么是中断?
CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。
具体流程:保存现场-根据中断向量表处理终端-恢复现场。

8.中断的类型有哪些?
中断事件来自于CPU外部的被称为外部中断 ,来自于CPU内部的则为内部中断 。
外部中断还能分为:可屏蔽中断和不可屏蔽中断。 外部中断必然是某个硬件产生的。
内部中断按事件是否正常来划分可分为软中断和异常 两种。其中软中断是由软件主动发起的中断,常被用于系统调用(system call);而异常则是指令执行期间CPU内部产生的错误引起的。
这里异常和不可屏蔽中断的区别:不可屏蔽中断发生的事件会导致处理器无法运行(如断电、电源故障等),而异常则是影响系统正常运行的中断(如除0、越界访问等)。
9.中断的作用是什么?
中断使得计算机系统具备应对对处理突发事件的能力,提高了CPU的工作效率。没有中断机制,处理器只能按顺序执行编码,那么采用轮询方式进行工作,就不能及时响应紧急的事件。
10.你了解过哪些io模型?
IOIO,好烦,在redis就一天天地被烦,根本理解不清楚,现在又要重新再来。
I/O模型 的选择依赖于应用程序的需求,如并发量、响应时间等。
阻塞 I/O 简单但效率低,适用于简单任务。
非阻塞 I/O 提高了并发性能,但增加了程序复杂性。
I/O 多路复用 是在高并发情况下避免线程阻塞的常见策略。
异步 I/O 是最为高效的模型,适用于需要大量并发操作的复杂系统。
I/O(Input/Output)指的是计算机系统与外部环境之间的数据交换。 它包括从外部设备(如键盘、鼠标、硬盘、网络接口等)获取数据的输入操作,或者将数据传输到外部设备的输出操作。I/O操作是计算机程序与外部世界交互的主要方式。
-
阻塞 I/O(Blocking I/O)
描述: 在这种模型中,线程在执行 I/O 操作时被阻塞,直到 I/O 操作完成。调用者发出 I/O 请求后,会进入等待状态,直到数据完全读入或写入。
适用场景: 简单的应用程序,I/O 操作少,线程数量少。
优缺点:
优点: 实现简单,代码逻辑清晰。
缺点: 效率低,尤其在高并发情况下,线程可能会大量阻塞,导致资源浪费。 -
非阻塞 I/O(Non-Blocking I/O)
描述: 线程发起 I/O 请求后,如果 I/O 操作未完成,线程会立即返回而不被阻塞 ,程序可以继续处理其他任务。需要反复检查 I/O 操作的状态。
适用场景: 高并发、高响应需求的场景。
优缺点:
优点: 提高了程序的并发性能,避免了线程等待。
缺点: 需要通过轮询(polling)或事件通知来获取操作状态,增加了复杂性和CPU消耗。 -
I/O 多路复用(I/O Multiplexing)
描述: 通过一个或多个线程来管理多个 I/O 操作。线程可以同时监控多个 I/O 描述符,当其中一个或多个准备好时,线程会被唤醒进行处理。常见的系统调用有 select()、poll() 和 epoll()(Linux)。
适用场景: 网络服务器、需要处理大量并发连接的程序。
优缺点:
优点: 不会为每个连接都创建一个线程,减少了系统资源的消耗。
缺点: 需要管理大量的 I/O 描述符,并且处理较为复杂,特别是在大规模并发时,效率可能下降。 -
信号驱动 I/O(Signal-Driven I/O)
描述: 当某个 I/O 操作准备好时,操作系统会向程序发送一个信号 ,通知程序该操作可以继续进行。程序会在接收到信号后,重新发起 I/O 请求。
适用场景: 比如高并发的网络应用,信号机制可以减少轮询的开销。
优缺点:
优点: 相比于非阻塞 I/O,程序不需要频繁检查 I/O 状态。
缺点: 处理信号需要一些额外的管理,且信号机制可能较难调试。 -
异步 I/O(Asynchronous I/O)
描述: 在异步 I/O 模型下,程序发起 I/O 请求后,操作系统会在后台完成 I/O 操作,程序可以继续执行其他任务。当 I/O 操作完成时,操作系统会通知程序。这是最优的 I/O 模型,能充分利用系统资源。
适用场景: 需要高性能、高并发、低延迟的应用,如数据库、Web 服务器等。
优缺点:
优点: 高效,程序不会被阻塞,可以同时处理多个 I/O 请求。
缺点: 实现复杂,需要良好的事件通知机制。
8万+

被折叠的 条评论
为什么被折叠?



