作者ggg12345 (ggg)
看板Programming
标题Re: 不相干的程式做multi-thread有帮助吗?
时间Mon Nov 10 07:38:17 2008
※ 引述《CharArray (char[])》之铭言:
: ※ 引述《ggg12345 (ggg)》之铭言:
: : 如果有两个完全不相干的 thread (片段程式)要执行, 没有相互干扰的
: : overhead 的办法就是分开在两部实体完全独立无关的电脑上跑. 但称为
: : multi-thread 却是指在同一部电脑上跑. 这部电脑是多组 register set
: : 的 RISC , 还是多个 functional pipeline unit , 还是多个 program
: : counter 的多核, 甚至是共用 bus 及记忆体的多处理机系统. 在实体上
: : 就有不同程度的共用硬体资源成份. 有了共用资源, 自然就会有互斥使用
: : 的这一类型同步问题. 即使没有互斥同步也会有共用部份有限的 register
: : 与 cache 问题. 一旦是不考量同步的任意交错轮换使用, 就会有 save/
: : restore 问题, 不必要的 save/restore 也就是一种 overhead ! 打断
: : prefetch 与 pipleline buffer 也是另一种 overhead.
: 我最核心的问题是,硬把2个不相干的multi-process转成multi-thread的overhead
: 但在只有一台实体电脑的状况下,上述的情形在multi-process也都存在,
: 甚至更多,那为什麽还算overhead呢?
========
Multi-process 的 context switch 就是系统在虚拟出两个以上的 (processor
+ memory + file system)时, 必须付出的由 OS 制式切换的代价(overhead).
User Level 的 multi-thread 则是配合硬体有两套以上的 register set 与
functional pipeline unit , 但改由user program 自行由 user 针对使用状
况自行简化, 去减少 context switch overhead.
由 compiler 与 library API 支援的 multi-thread 在启动与切换 thread
时就是让不同 thread 使用不同的 register set. 在共用 process memory
space 与工作环境的假设下, user program 的 threads 间不会自寻烦恼的相互
干扰, 因此就不必类似 multi-process 般的做此制式 save/restore 动作. 而
使用不同组的 register set, 当然更是不必全做存回 memory 的 save/restore
动作, 此类 overhead 就省了.
Multi-thread program 通常写成同一份的 program 给 compiler 编译, 同
时指明要使用 thread 特性, 此时 compiler 就可细查会相互干扰的 register
有那些, 在切换时就可只针对会干扰到的 register 做最有效的暂存与还原.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.4.12
1F:推 JohnLinq:您似乎专注於user space的multi-thread 61.221.140.178 11/12 10:24
2F:→ JohnLinq:非UserSpace的多线程有什麽大差异吗? 61.221.140.178 11/12 10:24
3F:推 JohnLinq:processor + memory + file system 61.221.140.178 11/12 10:39
4F:→ JohnLinq:为何连filesystem也要啊? @.@ 61.221.140.178 11/12 10:39