Skip to content

Commit

Permalink
update more notes's markdown format.
Browse files Browse the repository at this point in the history
  • Loading branch information
hxf0223 committed Sep 11, 2024
1 parent 85c602a commit ef75468
Show file tree
Hide file tree
Showing 18 changed files with 79 additions and 80 deletions.
16 changes: 8 additions & 8 deletions _posts/2024-08-08-mmu-tlb-table-walk-unit-page-table.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ mermaid: true
# pin: true
---

## 1. `MMU` 结构以及工作过程
## 1. `MMU` 结构以及工作过程 ##

大多数使用`MMU`的机器采用内存`分页机制`,虚拟地址空间以`页(Page)`为单位,相应的,物理地址空间也被划分为`页帧(Frame)``页帧`必须与``保持相同的大小,通常为4KB,对于大页,页帧可以是2MB或1GB。大页一般用于服务器,用于系统分配大量数据,减少缺页中断的发生。

Expand All @@ -33,19 +33,19 @@ CPU发出的`VA`由两部分组成:`VPN(Virtual Page Number)` + `offseet`。

![VPN to PFN](/assets/images/cpu/mmu_20240808/vpn_to_pfn.webp)

### 1.1 从`VA``PA`,MMU处理流程图
### 1.1 从`VA``PA`,MMU处理流程图 ###

![MMU VA to PA Process](/assets/images/cpu/mmu_20240808/mmu_va_to_pa_procesure.png)

## 2. 页表结构
## 2. 页表结构 ##

现代CPU一般采用四级页表结构。以32位地址空间的二级页表为例,CPU发出的虚拟地址被拆分分为:页目录(Page Directory)、页表(Page Table)、页内偏移(Page Offset)三级(以4k为例,即12位)。

`VPN`的最高10位用于索引页目录,紧接的10位用于索引页表索引,最低12位为页内偏移地址。拆分结构如下图所示:

![Page Table Structure](/assets/images/cpu/mmu_20240808/页表目录索引_页表索引_地址偏移.webp)

### 2.1 MMU查找过程
### 2.1 MMU查找过程 ###

MMU先根据一级页表的物理地址和一级页表Index去一级页表中找PTE,PTE中的地址不再是最终的物理地址,而是二级页表的物理地址。

Expand All @@ -57,15 +57,15 @@ MMU先根据一级页表的物理地址和一级页表Index去一级页表中找

使用二级页表的好处是如果一级页表中的某一个PTE没有命中,那这一PTE对应的整个二级页表就不存在。

### 2.2 进程页表与 Address Space ID
### 2.2 进程页表与 Address Space ID ###

`操作系统`会为`每个进程`分配一个`页表`,该`页表`使用`物理地址`存储。当`进程`使用类似`malloc`等需要`映射代码或数据`的操作时,`操作系统`会在随后马上`修改页表`以加入新的 `物理内存`

每次`切换进程`都需要进行`TLB清理`。这样会导致切换的效率变低。为了解决问题,`TLB`引入了`ASID(Address Space ID)``ASID`的范围是`0-255``ASID`由操作系统分配,`当前进程的ASID值`被写在`ASID寄存器(使用CP15 c3访问)``TLB`在更新`页表项`时也会将`ASID`写入`TLB`

`MMU`在查找`TLB`时, 只会查找`TLB`中具有`相同ASID值``TLB行`。且在切换进程时,`TLB`中被设置了`ASID``TLB行`不会被清理掉,当下次切换回来的时候还在。所以`ASID`的出现使得切换进程时不需要清理`TLB`中的所有数据,可以大大减少`切换开销`

## 3. `页表项(PTE)``TLB` 中的标志位
## 3. `页表项(PTE)``TLB` 中的标志位 ##

在进程的虚拟内存空间中,每一个虚拟内存页在页表中都有一个`PTE`与之对应,在32位系统中,每个`PTE`占用4个字节大小,其中保存了虚拟内存页背后映射的物理内存页的起始地址,以及进程访问物理内存的一些权限标识位。

Expand All @@ -82,7 +82,7 @@ MMU先根据一级页表的物理地址和一级页表Index去一级页表中找
- `PCD(2)``Page Cache Disable`,表示`PTE`指向的物理内存页面中的内容,是否可以被缓存到`Cache`中。在`SOC`异构处理器共享同一块物理内存时,可以使用`PCD`创建禁止`Cache``PTE`
- `PWT(3)`: `Page Write-Through`,表示`PTE`指向的`CPU Cache`中的内容,是直接写入物理内存(Write-Through),还是在`Cache-line`被中的内容被替换时写入物理内存(Write-Back)。

