Underatedjay04
2022-07-04T08:23:57+00:00
看线程相关问题时,在csdn上面看到一个说法。
(核心切换开销。现代的体系,一般 CPU 会有多个核心,而多个核心可以同时运行多个不同的线程或者进程。当每个 CPU 核心运行一个进程的时候,由于每个进程的资源都独立,所以 CPU 核心之间切换的时候无需考虑上下文。 当每个 CPU 核心运行一个线程的时候,由于每个线程需要共享资源,所以这些资源必须从 CPU 的一个核心被复制到另外一个核心,才能继续运算,这占用了额外的开销。换句话说,在 CPU 为多核的情况下,多线程在性能上不如多进程。因而,当前面向多核的服务器端编程中,需要习惯多进程而非多线程。)
但是我看线程提出的意义就是为了更好的支持smp,而多核处理器被称为轻量级smp。为什么这个人会说线程不如进程呢?
请大佬们解惑。
编辑:今天看了点儿操作系统方面的书,有了一点点体会,我也不知道对不对,发出来请教一下大佬们。
1:在现在操作系统中,特别是多核处理器中,CPU核心的调度单位就是线程。2:多核之间确实有缓存一致问题,但这个是操作系统处理的,一般核少的都是缓存一致的。3:线程的调度是操作系统负责的。
那么明白这3点实际上就很容易推出上面这个观点并不是那么正确。例如2核心2内核线程的时候,每个核心运行一个线程(并行),此时不论是多线程还是2个进程都没有多大区别。仅上下文切换开销来说。
如果再多一个线程,2核心3线程时,其中一个核跑两个线程。在操作系统调度的时候,是有可能两个线程交替运行,那么多线程的上下文切换比单线程和上下文切换开销更小。
另外附一张Windows系统的图。[img]https://img.nga.178.com/attachments/mon_202207/07/-7Q2q-90wnZfT3cSsg-lc.jpg[/img]
唔,一点浅见,跨内核的资源调用消耗会相对大,线程之间耦合还是比进程紧密许多的,在内核数量巨大的情况下,不如多进程来的直接。
单核处理器多线程需要上下文切换,理论上来说有时候确实不如串行快,具体文章看这里 [url]https://xie.infoq.cn/article/fccf4cc4523aba603525bbb37[/url]
先等一等,我一个搞IT的,竟然不知道NGA还有程序区??
[quote][pid=623156240,32582381,1]Reply[/pid] Post by [uid=61653632]竹叶不知秋[/uid] (2022-07-06 16:47):
唔,一点浅见,跨内核的资源调用消耗会相对大,线程之间耦合还是比进程紧密许多的,在内核数量巨大的情况下,不如多进程来的直接。[/quote]还是不太懂,这里的资源具体指哪些?
多核处理器缓存之类的资源不是共享的嘛?
线程在操作系统和硬件支持下本来就可以跨核运行,在进程资源共享的情况下,线程只需要维持自己的栈就行了,这消耗应该是很少的把。
进程资源不共享,不能跨核,这才是需要资源同步的吧。[s:ac:晕][s:ac:晕][s:ac:晕]
[quote][pid=623156826,32582381,1]Reply[/pid] Post by [uid=41402527]牧岚[/uid] (2022-07-06 16:49):
单核处理器多线程需要上下文切换,理论上来说有时候确实不如串行快,具体文章看这里 [url]https://xie.infoq.cn/article/fccf4cc4523aba603525bbb37[/url][/quote]你回错问题了。不是单核是多核。
你给的这个链接里面有两段话,[img]https://img.nga.178.com/attachments/mon_202207/06/-7Q2q-b7s8K1zT3cSsg-cs.jpg[/img][img]https://img.nga.178.com/attachments/mon_202207/06/-7Q2q-i55eKxT3cSsg-cs.jpg[/img]
第一个说多CPU有通信问题,这个不是用讨论的重点。说多核共用缓存。
第二个说各个核心要共享cache(翻译过来也是缓存)
我这个问题也说的是多核心同步数据问题。
所以我真的就是这个同步数据到底有多少消耗?线程比进程差在哪里?还是说和上下文切换次数有关系。
[quote][pid=623157472,32582381,1]Reply[/pid] Post by [uid=168839]todorov604[/uid] (2022-07-06 16:52):
先等一等,我一个搞IT的,竟然不知道NGA还有程序区??[/quote]有的啊 不过不是很热闹[s:ac:哭笑]
这文章一本正经的胡说八道,进程也有主线程,在cpu看来线程和进程没区别
[quote][pid=623158189,32582381,1]Reply[/pid] Post by [uid=42389627]凡尘未泯[/uid] (2022-07-06 16:54):
还是不太懂,这里的资源具体指哪些?
多核处理器缓存之类的资源不是共享的嘛?
线程在操作系统和硬件支持下本来就可以跨核运行,在进程资源共享的情况下,线程只需要维持自......[/quote]说的是cpu的缓存同步吧,cpu每个核的L1-L3缓存是独立的,每一个指令需要处理的数据会按64字节为一个单位写入缓存,多线程处理时,如果调度到不同的核,内存内同一段需要计算的数据在新核请求时没有缓存,需要重新从内存拉,如果多核都经历了这一步,又会在某一个核改变了内存上的一个值时把所有核缓存了这个值的内容全部更新,触发cpu的缓存同步。
而进程就没有这一步动作(我没有研究过,不确定)。
这里说的资源都是写到cpu内核缓存的资源,cpu的速度比内存快很多倍所以才会有高速缓存来把指令需要的内存数据预留,一旦缓存命中,就突破了内存的速度瓶颈,一旦没命中,最坏也不过是重新从内存再读一遍
所以在这个过程里,如果缓存同步开销高,相对应的就会拖慢速度
[quote][pid=623164172,32582381,1]Reply[/pid] Post by [uid=15464270]排队很无聊[/uid] (2022-07-06 17:16):
这文章一本正经的胡说八道,进程也有主线程,在cpu看来线程和进程没区别[/quote]大佬你可以看看我另一个帖子,贴了链接的。
我还是自己捋捋,好晕啊[s:ac:晕][s:ac:晕][s:ac:晕]
我现在感觉大佬你说的是对的。
进程也是用的线程执行。
个人理解:多线程间数据耦合度较高,需要大量的数据同步操作,这些操作会导致CPU进行上下文切换,甚至跨核切换;而多进程可以从架构设计阶段避免这种情况
[quote][pid=623168070,32582381,1]Reply[/pid] Post by [uid=360956]shadow_end[/uid] (2022-07-06 17:31):
说的是cpu的缓存同步吧,cpu每个核的L1-L3缓存是独立的,每一个指令需要处理的数据会按64字节为一个单位写入缓存,多线程处理时,如果调度到不同的核,内存内同一段需要计算的数据在新核请求时没有缓存,需要重新从内存拉,如果多核都经历了这一步,又会在某一个核改变了内存上的一个值时把所有核缓存了这个值的内容全部更新,触发cpu的缓存同步。
而进程就没有这一步动作(我没有研究过,不确定)。
这里说的资源都是写到cpu内核缓存的资源,cpu的速度比内存快很多倍所以才会有高速缓存来把指令需要的内存数[/quote]emmm,我也不晓得对不对了。
个人浅薄的理解:CPU 核心调度掌控权不在你这里,所以切换时导致的缓慢问题也是要考虑的……不过还是得看你的具体情况,得看关注的时间总体是快还是慢,不要过度设计
[quote][pid=623180116,32582381,1]Reply[/pid] Post by [uid=1253424]_狼神_[/uid] (2022-07-06 18:17):
个人浅薄的理解:CPU 核心调度掌控权不在你这里,所以切换时导致的缓慢问题也是要考虑的……不过还是得看你的具体情况,得看关注的时间总体是快还是慢,不要过度设计[/quote]不是,我就想知道他说的这个核心切换开销到底啥玩意儿。[s:ac:晕][s:ac:晕][s:ac:晕]
[quote][pid=623178032,32582381,1]Reply[/pid] Post by [uid=41174529]oook?[/uid] (2022-07-06 18:08):
个人理解:多线程间数据耦合度较高,需要大量的数据同步操作,这些操作会导致CPU进行上下文切换,甚至跨核切换;而多进程可以从架构设计阶段避免这种情况[/quote]同步数据也会上下文切换吗?真的假的哦。[s:ac:惊][s:ac:惊][s:ac:惊]
[quote][pid=623180345,32582381,1]Reply[/pid] Post by [uid=17212534]BlackBlackShell[/uid] (2022-07-06 18:17):
照你这么说,发明协程的人也是傻子了?[/quote]emmm,没搞明白你说什么。
你的意思是线程和协程一样弄出来都是有用的还是说线程的上下文切换确实开销很大,在多核里比进程开销还要大。[s:ac:咦][s:ac:咦][s:ac:咦]
线程:驾驶位
进程:飞机
CPU核心:飞行员
多架飞机的情况下飞行员只用操心自己的飞机就行了
一架飞机多个驾驶位,多个飞行员之间的操作可能相互冲突
本人外行。
你多进程开销也大啊
线程可以共享资源,而进程要分配新的资源,差很多。
至于为什么切换线程开销大,因为你切换线程时,需要记住当前线程的各种状态,频繁的切换会非常消耗CPU
这也是为什么写代码的时候需要控制线程数和锁优化