feat: refine

This commit is contained in:
LiuBinPeng
2022-05-30 15:02:31 +08:00
parent 538801e651
commit 6cd0cf5144
60 changed files with 135 additions and 1487 deletions

View File

@@ -327,7 +327,7 @@ QA优先级反转是什么
线程本质上就是 CPU 高速切换,看上去是同时在做多个线程内的事情。操作系统会使用基于优先级抢占式调度算法。高优先级的线程始终在低优先级线程前执行。
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/Thread_priority.jpg)
![](./../assets/Thread_priority.jpg)
线程 A 在 T1 时刻拿到锁,并处理数据。
@@ -437,13 +437,13 @@ int cursorr = 1;
假如对存钱过程,忘记解锁怎么办?产生死锁,如下
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/Thread-deadlock-unfaillock.png)
![](./../assets/Thread-deadlock-unfaillock.png)
添加 cursor 标记死锁是发生在 `saveMoney` 方法执行的第几次。发现是第二次。因为第一次锁没有任何使用方,所以加锁成功,当第二次加锁的时候发现锁没有释放,所以产生死锁。
这时候使用尝试加锁 API `os_unfair_lock_trylock` 即可成功如下
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/Thread-deadlock-unfairTrylock.png)
![](./../assets/Thread-deadlock-unfairTrylock.png)
### pthread_mutex
@@ -632,21 +632,21 @@ sistep instruction简写为 stepisi。当你在 Xcode 汇编面板看
第一步:当第二次调用 saveMoney 方法,开启汇编调试
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/OSSpinLock-Assemble2.png)
![](./../assets/OSSpinLock-Assemble2.png)
看到可疑方法 `OSSpinLockLock`给它加断点看到第10行高亮了。lldb 模式输入 c敲回车。次数输入 si 即可进入 `OSSpinLockLock`  方法内部调试
第二步:继续输入 si敲回车
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/OSSpinLock-Assemble3.png)
![](./../assets/OSSpinLock-Assemble3.png)
第三步:看到可疑方法 `_OSSpinLockLockSlow`给它加断点lldb 输入 C。此时断点到这一行了继续输入 si。
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/OSSpinLock-Assemble4.png)
![](./../assets/OSSpinLock-Assemble4.png)
第四步:在 `OSSpinLockLockSlow` 方法内部调试,不断输入 si。
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/OSSpinLockAssemble1.png)
![](./../assets/OSSpinLockAssemble1.png)
发现不断 si 最终一直会在第6行到第19行之间执行。懂汇编的会发现这其实是一个 while 循环。便可以证明自旋锁 OSSpinLock 在等锁的时候,底层实现是执行 while 循环,忙等,太浪费性能了。
@@ -974,7 +974,7 @@ void _dispatch_semaphore_dispose(dispatch_object_t dou,
为了探究下实现,开启汇编调试
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/assets/synchronized-asemble.png)
![](./../assets/synchronized-asemble.png)
可以查看 objc4 的源码,查找 `objc_sync_enter`