## 4. 缺页处理过程
## 4. 缺页处理过程 ##

- 处理器要对虚拟地址`VA`进行访问。
- `MMU``TLB`没有命中,通过`TWU`遍历主存页表中的PTEA(PTE地址)。
Expand All @@ -94,7 +94,7 @@ MMU先根据一级页表的物理地址和一级页表Index去一级页表中找

![Page Fault Process](/assets/images/cpu/mmu_20240808/page_fault.png)

## 参考
## 参考 ##

- [知乎 -- 图解MMU](https://zhuanlan.zhihu.com/p/487386274)
- [简书 -- ARM体系架构——MMU](https://www.jianshu.com/p/ef1e93e9d65b)
Expand Down
16 changes: 8 additions & 8 deletions _posts/2024-08-11-atomic.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,31 @@ mermaid: true
# pin: true
---

## 1. CPU Cache 内部结构
## 1. CPU Cache 内部结构 ##

![CPU structure](/assets/images/cpu/memory_order_20240811/cpu_structure.png)

一个core内部结构:cache, store buffer, invalidate queue,结构如下图所示:

![CPU cache structure](/assets/images/cpu/memory_order_20240811/core_structure_cache_store_buffer_inv_queue.png)

### 1.1 为什么需要 MESI
### 1.1 为什么需要 MESI ###

`MESI``CPU`内部多个`core`同步通讯协议,保证多个`core`中的`cache`的数据一致性。

通过给`cache line`设置状态位,以及`CPU core`(也可能有内存控制器参与)之间的消息同步逻辑,让多个`core`中的`cache`数据保持一致性。`core`之间通讯过程示例:[知乎 --为什么需要内存屏障](https://zhuanlan.zhihu.com/p/55767485)

在没有`store buffer`之前,`MESI`可以保证不需要`memory fence`指令也可以保证数据的一致性(理解:但不能保证指令重排导致两个线程访问先后顺序)。

## 2. memory fence
## 2. memory fence ##

### 2.1 概念及理论
### 2.1 概念及理论 ###

- 同步点:针对同一个`原子变量``load`操作与`store`操作,分别构成一个`同步点`。其概念有三要素:(1):`load`/`store`操作,(2):针对同一个原子变量,(3):以及在不同线程中;
- `synchronize-with` 关系,该概念包含两个含义:(1):同一个同步点,(2):读取的值是另一个同步点写入的值;
- `happens-before` 关系;

### 2.2 为什么需要 memroy fence
### 2.2 为什么需要 memroy fence ###

例如有两个`CPU core``CPU0`,以及`CPU1``CPU0`写入,`CPU1`读取同一个变量。`CPU0`认为写入到`store buffer`就够了,而`CPU1`则认为必须写入到`cache`才叫写入。

Expand All @@ -47,15 +47,15 @@ mermaid: true
- [Cache一致性和内存一致性](https://wudaijun.com/2019/04/cache-coherence-and-memory-consistency/)
- [Acquire and Release Fences](https://preshing.com/20130922/acquire-and-release-fences/)

## 3. memory order seq_cst 与 release_acquire 区别
## 3. memory order seq_cst 与 release_acquire 区别 ##

TODO

## 更多资料
## 更多资料 ##

- [C++ Concurrency In Action 2ed 中文翻译](https://simonhancrew.github.io/CppConcurencyInAction/)
- [C++ Concurrency in Action, 2nd Edition](/assets/pdf/cpu/C++%20Concurrency%20in%20Action,%202nd%20Edition.pdf)

## HTTP 参考资料
## HTTP 参考资料 ##

- memory ordering: http://gavinchou.github.io/summary/c++/memory-ordering
14 changes: 7 additions & 7 deletions _posts/2024-08-13-cpp-perf-repos.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ mermaid: true
# pin: true
---

## 1. 虚拟内存分配
## 1. 虚拟内存分配 ##

### 1.1 mmap
### 1.1 mmap ###

`mmap`用于建立`文件映射`,或者`匿名映射`

当用于`文件映射`时,`mmap`将文件内容缓存进内核空间的`page cache`里面,然后将用户的一段虚拟内存空间直接映射到`page cache`。用户通过访问这段虚拟内存,直接读写内核空间上的`page cache`,避免buffer拷贝开销及用户态的切换。

`mmap`用户建立`匿名映射`时,将用户空间的一段虚拟内存空间直接映射到某段物理内存上,这段虚拟内存称为`匿名页``匿名映射`用于`malloc`操作(大于128KB)。

### 1.2 malloc / free
### 1.2 malloc / free ###

在现代操作系统中,`malloc`的作用是分配虚拟内存空间,并不实际分配物理内存。当分配的虚拟内存空间第一次被访问时,才会真正的分配物理内存(OS的写时分配行为)。

Expand All @@ -33,24 +33,24 @@ mermaid: true
![malloc-brk](/assets/images/os/malloc_20240827/malloc_brk.png)
![malloc-mmap](/assets/images/os/malloc_20240827/malloc_mmap1.png)

### 1.3 new / delete
### 1.3 new / delete ###

`new` / `delete`操作时,在调用`malloc`/`free`基础上,对`non-trival`对象,调用其构造/析构函数;对于`trival`对象,不需要调用构造/析构函数,直接分配/释放内存。

## 2. 内存分配优化
## 2. 内存分配优化 ##

* 用户态内存分配:intel TBB malloc, tcmalloc,Vulkan Memory Allocator等。( 经测试,microsoft mimalloc适配性不是很好,使用过程中会出错;intel TBB malloc overhead似乎比较大)
* 内存池。(见下面资料链接)
* 对象池。

### 2.1 参考资料
### 2.1 参考资料 ###

* [Vulkan Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
* [Vulkan Memory Allocator -- docs](https://gpuopen-librariesandsdks.github.io/VulkanMemoryAllocator/html/quick_start.html)
* [游戏架构设计:内存管理](https://www.cnblogs.com/KillerAery/p/10765893.html)
* [游戏架构设计:高性能并行编程](https://www.cnblogs.com/KillerAery/p/16333348.html)

## 3. github -- 内存池仓库
## 3. github -- 内存池仓库 ##

* [github -- memory](https://github.com/foonathan/memory)
* [github -- poolSTL](https://github.com/alugowski/poolSTL)
13 changes: 6 additions & 7 deletions _posts/2024-08-13-std-function.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ mermaid: true

`std::function` 可以将`函数`,`函数对象(仿函数)`,`lambda表达式`包装成一个`对象``std::function``对象`本身可以作为函数参数,并且是可复制的(复制构造、赋值)。

## 1. 封装函数指针
## 1. 封装函数指针 ##

```cpp
int add(int a, int b) { return a + b; }
Expand All @@ -25,7 +25,7 @@ int main() {
}
```
## 2. 封装函数对象(仿函数)
## 2. 封装函数对象(仿函数) ##
```cpp
struct Adder {
Expand All @@ -41,7 +41,7 @@ int main() {
}
```

## 3. 封装 lambda 表达式
## 3. 封装 lambda 表达式 ##

```cpp
int main() {
Expand All @@ -53,7 +53,7 @@ int main() {
}
```

## 4. 与 std::bind 结合使用
## 4. 与 std::bind 结合使用 ##

```cpp
int add(int a, int b) { return a + b; }
Expand All @@ -66,7 +66,7 @@ int main() {
}
```
## 5. lambda 表达式
## 5. lambda 表达式 ##
`lambda`表达式是一个匿名`函数对象`,即编译器会创建一个`仿函数`( 调用时,调用 `operator()(....)` ),并将外部捕获的变量,添加到该匿名对象中。这些是`lambda`的额外开销。
Expand Down Expand Up @@ -115,7 +115,6 @@ int main()
}
```

## 参考
## 参考 ##

- [What is a lambda expression, and when should I use one?](https://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-and-when-should-i-use-one)

8 changes: 4 additions & 4 deletions _posts/2024-08-16-RANSAC.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ mermaid: true
# pin: true
---

## 1. RANSAC 算法过程
## 1. RANSAC 算法过程 ##

`最小二乘法`拟合只进行一次迭代,计算所有离散点平均值,得到最终拟合直线或曲线。

Expand All @@ -33,7 +33,7 @@ Demo计算结果如下:

![RANSAC迭代结果](/assets/images/algorithm/RANSAC_20240816/RANSAC_result_demo.png)

## 2. 算法改进
## 2. 算法改进 ##

实际应用中,发现不能直接应用`RANSAC`算法。一个原因离散点(点云)数量过大,实际应用不能拟合期望的直线。另外就是其迭代次数在大数据量下,计算量过大。

Expand All @@ -45,10 +45,10 @@ Demo计算结果如下:
2. 根据行业应用特点,限定起点、限定密度、限定斜率;
3. 综合使用其中一个或多个,特别是初步筛选及限定起点;

## 3. 实现
## 3. 实现 ##

TBD

## 4. 更多资料
## 4. 更多资料 ##

* [Ransac 随机一致性采样](https://scm_mos.gitlab.io/algorithm/ransac/)
10 changes: 5 additions & 5 deletions _posts/2024-08-21-intel-tbb-malloc-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ mermaid: true
# pin: true
---

## CMake 查找 Intel TBB
## CMake 查找 Intel TBB ##

```cmake
find_package(
Expand All @@ -23,7 +23,7 @@ if(TBB_FOUND)
endif()
```

## 链接引入 TBB 库
## 链接引入 TBB 库 ##

```cmake
if (MSVC)
Expand All @@ -32,7 +32,7 @@ if (MSVC)
endif()
```

## cpp 代码中引入 TBB 符号,防止库链接被优化掉
## cpp 代码中引入 TBB 符号,防止库链接被优化掉 ##

```cpp
#if defined(WITH_TBB_MALLOC) && defined(_MSC_VER) //&& defined(NDEBUG)
Expand All @@ -43,7 +43,7 @@ endif()
#endif
```

## 查看内存分配函数替换是否出错
## 查看内存分配函数替换是否出错 ##

```cpp
#if defined(WITH_TBB_MALLOC) && defined(_MSC_VER) //&& defined(NDEBUG)
Expand All @@ -65,6 +65,6 @@ endif()
#endif
```

## 资料
## 资料 ##

* [How to Use oneTBB for Efficient Memory Allocation in C++ Applications](https://www.intel.cn/content/www/cn/zh/developer/articles/technical/how-to-use-onetbb-for-memory-allocation-cpp.html)
4 changes: 2 additions & 2 deletions _posts/2024-08-21-ubuntu-bash-alias.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ mermaid: true
# pin: true
---

## bash alias
## bash alias ##

```bash
###################
Expand All @@ -31,7 +31,7 @@ alias c='clear'
alias r='reset'
```

## bash 显示 git status
## bash 显示 git status ##

```bash
# Show git branch name
Expand Down
4 changes: 2 additions & 2 deletions _posts/2024-08-22-cmake-check-system-andcompiler.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ mermaid: true
# pin: true
---

## 判断操作系统
## 判断操作系统 ##

```cmake
IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
Expand All @@ -24,7 +24,7 @@ MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")
```

## 判断编译器
## 判断编译器 ##

```cmake
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
Expand Down
8 changes: 4 additions & 4 deletions _posts/2024-08-23-ubuntu-install-opencv.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ mermaid: true
# pin: true
---

## 依赖项安装
## 依赖项安装 ##

```bash
sudo apt-get update
Expand All @@ -25,7 +25,7 @@ sudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev
sudo apt-get install -y libopencv-dev
```

## 下载 OpenCV 源码
## 下载 OpenCV 源码 ##

```bash
git clone https://github.com/opencv/opencv.git
Expand All @@ -34,7 +34,7 @@ git clone https://github.com/opencv/opencv_contrib.git
# opencv opencv_contrib 检出同一个版本
```

## 编译 OpenCV
## 编译 OpenCV ##

`cmake`配置过程中,需要下载依赖包。设置代理:

Expand All @@ -46,6 +46,6 @@ export https_proxy=http://192.168.9.165:10809
1. 编译选项`OPENCV_EXTRA_MODULES_PATH`设置extra模块路径:`~/tmp/opencv/opencv_contrib/modules`
2. `OpenCV`还依赖其他第三方库:TBB、Eigen、VTK 等。可以先安装上。

## 参考
## 参考 ##

- [cmake编译opencv指南](https://www.cnblogs.com/zjutzz/p/6714490.html)
Loading

0 comments on commit ef75468

Please sign in to comment.