精华内容
下载资源
问答
  • 并发和并行

    2020-11-11 23:40:13
    文章目录目标并发和并行问题对于多核cpu,java多线程是并发还是并行?知乎上的一些回答扩展 目标 了解并发和并行的区别 参考:并发和并行 AVA中的多线程能在多CPU上并行执行吗 Java 多线程如何实现在多 CPU 上分布...

    目标

    并发和并行

    • 并发(Concurrent):在单核cpu下,依靠cpu时间片的轮转来执行每个进程(线程)
    • 并行(Parallel):在多核cpu下,每一个cpu内核执行一个进程(线程)

    问题

    对于多核cpu,java多线程是并发还是并行?

    参考:深入理解java虚拟机 第五部分,java与多线程

    主要看操作系统对于内核的线程调度,由操作系统来控制,不受jvm的控制。

    这里要区分下,一般我们运行的java程序中的线程,指的是用户线程,而操作系统操作的是内核线程,操作系统(os)对于用户线程是无法感知的,对于多核cpu,java多线程是并发还是并行,要看在不同操作系统上,采用怎样的线程模式来控制内核线程。

    在windows 和 linux 中,对于sun jdk 一般都是一条线程(ut)对应一个轻量级进程(lwp)。对于solaris平台采用多个用户线程(ut)对应多个轻量级进程(lwp)线程模式。

    轻量级进程(lwp)是内核线程的一种高级接口。

    知乎上的一些回答

    参考:Java 多线程如何实现在多 CPU 上分布?

    具体到我们平时常用的JVM实现,Oracle/Sun的HotSpot VM,它是用1:1模型来实现Java线程的,也就是说一个Java线程是直接通过一个OS线程来实现的,中间并没有额外的间接结构。而且HotSpot VM自己也不干涉线程的调度,全权交给底下的OS去处理。所以如果OS想把某个线程调度到某个CPU/核上,它就自己弄了。

    在Linux上的话,可以用taskset来把线程绑在某个指定的核上。在Java层面上,有大大写了个现成的库来利用taskset绑核:OpenHFT/Java-Thread-Affinity 有兴趣的话可以参考一下

    作者:RednaxelaFX链接:https://www.zhihu.com/question/64072646/answer/216184631来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    扩展

    在某些场景下,可以将某个线程绑定到某个内核上

    在hotspot vm 中,身已经预留了绑定处理器ID的函数接口:

    static bool bind_to_processor(uint processor_id);
    

    在Java层面上,有大大写了个现成的库来利用taskset绑核:OpenHFT/Java-Thread-Affinity 有兴趣的话可以参考一下

    其实我上家公司就有类似的需求,一点都不BT。是个分析用户流量的系统,流量通过配成混杂模式的网卡收进来,跳过内核协议栈直接上送到用户态由Java写的流量分析组件进行解析。网卡的每个queue、IRQ中断都绑定到一个核上,对应处理这个Queue的Java线程也绑在对应的CPU核上。

    听说点赞关注的人,身体健康,一夜暴富,升职加薪迎娶白富美!!!

    点我领取每日福利
    微信公众号:耿子blog
    GitHub地址:gengzi
    在这里插入图片描述

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,229
精华内容 4,491
关键字:

并发和并行