多线程程序在多核和单核上运行的不同

单核CPU如何执行多线程

1.(单核CPU)同一时间,cpu只能处理1个线程,只有1个线程在执行

2.多线程同时执行:是CPU快速的在多个线程之间的切换

3.cpu调度线程的时间足够快,就造成了多线程的“同时”执行

4.如果线程数非常多,cpu会在n个线程之间切换,消耗大量的cpu资源

5.每个线程被调度的次数会降低,线程的执行效率降低

切换过程:

1.A执行到度某一时间段要切换了,可A任务没完成,系统就会把A当前执行的位置和数据以入栈的方式保存起来
2.然后B线程执行,B执行时间到了,它的位置状态等也会被系统保存到B的栈中。
3.系统自动找到A的栈,将A之前保存的数据恢复,又可以从A之前断开的状态继续执容行下去,如此循环。

单核cpu多线程有必要吗?

通常一个任务不光 cpu 上要花时间, io 上也要花时间(例如去数据库查数据,去抓网页,读写文件等)。 一个进程在等 io 的时候, cpu 是闲置的,另一个进程正好可以利用 cpu 进行计算。 多几个进程一起跑,可以把 io 和 cpu 都跑满了。

单核多线程需不需要加锁:
需要,因为当一个线程还没执行完就已经时间片,用完了,那么如果两个线程共享某些数据,会引起冲突

多线程程序在多核和单核上运行的不同:

1、锁

在单核上:多个线程执行锁或者临界区时,实际上只有一个线程在执行临界区代码,而核心也只支持一个线程执行,因此不存在冲突。如果某个线程持有锁,那只有其他线程不会被调度到CPU上执行,影响的只是持有和释放锁的时间,处理器时刻在运行着。
在多核上运行时:锁或临界区会导致其余处理器空闲而只允许一个处理器执行持有锁的那个线程,这是一个串行的过程,会影响性能。

2、负载均衡

单核上:不用考虑负载均衡,因为各个线程轮流执行,当一个线程执行完时,则会执行另外一个线程,不存在线程等待问题。即是各个线程的任务非诚不均衡,也不会影响总执行时间。
在多核上执行时:因为是并发一起执行,所以此时最终时间由运行时间最长的线程决定;

4、程序终止

多线程环境下,程序终止时需要确定各个线程都已经计算完成。

多核多线程并行需要注意的问题:

1、线程过多:如果系统上的线程数量远远超过核心的数量,那么就会导致频繁的上下文切换(因为会某些线程运行在单核上,就会时间片轮转),进而降低性能,如缓存污染。通常支持超线程的多核处理器能够使用的线程数最多是物理核心数的2倍,再增加就有可能降低程序的性能;

2、数据竞争:当多个线程读写同一共享数据时,便会产生竞争,需要同步,同步通常会导致线程之间的相互等待,潜在的降低了性能;另一方面,如果不使用同步程序可能无法并行。

3、死锁:线程发生死锁时,处理器都在操作(一直询问需要的资源是否可用),但是线程都在相互等待其他线程释放资源,处于僵持状态。

4、饿死:当一个或多个线程永远没有机会调度到处理器上执行,而陷入永远的等待的状态。

总之:单核不会有并发,因为多线程时间片轮转;而多核,会多个线程同时执行,要考虑并发带来的问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值