update: content update

This commit is contained in:
Unix_Kernel
2024-11-13 14:47:32 +08:00
parent dae10db9d4
commit aca020701b
14 changed files with 285 additions and 78 deletions

View File

@@ -502,7 +502,7 @@ dispatch_queue_t group1 = dispatch_group_create();
下断点后可以看到 `dispatch_group_create` 是位于 `libdispatch.dylib` 库中的。
<img src="./../assets/DispatchGroupTSourceLocation.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/DispatchGroupTSourceLocation.png" style="zoom:30%" />
打开 `libdispatch.dylib` 搜索 `dispatch_group_create`。可以看到源码实现。
@@ -526,7 +526,7 @@ _dispatch_group_create_with_count(uint32_t n)
`dispatch_group_create` 调用 `_dispatch_group_create_with_count`, `_dispatch_group_create_with_count` 调用 `_dispatch_object_alloc`有2个参数`DISPATCH_VTABLE(group)` 和 `sizeof(struct dispatch_group_s)`
<img src="./../assets/DispatchGroupCreateSourceCode.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/DispatchGroupCreateSourceCode.png" style="zoom:30%" />
在汇编调试模式下,对其打印输出,对于 x86 架构的汇编,第一个参数存放在 rdi第二个参数存放在 rsi 中。
@@ -538,7 +538,7 @@ _dispatch_group_create_with_count(uint32_t n)
然后顺着源码看看,左侧可以看到内部就是调用 `calloc` 分配的内存。
<img src="./../assets/DispatchGroupTAllocObject.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/DispatchGroupTAllocObject.png" style="zoom:30%" />
那 `dispatch_group_t` 是什么就很明显了。和 id 一样,是一个结构体指针。
@@ -568,7 +568,7 @@ struct dispatch_group_s {
对 `dispach_group_enter` 下断点,可以看到如下图
<img src="./../assets/DispatchGroupEnterSourceCode.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/DispatchGroupEnterSourceCode.png" style="zoom:30%" />
一进断点就查看寄存器的值,因为 dispatch_group_enter 函数就一个参数,所以直接读取寄存器 rdi 的值,可以看到就是 `dispatch_group_t` 对象。其中 count 为0.
@@ -794,7 +794,7 @@ _dispatch_group_wait_slow(dispatch_group_t dg, dispatch_time_t timeout)
线程的生命周期分为5种新建 -> 就绪 -> 运行 -> 阻塞 -> 死亡
<img src="./../assets/ThreadLifeCycle.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/ThreadLifeCycle.png" style="zoom:30%" />
- 新建:使用 `new` 实例化一个线程对象,但该线程对象还未使用 `start()` 方法启动线程这个阶段,该阶段只在内存的堆中为该对象的实例变量分配了内存空间,但线程还**无法参与抢夺CPU的使用权**
- 就绪:一个线程对象调用 `start()` 方法将线程加入到 **可调度线程池**,同时也变成就绪状态,等待 CPU 来调度执行
@@ -808,7 +808,7 @@ _dispatch_group_wait_slow(dispatch_group_t dg, dispatch_time_t timeout)
## 可调度线程池
<img src="./../assets/DispatchableThreadPool.png" style="zoom:40%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/DispatchableThreadPool.png" style="zoom:40%" />
有新任务过来,会先判断线程池是否都在执行任务: