多核处理器上的多线程,并发和并行

Que*_*ner 3 parallel-processing erlang multithreading multicore

我一直在阅读有关该主题的文章,但对多线程和并行性有些困惑;我读过这个问题

“在多线程系统中,如何在CORES之间分配线程?可以说我有一个创建6个线程的程序。我的系统有3个CORES。在这种情况下,线程将分配在3个CORE之间,或者所有线程都在同一线程上执行核心?” -具有3个逻辑核心的物理CPU

问题的答案表明,我必须告诉OS哪个内核执行什么操作,这是使用Java或C#等语言进行多线程处理时的普遍真理吗?

链接到问题

在未指定哪个内核的情况下,如何用Java或C#等语言编写的多线程程序可以实现并行化?

我一直在学习一些erlang,并且达到了产生这些进程的主题。erlang会告诉OS将不同的进程分配给不同的内核吗?我从“ 学习一些语言”中看到了这段代码,它产生了10个进程,每个进程都会打印出一个数字,但是为什么要使用timer:sleep呢?是不是只是在使程序看起来并行时才停止运行,而是让其他程序可以运行(例如并发)?

4> G = fun(X) -> timer:sleep(10), io:format("~p~n", [X]) end.
#Fun<erl_eval.6.13229925>
5> [spawn(fun() -> G(X) end) || X <- lists:seq(1,10)].
Run Code Online (Sandbox Code Playgroud)

我在Java中实现了这一点,并得到了类似的结果,我创建了6个线程,每个“线程”都有一个循环,在该循环中打印线程名称,然后打印一个数字,然后休眠10毫秒。

public class ThreadTest {

public static void main(String args[]) {

    Thread t1 = new Thread(new Thread2());
    Thread t2 = new Thread(new Thread3());
    Thread t3 = new Thread(new Thread4());
    Thread t4 = new Thread(new Thread5());
    Thread t5 = new Thread(new Thread6());

    t1.start();        
    t2.start();
    t3.start();
    t4.start();
    t5.start();
  }

}
Run Code Online (Sandbox Code Playgroud)

看两个程序,它们是同时执行还是并行执行?我也意识到计算机速度很快,但是即使我不让java程序进入睡眠状态,它也只会一遍又一遍地打印东西。但是,使用erlang时,如果我取消睡眠,则有时会打印出很多数字,然后打印出进程数并继续计数,或者打印出所有数字,最后列出进程。

参考上面的问题,java是在一个内核上同时执行操作(使用上下文切换)还是使用更多的内核并并行执行操作,但是速度太快,无法给我随机结果?(不睡觉)

erlang是否使用更多的内核并并行处理事务,因为有时它会在计数中间打印出进程列表?(不睡觉)

注意:我故意遗漏了其他线程的代码,只是认为最好解释一下这些类的作用。

小智 5

诸如Linux的常规操作系统(OS)管理多个进程的执行(进程实质上对应于程序)。

一个进程开始执行一个线程,但可以创建其他的线程在执行。操作系统的主要任务之一是管理所有进程线程的执行。

  • 当只有一个处理器时,OS调度程序上下文在不同线程之间切换以提供并发执行
  • 当有多个处理器时,每个处理器本质上都运行OS调度程序的一个实例,从而执行等待运行的线程。结果是并行执行要执行的线程集。

语言中的并发或线程行为取决于其实现方式。

使用Java,JVM的实现很可能会使用OS提供的线程机制,即POSIX(请参阅问题)。因此,多线程Java程序的性能将由OS决定。例如,请参阅Linux Scheduler上的详细信息

对于Erlang,情况略有不同,我认为这是造成混乱的根源。因为Erlang提倡使用大量的进程(即线程),并且这些进程与消息传递进行通信,所以线程实现必须高效。由于这些原因,POSIX线程不合适,并且Erlang虚拟机具有自己的线程机制。这种工作方式是通过以固定的相似性为每个内核分配一个OS线程,并在每个内核上运行Erlang调度程序。