Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions W10D2/VM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
VM exit 是指虚拟机执行过程中需要从虚拟化环境下陷到 hypervisor 的过程。这种情况通常发生在虚拟机试图访问某些受保护的资源或执行一些特殊的指令时,例如:
1. **I/O 操作**:当虚拟机试图对设备进行读写操作时,会触发 VM exit,然后 hypervisor 接管操作并转换为对物理设备的访问。
2. **内存映射操作**:当虚拟机试图访问被 hypervisor 保护的内存区域时,会触发 VM exit,然后 hypervisor 将该内存区域映射到虚拟机的地址空间中。
3. **特权指令**:当虚拟机执行一些特权指令(如修改页表、设置中断向量表等)时,由于它们可能会影响整个系统的运行和稳定性,因此会触发 VM exit,然后 hypervisor 接管操作并进行处理。
4. **中断/异常处理**:当虚拟机收到硬件中断或异常信号时,会触发 VM exit,然后 hypervisor 接管中断和异常处理,并将结果返回给虚拟机。
总之,VM exit 是由于虚拟机试图访问受保护的资源或执行一些特殊的指令而触发的,这时虚拟机需要从虚拟化环境下陷到 hypervisor 中进行处理。对于 VM exit 的处理方式和效率会对虚拟机的性能和响应时间产生影响,因此需要通过优化虚拟化环境、调整虚拟机设置等措施来减少 VM exit 的次数和开销。
为了减少从虚拟机下陷到 hypervisor 的次数,可以采取以下措施:
1. 适当调整虚拟机设置:可以通过调整虚拟机的 CPU 分配、内存大小、网络带宽等参数来优化虚拟机的性能,从而减少从虚拟机下陷到 hypervisor 的频率。
>1. 减少需要 VM exit 的操作:当虚拟机的 CPU、内存或网络性能较低时,它**可能会频繁地进行 I/O 操作、内存访问等操作**(带宽不够),这些操作可能需要从虚拟化环境下陷到 hypervisor,并触发 VM exit。如果虚拟机的性能得到提升,它就可以更快地完成这些操作,从而减少了需要 VM exit 的次数。例如,**如果虚拟机的 CPU 性能不足,它就可能会频繁进行上下文切换**,并且无法充分利用 CPU 的时间片,这样会导致 VM exit 的次数增多。如果调整虚拟机的 CPU 分配,使其得到更多的 CPU 时间片,就可以减少上下文切换和 VM exit 的次数。
>2. 加速 VM exit 的处理:当 VM exit 确实需要发生时,如果 hypervisor 可以更快地处理它,就可以减少 VM exit 的耗时,从而提高整个系统的性能和响应时间。例如,对于一些常见的 VM exit 原因,如 I/O 操作、内存映射等,可以采用硬件加速技术(如 Intel VT-x、AMD-V)来加快 hypervisor 对 VM exit 的处理速度。此外,还可以通过优化虚拟化软件的实现方式、采用更好的调度策略等方式来加快 VM exit 的处理速度。
2. 使用硬件辅助技术:现代 CPU 支持一些硬件辅助技术,如 Intel VT-x、AMD-V 等,这些技术可以支持虚拟机的直接执行和共享资源,从而减少从虚拟机下陷到 hypervisor 的操作次数。**硬件虚拟化(EL2),设备直通。**
3. 避免不必要的 VM exit:可以通过避免不必要的指令或操作,如 I/O 操作、内存访问、中断处理等,来减少从虚拟机下陷到 hypervisor 的次数。**内存虚拟化、中断虚拟化、I/O虚拟化。**
4. 优化虚拟化软件:虚拟化软件本身也可以进行优化,如针对常见的 VM exit 原因进行优化、采用更好的调度策略、使用更高效的中断处理方式等等,从而减少从虚拟机下陷到 hypervisor 的次数。
总之,为了减少从虚拟机下陷到 hypervisor 的次数,可以通过适当调整虚拟机设置、使用硬件辅助技术、避免不必要的 VM exit 和优化虚拟化软件等多种方式来实现。这样可以提高系统的性能和响应时间,从而更好地支持虚拟化环境。
### Watchdog
watchdog(看门狗)是一种系统监控机制,它可以检测和处理系统中的故障或错误状态。具体来说,watchdog 会周期性地向系统发送一个“心跳信号”,以确保系统正常运行,如果系统出现故障或意外停止运行,watchdog 就会触发相应的处理流程,如自动重启系统等。
在嵌入式系统、服务器等关键领域中,watchdog 是一种重要的安全机制。通过定期检测系统状态和自动处理异常情况,watchdog 可以提高系统的可用性和稳定性,避免因系统故障而导致数据损失和业务中断等问题。
watchdog 的实现方式有多种,其中最常见的是基于硬件的 watchdog,即使用专门的硬件电路或芯片来实现 watchdog 机制。这种硬件 watchdog 能够独立于系统 CPU 运行,并且可以在系统故障时自动触发特定的操作,如重启系统或触发警报等。
除了硬件 watchdog,还有基于软件的 watchdog 实现方式。软件 watchdog 通常是通过在系统内核中增加相应模块或驱动程序来实现的,它可以定期检测系统状态,并根据需要触发相应的操作。与硬件 watchdog 相比,软件 watchdog 的实现成本更低,但需要消耗系统资源并对系统性能产生影响。
总之,watchdog 是一种系统监控机制,通过定期检测系统状态和自动处理异常情况来提高系统的可用性和稳定性。它包括基于硬件的 watchdog 和基于软件的 watchdog 两种实现方式,并在关键领域中得到广泛应用。
在多核场景中,watchdog 仍然是一种重要的系统监控机制。由于现代计算机通常都配备有多个 CPU 核心,因此需要使用 watchdog 机制来监测和处理多个核心之间的故障或错误状态。
在多核场景中,可以使用多个 watchdog 来分别监测不同的 CPU 核心,以避免单一 watchdog 过度集中处理工作而导致性能下降或不稳定的情况。此外,还可以通过优化 watchdog 的实现方式、调整 watchdog 的周期等方式来提高系统的响应速度和准确性。
58 changes: 58 additions & 0 deletions W14D2/Review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
## 线程 进程
8-core CPU: when pthread
real/yield time
turbo: change the CPU frequency, thus change the speed
## 优先级反转
优先级反转
优先级继承:如果在pthread转换的时候发现了锁,为了避免轮空,让$T_2$继承$T_1$的优先级
lock unlock
$T_1$—————————— ———————————
$T_2$ ———
lock
transaction抽象
## 内存
vdso等内存段
内存应不应该能感觉到地址页的存在
buddy伙伴算法应该出现在哪里进行管理,地址异或,位图bit
MMU `MAKE_SATP`
KPTI: page table $\rightarrow$ kernel page table isolation
from user state to kernel state, we have to flush all the TLB

