linux 内存治理局部
- 物理内存、虚拟内存、分段分页、mmu、页表、tlb 的基本概念
- 过程的内存模型:栈、文件映射区、栈、data 段、bss 段、text 段
- 物理内存治理:buddy 和 slab,参考这篇文章
- 虚拟内存治理:brk 和 mmap,参考这篇文章,申请虚拟内存时还没有调配物理内存,缺页异样时申请物理内存并进行映射。
- 规范库:malloc,通过 brk 和 mmap 向操作系统申请内存,为了缩小不必要的零碎调用,malloc 也会治理内存,参考这篇文章
- 用户层:malloc 的定位是一个通用型的内存管理器,必须要均衡各种状况。在用户层能够针对非凡场景定制内存池,缩小开销(比方定长内存块申请、单线程治理)、便于监控和 debug 等等。参考这篇文章
过程、线程和协程
- 过程和线程的区别和分割
过程作为资源管理的根本单位,线程作为调度的根本单位,一个过程对应着一个到多个线程。 -
过程切换、线程切换
简述过程切换的流程:- 被动或者被动进入内核:时钟中断或者调用了阻塞的零碎调用(进入内核的操作会执行特权级切换,次要是从用户栈切换到内核栈,并保留必要的上下文到内核栈中(比方用户栈地址、下一个指令地址))
- 检测是否须要进行调度:工夫片耗费完或者期待在阻塞操作上或者有更高优先级的工作须要执行。
- 从中断返回时会进行检测是否须要进行调度,如果须要则进入调度流程。
- 运行调度算法,失去下一个须要被执行的工作对应的 pcb,执行 cpu 上下文切换(包含页表、寄存器、内核栈、必要时进行 tlb 刷新、cache 生效等)
- 继续执行新的工作。
- 线程切换是否比过程切换开销低,如果是阐明低在哪里?
如果是不同过程的线程切换,等价于过程切换,如果是雷同过程的线程切换,则对于共享资源(内存)不须要切换,这意味着不须要切换页表和 tlb,也不须要使 cache 生效。如果架构反对 ASID,则过程切换也不须要清理 tlb。 - 什么是协程?合作式调度、用户态切换
-
相比于异步代码,协程的意义?
- 在付出可控资源的状况下,用同步逻辑写异步代码,升高复杂度(状况简单的时候异步代码的状态太多了,复杂度太高)。
-
有栈协程
- 独立栈:调配多了节约空间,调配少了有栈溢出危险。
- 共享栈:切换时须要拷贝栈空间
- 参考这里
-
无栈协程
- 状态机 + 闭包
- 不能被非协程函数嵌套调用
- 须要编译器反对
-
协程切换为什么比线程切换开销低?
参考这个问题下的答复linux 的任务调度算法
- 对于实时过程:FIFO or Round Robin,对于一般过程:O(n) -> O(1) -> CFS
- 参考 这篇文章