线程与asynchronous

我一直在从这个非常好的文章阅读编程与asynchronous模型的线程模型。 http://krondo.com/blog/?p=1209

但是,文章提到了以下几点。

  1. 只要有I / O,asynchronous程序就会通过在任务之间进行切换而胜过同步程序。
  2. 线程由操作系统pipe理。

我记得读到线程由操作系统pipe理,在Ready-Queue和Waiting-Queue之间(在其他队列之间)移动TCB。 在这种情况下,线程不会浪费时间在等待呢?

鉴于上述,asynchronous程序相比线程程序有什么优势?

  1. 编写线程安全的代码是非常困难的。 使用asynchronous代码,您确切知道代码将从一个任务转移到另一个任务的位置,因此竞争条件更难以实现。
  2. 线程需要消耗相当数量的数据,因为每个线程都需要有自己的堆栈。 使用asynchronous代码,所有代码共享相同的堆栈,并且由于在任务之间不断地展开堆栈,堆栈保持较小。
  3. 线程是OS结构,因此为平台提供更多的内存支持。 asynchronous任务没有这样的问题。

首先,请注意,线程如何实现和调度的很多细节都是特定于操作系统的。 一般来说,不需要担心线程彼此等待,因为操作系统和硬件将尝试安排它们高效运行,不pipe是在单处理器系统上asynchronous还是在多处理器上并行运行。

一旦一个线程完成了一些事情,比如I / O,它可以被认为是可运行的。 可运行的线程将被安排在不久的某个时间点执行。 无论是实现为简单队列还是更复杂的操作,OS和硬件都是特定的。 你可以将一组被阻塞的线程想象成一个集合,而不是一个严格sorting的队列。

请注意,在单处理器系统上,这里定义的asynchronous程序相当于线程化程序。

有两种创build线程的方法:

同步线程 – 父级创build一个(或多个)子线程,然后必须等待每个子级终止。 同步线程通常被称为fork-join模型 。

asynchronous线程 – 父和子彼此并发/独立运行。 multithreading服务器通常遵循这种模式。

资源 – http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720

请参阅http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

但是,在用户线程(而不是内核线程)或光纤中使用阻塞系统调用可能会有问题。 如果用户线程或光纤执行阻塞的系统调用,则系统调用返回之前,进程中的其他用户线程和光纤将无法运行。 这个问题的一个典型例子是在执行I / O时:写入大部分程序以同步执行I / O。 当启动I / O操作时,会进行系统调用,直到I / O操作完成才会返回。 在这段时间内,整个进程被内核“阻塞”,不能运行,从而导致同一进程中的其他用户线程和光纤不能执行。

据此,你的整个过程可能被阻塞,并且当一个线程在IO中被阻塞时,没有线程被调度。 我认为这是特定于操作系统的,并不总是持有。

asynchronousI / O意味着驱动程序中已经有一个线程来完成这个工作,所以你正在复制function并招致一些开销。 另一方面,通常没有logging驱动程序线程是如何运行的,在复杂的场景中,当您想要控制超时/取消/启动/停止行为,与其他线程同步时,实现自己的线程是有意义的。 同步条件下推理也有时更容易。

  1. 假设你有2个任务,不涉及任何IO(在多处理器机器上)。 在这种情况下,线程胜过asynchronous。 因为asynchronous像一个单线程程序按顺序执行您的任务。 但是线程可以同时执行这两个任务。

  2. 假设你有两个任务,涉及IO(在多处理器机器上)。 在这种情况下,asynchronous和线程的性能差不多(性能可能因内核数量,调度,处理密集程度等而有所不同)。 另外,Async在multithreading程序上占用较less的资源,较低的开销和较less的复杂程度。

怎么运行的? 线程1执行任务1,因为它正在等待IO,它被移动到IO等待队列。 同样,线程2执行任务2,因为它也涉及IO,它被移动到IO等待队列。 只要IO请求被parsing,它就会被移动到就绪队列,以便调度程序可以调度线程执行。

asynchronous执行任务1,而不等待它的IO完成它继续任务2,然后等待两个任务的IO完成。 它以IO完成的顺序完成任务。

asynchronous最适合涉及Web服务调用,数据库查询调用等的任务,用于进程密集型任务的线程。

下面的video介绍了Async vs Threaded model以及何时使用等, https://www.youtube.com/watch?v=kdzL3r-yJZY

希望这是有帮助的。