软链接和硬链接中inode的区别是什么
superblock backup stored on blocks: ?
mmap读写与普通文件系统的区别,`char *`读写不会把整个文件全部load进来
类FAT文件系统的缺点是什么,如何实现变长度读?引入page
## 虚拟化与安全
虚拟机内翻译一次虚拟地址多少次内存访问
watchdog
rcu: detect stalls
NMI
cli关中断
kernel thread (not process): share memory space
内核挂了:狗死了
VMX root mode/VMX non-root mode
Guest OS/Guest User/Guest Kernel
CR3 points to the PA of virtual machine
GVA $\rightarrow$ GPA $\rightarrow$ HPA
software realizing? 四级 20/16 times of read
hardware realizing? no virtualization, I/O interruption via kvm to host machine
## Fork分析
## 综合设计
### VMEXIT
GPU I/O interruption $\rightarrow$ via kvm in Host OS $\rightarrow$ VCPU/VGPU $\rightarrow$ come back to host to handle interrupt
The process of devisualization and coming back to host is consuming a lot of time
Non-Latency and in great number
Zheng Wenxin: Delay+Batch
I/O thread: collect all the interruptions in one queue and when it accumulates to some extent, just trigger one kvm processing, we hope to avoid strenuous exit from virtual machine.
In which condition will this be better?
### NUMA
when the number of cores are increased to an extent, then the cache collision will be very serious, so the throughput will decrease greatly.
A list of locks, and when one pthread gets the lock and change the variable, the next lock in the list will wait for it.
So at a time, there are only two pthreads fighting for that variable.
This will decrease the cache covariance and ensure justice.
avoid the core which is farther to the data failing all the time.
### 可信执行环境
TEE: protect from Host OS.
If the computing is performed only in CPU or GPU, we can isolate the computing in hardware.
But if there are interaction between CPU and GPU
crypto + CPU can be in TEE.
27 changes: 27 additions & 0 deletions W6D2/FS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
File System
文件系统是系统对文件的存放排列方式,不同格式的文件系统关系到数据是如何在磁盘进行存储,文件名、文件权限和其他属性也存在不同。Windows操作系统支持 NTFS, FAT32, and exFAT三种不同文件系统。NTFS是目前Windows系统中一种现代文件系统,目前使用最广泛,内置的硬盘大多数都是NTFS格式。FAT32是一种相对老旧的文件系统,不能像NTFS格式支持很多现代文件格式的属性,但对于不同系统平台具有良好的兼容性,可以在Linux、Mac或Android系统平台上通用。exFAT是FAT32文件格式的替代品,很多设备和操作系统都支持该文件系统,但是目前用的不多。
1、Fat32
2、exFAT
3、NTFS

### 软链接和硬链接
有时候我们希望给某个文件取个别名,那么在 Linux 中可以通过硬链接(Hard Link) 和软链接(Symbolic Link) 的方式来实现,它们都是比较特殊的文件,但是实现方式也是不相同的。

硬链接是多个目录项中的「索引节点」指向一个文件,也就是指向同一个 inode,但是 inode 是不可能跨越文件系统的,每个文件系统都有各自的 inode 数据结构和列表,所以硬链接是不可用于跨文件系统的。由于多个目录项都是指向一个 inode,那么只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。

软链接相当于重新创建一个文件,这个文件有独立的 inode,但是这个文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。

### 文件 I/O
文件的读写方式各有千秋,对于文件的 I/O 分类也非常多,常见的有

缓冲与非缓冲 I/O
直接与非直接 I/O
阻塞与非阻塞 I/O VS 同步与异步 I/O
接下来,分别对这些分类讨论讨论。

缓冲与非缓冲 I/O
文件操作的标准库是可以实现数据的缓存,那么根据「是否利用标准库缓冲」,可以把文件 I/O 分为缓冲 I/O 和非缓冲 I/O: - 缓冲 I/O,利用的是标准库的缓存实现文件的加速访问,而标准库再通过系统调用访问文件。 - 非缓冲 I/O,直接通过系统调用访问文件,不经过标准库缓存。

这里所说的「缓冲」特指标准库内部实现的缓冲。

比方说,很多程序遇到换行时才真正输出,而换行前的内容,其实就是被标准库暂时缓存了起来,这样做的目的是,减少系统调用的次数,毕竟系统调用是有 CPU 上下文切换的开销的。