java多线程阻塞和cpu_对于单核 cpu 而言,开多线程的目的难倒只能是为了防止阻塞么?...

22

2015-11-12 01:14:28 +08:00   b7048e5c0150a989fed46971f5ac1886.png 1

LZ ,你没有完全理解多线程的意义。或者没有完全理解什么是多线程,包括现在很多写代码的人,总在说多线程,有时候甚至把多线程和多并发或者多线程和多吞吐处理给混为一谈。

首先说一下一个进程里面为何要开多线程问题,和 cpu 是否多核,或者主板是否多路 cpu 关系是有的,但也是有限定条件的,具体内容如下:

1 ,由于部分 api 不支持异步方式执行,仅仅支持同步执行。例如读取一个文件,当每次读取的文件的数据很大时,内存缓存中没有足够的内存提交给调用者,这时 api 或者操作系统会代用户去从磁盘上读取文件,而磁盘相对于内存和 cache 来说属于慢速设备,并且在操作系统调度层面,对于此类操作是,现成被阻塞住(即挂起),然后转为执行其他任务。

为了让整个进程不进入假死(僵死)情况,需要在开一个线程来维持其他任务的执行。

2 ,在多路 cpu 的系统中,多线程可以提高任务处理的效率。即理想情况下,每个线程独占一路 cpu 处理能。

3 ,特殊多路系统,在非对称多路系统中,每个线程(进程)都执行在不同的核上,所访问的硬件资源不同,所以需要开多个线程。

至于你说的抢 cpu 执行时间问题,要分操作系统看,目前我们常用的 windows 和 linux 都是抢占式操作系统。对于 linux 我不是很熟,对 windows 略知一二:

1 ,操作系统调度粒度是线程+进程。即操作系统调度的最小单位是线程,但是否决定该线程执行,除了看线程执行时间和未执行间隔以外,还需要看总进程内的执行情况。

其中还存在进线程优先级问题,中断优先级, cpu 执行平衡问题,就近执行原则等。

2 ,一个进程中,线程并非越开越多就好。因为非分时的非实时操作系统的任务调度周期很有可能是不准的,操作系统是否要打断一个线程的执行,转而交给另外一个线程执行,除了调度周期到来的调度扫描,还有任务执行的优先级, IRQL 级别,线程处于什么状态等。

3 ,过多的线程不仅不能抢到有效的 cpu 执行时间,还会导致线程环境切换的浪费。因为每次线程的切换其中伴随的态转换,以及堆栈移动、寄存器恢复、内存调度等问题。频繁切换线程,只会得不偿失,不管是 python 或者 java 或者 c++或者 c#都是一样的,因为是操作系统在管理线程执行。

至于你提出的第四个疑问,在单核 cpu 里面开多线程的事情。我只能和你说,设计决定一切。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值