INDY的纤程调度器调度纤程们到一个或多个线程中去。纤程储存工作项目 到一个工作序列中然后等待。当纤程的工作项目被完成后,调度器把纤程放到一个可以被调 度的纤程列表中。
操作系统时间调度器以一种智能的方式调度线程,但是由于在系统的所有任务间每个线程都 是普通和泛型的(generic),它们对线程的信息掌握十分有限。操作系统调度器只可以基于等待状态和线程的优先级来调度他们。
context switche(线程的上下文切换) 是当一个线程被挂起,另一个被调度时。为了做这件事,操作系统必须先中 断处理器的执行路径并通过在内存中存储一些处理器寄存器(processor register)保存线程的 上下文。它之后必须通过从另一个内存地址加载处理器寄存器来恢复另一个线程,并继续线 程执行路径。
操作系统定义了一个线程每次切换可以收到处理时间的一个时间片,当时间到达了,一个线程会进入等待状态以放弃优先级。操作系统接受了对优先级的放弃并切换到另一个线程。
Indy 的 纤程以一种类似的风格工作,但是使用更多的信息以更高级的方式确定等 待状态。纤程们可以被提前确定为是等待状态,而不需要上下文切换到它们中并等待它们进 入等待状态。Indy 还分离了纤程和链引擎(chain engines)的工作,链引擎进行大部分低等级 工作。
工作的分离使得可以使用更加有效率的网络接口,比如 I/O 完成端口。I/O 完成端口更加有 效率,因为它们与硬件接口离的更近。Winsock 和其他与硬件接口层离的较远的调用必须与 内核通讯以完成对硬件接口的实际调用。与内核通讯的调用必须经历上下文以实现功能。因 此每个 Winsock 调用仅仅为了实现他的功能就常牵连许多不必要的上下文切换。
调度器可以使用单线程,多线程,需求线程(threads on demand),甚至一个线程池。