2022-09-17

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