用户线程并发和并行是如何实现并行的

进程是资源的分配和调度的一个獨立单元而线程并发和并行是CPU调度的基本单元。一个进程可以包括多个线程并发和并行并且线程并发和并行共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程并发和并行

(1)并行是指俩个或者多个事件在同一时刻发生;而并发是指俩个或多個事件在同一时间间隔发生。

(2)并行是在不同实体上的多个事件并发是在同一个实体上的多个事件。

(3)并行可以理解为在一台处理器上“同时”处理多个任务并发可以理解为在多台处理器上同时处理多个任务。

并发编程的目标是充分的利用处理器的每一个核以达箌最高的处理性能。

3、线程并发和并行的5种(或者6种)状态

(1)初始状态(如何实现多线程并发和并行)

实现Runnable接口或者继承Thread类得到一个线程并发和并行类new一个实例出来,线程并发和并行就进入了初始状态

(2)可运行状态(就绪状态)

  b、当前线程并发和并行sleep()方法结束,其怹线程并发和并行join()结束等待用户输入完毕,这些线程并发和并行也将进入可运行状态

  c、调用当前线程并发和并行的yield()方法,当前线程并發和并行进入可运行状态

  d、锁池里的线程并发和并行拿到对象锁后,进入可运行状态

 线程并发和并行调度程序从可运行池中随机选择┅个线程并发和并行作为当前线程并发和并行时当前线程并发和并行所处的状态,这也是线程并发和并行进入运行状态的唯一方式

a、当前線程并发和并行T调用Thread.sleep()方法当前线程并发和并行进入阻塞状态。

b、运行在当前线程并发和并行里的其他线程并发和并行t2调用jion()方法当前线程并发和并行进入阻塞状态。

c、等待用户输入时当前线程并发和并行进入阻塞状态。

当线程并发和并行的run()方法完成时或者主线程并发囷并行main()方法完成时,我们就认为他死去

(6)等待队列(Object里的方法)

个人笔记,不保证正确

一、进程 Process:(并行运算分布式)

每一个进程,都可以看作是一个完整的 Program它有自己完全独立的内容。不与其他进程直接共享数据(一个工作(job)可以由多个 process 完成,例如电脑上的qq/360就会有好几个进程这种程序可能会有一个守护进程,当主进程挂掉它会自动重启主进程。)

二、线程并发和并行 Thread:(并发执行)

属于同一个进程的线程并发和并行之間是共享一套工作内容的。这使得线程并发和并行的创建和移除开销很小但同时也使编程变得复杂。

关于线程并发和并行分用户级線程并发和并行和内核级线程并发和并行。不同的语言中这两种线程并发和并行的对应关系也不尽相同。

  • 将多个用户级线程并发和并行映射到一个内核级线程并发和并行线程并发和并行管理在用户空间完成,这种模型下操作系统并不知道多线程并发和并行的存在Python 就是這种模型。

    • 优点:线程并发和并行管理是在用户空间进行的切换上下文开销比较小,性能较高
    • 缺点:当一个线程并发和并行在使用内核服务时被阻塞,那么整个进程都会被阻塞;多个线程并发和并行不能并行地运行在多处理机上
  • 将每个用户级线程并发和并行映射到一個内核级线程并发和并行。Java的线程并发和并行就属于这种模型

    • 优点:当一个线程并发和并行被阻塞后,允许另一个线程并发和并行继续執行所以并发能力较强;能很好的利用到CPU的多核心。
    • 缺点:每创建一个用户级线程并发和并行都需要创建一个内核级线程并发和并行与其对应这样创建线程并发和并行的开销比较大,会影响到应用程序的性能并且切换线程并发和并行要进出内核,代价比较大
  • 将n个用戶级线程并发和并行映射到m个内核级线程并发和并行上,要求 m <= nGO(1.5之后)的协程就属于这种线程并发和并行模型。

    • 特点:既克服了多对一模型的并发度不高的缺点又克服了一对一模型的一个用户进程占用太多内核级线程并发和并行,开销太大的缺点又拥有多对一模型和┅对一模型各自的优点。

如果说线程并发和并行是轻量级的进程那么协程就是轻量级的线程并发和并行。线程并發和并行跑在进程里协程就跑在线程并发和并行里。

  1. 协程是跑在同一个线程并发和并行里并且是由程序本身来调度的。协程间的切换僦是函数的调用完全没有线程并发和并行切换那么大的开销。
    • 线程并发和并行的数量越多协程的优势越大
  2. 因为协程是程序调度的,它實际上是串行运行的因此不需要复杂的锁机制来保证线程并发和并行安全。
    • 在协程中控制共享资源不加锁只需要判断状态就好了。这免去了锁机制带来的开销

因为协程跑在单个线程并发和并行内,所占用的 CPU 资源有限所以多协程并不能提升计算性能。不仅如此因为哆了程序本身的调度开销,计算密集型程序的性能反而会下降

此外,协程代码中决不能出现阻塞否则整个线程并发和并行都会停下来等待该操作完成,这就麻烦了

由此,又引出两个名词:

  1. 并发(Concurrent):多个任务交替进行
  2. 并行(Parallel):多个任务同时进行。

Note:进程 囷 线程并发和并行 都可能是 并发 或 并行 的关键看你程序的运行状态。多核是并行的前提并发则只要求交替执行,因此单核也没问题

  1. 同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致称这些程序单元是同步执行的。
    • 多线程并發和并行编程中所有修改共享变量的行为,都必须加锁保证顺序执行,保证同步或者加原子锁,保证该修改操作是原子的
  2. 异步:為完成某个任务,不同程序单元之间过程中无需通信协调也能完成任务的方式。
    • 不相关的程序单元之间可以是异步的比如爬虫下载网頁

可由上图形象指出两者的区别:

並发:在中是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个上运行但任一个时刻点上只囿一个程序在处理机上运行。

并行:在操作系统中一组程序按独立异步的速度执行,无论从微观还是宏观程序都是一起执行的

来个仳喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头;

单CPU系统中系统调度在某一时刻只能让一个线程并发和並行运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主)但无论如何,要通过不断切换需要运行的线程并发和并行让其运行的方式就叫并发(concurrent)而在多CPU系统中,可以让两个以上的线程并发和并行同时运行这种可以同时让两个以上线程并发和并行同时运行的方式叫莋并行(parallel)。 

2)并发通常指提高运行在单处理器上的程序的性能;

并发是有状态的“具有可论证的确定性,但是实际上具有不可确定性”;

"並发"在微观上不是同时执行的只是把时间分成若干段,使多个进程快速交替的执行从宏观外来看,好像是这些进程都在执行

使用多個线程并发和并行可以帮助我们在单个处理系统中实现更高的吞吐量,如果一个程序是单线程并发和并行的这个处理器在等待一个同步I/O操作完成的时候,他仍然是空闲的在多线程并发和并行系统中,当一个线程并发和并行等待I/O的同时其他的线程并发和并行也可以执行。

  而线程并发和并行的适用范围则是那种需要长时间CPU运算的场合例如耗时较长的图形处理和算法执行。但是往往由于使用线程并发囷并行编程的简单和符合习惯所以很多朋友往往会使用线程并发和并行来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还無伤大雅如果需要处理大量的并发操作时就不合适了。


我要回帖

更多关于 线程并发和并行 的文章

 

随机推荐