内核学习

操作系统与内核

Posted by 大狗 on August 23, 2021

0 前言

很多东西记不住了,所以写一写

1 Linux进程线程

和Unix不同,

2 Linux进程调度

2.1 Linux CFS调度器

公平调度器的实现

  • 时间记账
    • 调度器的实体结构
    • 虚拟实时
  • 进程选择
    • CFS使用红黑树组织进程
  • 调度器入口
    • schedule()函数,
  • 睡眠和唤醒

综上CFS的实现了解了,那么何时发生抢占和上下文切换?

  • 用户抢占,当从内核返回用户空间的时候,因为可以继续执行当前程序,那么自然就可以选择新的进程执行任务。所以再从中断处理程序或者系统调用返回的时候,都会检查need_resched标志,如果设置了就切换。总之,切换发生在
    • 从系统调用返回用户空间时
    • 从中断处理程序返回用户空间时(这里注意,有人会疑问要是没有中断,那这个程序不是一直运行?时钟中断是一直运行的,所以必然会出现切换)
  • 内核抢占

问题,按照CFS的方法,何时会发生

1 相关问题

  • RISC和CISC区别:精简指令集和复杂指令集,相比CISC,RISC只保留了常用的简单指令。

  • 大端/小端:高地址在低位是大端,高地址在高位是小端,比方说0x12345678,大端就是0x12在低地址,而0x78在高地址。

  • 简述在你熟悉的CPU里面,一条存储读写指令的执行全过程:经典计算机的流水线架构是5级流水线,分别是取指,译码,执行,数据内存访问和返回,但是现代CPU加了超标量架构和乱序执行技术。

    这里面有个问题,乱序执行并不是指提交结果的时候是乱序的,提交结果的时候是按照指令次序的方式执行的,只不过

  • 内存屏障产生的原因

  • 高速缓存的工作方式。处理器先将虚拟地址传给高速缓存和tlb,处理器先用有效页帧号查找真实页帧号,如果未命中那么就去查询也表,如果命中了那么就能迅速拿到物理地址。

    同时,处理器可以根据索引找到对应的高速缓存行,这个时候就需要拿高速缓存行的标记和MMU的标记比较,如果命中那就可以通过对齐和选择直接拿到数据。如果未命中,那么处理器就使用物理地址来访问主存储器获得最终数据,并且填充高速缓存。这种事VIPT的高速缓存。

  • 高速缓存的映射方式

  • PIPT和VIPT的区别,重名和同名又是什么?PIPT,物理地址的索引域和物理地址的标记,因此PIPT需要先查询TLB/MMU获得物理地址,然后才能查询高速缓存。而VIPT使用虚拟地址做index,物理地址做标记。可以直接查询高速缓存,而不需要获得物理地址。VIVT使用虚拟地址做索引,虚拟地址做标记。重名问题是指不同虚拟地址映射了同一个物理地址,而同名值得是相同的虚拟地址对应不同的物理地址。

  • 给出访问内存的流程:分页机制引入了虚拟存储器的概念。虚拟地址分为两个部分,以32位为例子VA[31:0],如果每个页的大小为4kb,那么VA[11:0],是内部偏移量;另一部分是虚拟页帧号,MMU的作用就是从虚拟页帧号转换为物理页帧号。处理器一般使用一张表来存储VPN到PFN的转移。由于访问内存比较慢,因此操作系统会使用TLB缓存虚拟地址对应的PFN,从而加速访问。

  • HUGEPAGE的作用是什么?HUGEPAGE一方面是节省了从VPN到PFN存储的数量,毕竟原先是4MB,另一方面减少了TLB miss的概率。

  • MESI协议的细节?

  • 如果4个核对一段数组写操作,这四个核的CPU L1 L2cache的状态变化,比方说数组是四个相邻的uint64,每个核只写自己对应的元素。

唉,尴尬

狗头的赞赏码.jpg