(草稿)perfbook 02 自问自答
perfbook 指的是 Is Parallel Programming Hard, And, If So, What Can You Do About It? pdf 版本可以从如下网址获取: https://www.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html
5.3.3 的内容如何理解
可以结合如下问题来理解
Quick Quiz 5.33: p.129
Given that globalreserve counted against us in add_count()
, why doesn’t it count for us in sub_count()
in Listing 5.7?
答: awakening-fong: add_count()返回0是失败, 认为是 against. 而不是说 访问锁是 against.
add_count 的局部代码:
9 if (globalcountmax -
10 globalcount - globalreserve < delta) {
11 spin_unlock(&gblcnt_mutex);
12 return 0;
13 }
globalreserve 很大, 传递给单个线程的 delta 如果很大, 那么, 即使其他线程 消耗的内存 很小, 这里的 if 还是会判定为内存耗尽.
5.4章节中, flush_local_count()
对globalreserve非0进行了处理.
5.4.3 Signal-Theft Limit Counter Design
关于图 Signal-Theft State Machine
图中的"请求", 谁向谁请求? 答: 配额用光了,请求新的配额。线程 向 全局 请求。
图中的ready是?, ready to do what? 答: ready to 窃
慢速路径使用“请求”和“确认”状态来确定信号是否应当被重发。
flush_local_count()
{
if (READ_ONCE(*theftp[t]) == THEFT_REQ)
pthread_kill(tid, SIGUSR1);
}
"确认"什么? 答: 请求已收到,请求已处理
一旦慢速路径发现某个线程的theft状态为“准备完毕”,这时慢速路径有权窃取此线程的计数。 awakening-fong注释: 窃取意思是 不是修改自己的count,而是 修改其他线程,拿别人的东西,为窃。 减少了per-thread 的count,这个之后自然就是发布publish 到全局。
Chapter 6 Partitioning and Synchronization Design
"每个哲学家都先拿他盘子周围编号最小的叉子,然后再拿编号最高的叉子。"
awakening-fong注释: 原文是 Each philosopher picks up the lowest-numbered fork next to his or her plate, then picks up the other fork. 这里中文翻译应该有问题。 第2回是拿 编号最大的吗?好像不是,拿的应该是 盘子两边的另一个叉子,这个叉子比首次的叉子编号要大,但不是全局最大的编号。
Chapter 7 Locking
Strict RAII locking also prohibits overlapping critical sections, due to the fact that scopes must nest.
awakening-fong:比如不允许如下的重叠
|-------| lock1
|--------| lock2
本文地址: https://awakening-fong.github.io/posts/perf/perfbook-02
转载请注明出处: https://awakening-fong.github.io
若无法评论, 请打开JavaScript, 并通过proxy.
blog comments powered by Disqus