我从这篇非常好的文章中读到了编程的线程模型与异步模型。 http://krondo.com/blog/?p=1209
然而,文章提到了以下几点。
我记得通过在Ready-Queue和Waiting-Queue(以及其他队列之间)之间移动TCB来读取线程由操作系统管理。在这种情况下,线程不会浪费时间等待吗?
鉴于上述情况,异步程序相对于线程程序有什么优势?
答案 0 :(得分:62)
答案 1 :(得分:9)
There are two ways to create threads:
synchronous threading - the parent creates one (or more) child threads and then must wait for each child to terminate. Synchronous threading is often referred to as the fork-join model。
的CSS异步线程 - 父级和子级彼此并发/独立运行。多线程服务器通常遵循此模型。
资源 - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720
答案 2 :(得分:4)
首先,请注意,线程如何实现和调度的许多细节都是特定于操作系统的。通常,您不必担心线程彼此等待,因为操作系统和硬件将尝试安排它们高效运行,无论是在单处理器系统上异步还是在多处理器上并行运行。 / p>
一旦线程完成等待某事,比如说I / O,就可以认为它是可运行的。可运行的线程将很快安排在某个时刻执行。无论是实现为简单队列还是更复杂的实现,都是OS和硬件特定的。您可以将阻塞线程集视为一个集合,而不是严格排序的队列。
请注意,在单处理器系统上,此处定义的异步程序等同于线程程序。
答案 3 :(得分:2)
假设您有2个任务,不涉及任何IO(在多处理器计算机上)。 在这种情况下,线程优于Async。因为Async就像一个 单线程程序按顺序执行您的任务。但线程可以 同时执行这两项任务。
假设您有2个任务,涉及IO(在多处理器计算机上)。 在这种情况下,Async和Threads执行或多或少相同(性能 可能会因核心数量,日程安排,流程密集程度而异 任务等)。此外,Async占用的资源更少,开销更低 在多线程程序上编程不太复杂。
它是如何工作的? 线程1执行任务1,因为它正在等待IO,它将被移动到IO 等待队列。类似地,线程2执行任务2,因为它也涉及 IO,它被移动到IO等待队列。一旦它的IO请求得到解决 它被移动到就绪队列,因此调度程序可以调度线程 执行。
异步执行任务1而不等待它的IO来完成它 继续执行任务2,然后等待任务完成的IO。它 按IO完成顺序完成任务。
异步最适合涉及Web服务调用,数据库查询的任务 电话等, 用于流程密集型任务的线程。
以下视频介绍Async vs Threaded model
以及何时使用等,
https://www.youtube.com/watch?v=kdzL3r-yJZY
希望这有用。
答案 4 :(得分:0)
异步I / O意味着驱动程序中已经有一个执行该作业的线程,因此您正在复制功能并产生一些开销。另一方面,通常没有记录驱动程序线程的确切行为,在复杂的情况下,当您想要控制超时/取消/启动/停止行为,与其他线程同步时,实现自己的线程是有意义的。在同步条款中,有时也更容易推理。
答案 5 :(得分:0)
请参阅http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling
但是,在用户线程(而不是内核线程)或光纤中使用阻塞系统调用可能会有问题。如果用户线程或光纤执行阻塞的系统调用,则进程中的其他用户线程和光纤将无法运行,直到系统调用返回。此问题的典型示例是执行I / O时:编写大多数程序以同步执行I / O.启动I / O操作时,将进行系统调用,直到I / O操作完成后才会返回。在此期间,整个过程被内核“阻止”并且无法运行,这使得同一进程中的其他用户线程和光纤无法执行。
根据这一点,您的整个进程可能会被阻止,并且在IO中阻塞一个线程时不会安排任何线程。我认为这是特定于操作系统的,并不总是保持不变。