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,每个核只写自己对应的元素。
唉,尴尬