纤程调度器

INDY的纤程调度器调度纤程们到一个或多个线程中去。纤程储存工作项目 到一个工作序列中然后等待。当纤程的工作项目被完成后,调度器把纤程放到一个可以被调 度的纤程列表中。
操作系统时间调度器以一种智能的方式调度线程,但是由于在系统的所有任务间每个线程都 是普通和泛型的(generic),它们对线程的信息掌握十分有限。操作系统调度器只可以基于等待状态和线程的优先级来调度他们。

context switche(线程的上下文切换) 是当一个线程被挂起,另一个被调度时。为了做这件事,操作系统必须先中 断处理器的执行路径并通过在内存中存储一些处理器寄存器(processor register)保存线程的 上下文。它之后必须通过从另一个内存地址加载处理器寄存器来恢复另一个线程,并继续线 程执行路径。

操作系统定义了一个线程每次切换可以收到处理时间的一个时间片,当时间到达了,一个线程会进入等待状态以放弃优先级。操作系统接受了对优先级的放弃并切换到另一个线程。

Indy 的 纤程以一种类似的风格工作,但是使用更多的信息以更高级的方式确定等 待状态。纤程们可以被提前确定为是等待状态,而不需要上下文切换到它们中并等待它们进 入等待状态。Indy 还分离了纤程和链引擎(chain engines)的工作,链引擎进行大部分低等级 工作。

工作的分离使得可以使用更加有效率的网络接口,比如 I/O 完成端口。I/O 完成端口更加有 效率,因为它们与硬件接口离的更近。Winsock 和其他与硬件接口层离的较远的调用必须与 内核通讯以完成对硬件接口的实际调用。与内核通讯的调用必须经历上下文以实现功能。因 此每个 Winsock 调用仅仅为了实现他的功能就常牵连许多不必要的上下文切换。
调度器可以使用单线程,多线程,需求线程(threads on demand),甚至一个线程池。

时间: 2024-11-01 15:49:18

纤程调度器的相关文章

nodejs中的fiber(纤程)库详解

fiber/纤程 在操作系统中,除了进程和线程外,还有一种较少应用的纤程(fiber,也叫协程).纤程常常拿来跟线程做对比,对于操作系统而言,它们都是较轻量级的运行态.通常认为纤程比线程更为轻量,开销更小.不同之处在于,纤程是由线程或纤程创建的,纤程调度完全由用户代码控制,对系统内核而言,是一种非抢占性的调度方式,纤程实现了合作式的多任务:而线程和进程则受内核调度,依照优先级,实现了抢占式的多任务.另外,系统内核是不知道纤程的具体运行状态,纤程的使用其实是比较与操作系统无关. 在node中,单线

Linux高性能网络:协程系列08-协程实现之调度器

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

Java 中的纤程库 – Quasar

来源:鸟窝, colobu.com/2016/07/14/Java-Fiber-Quasar/ 如有好文章投稿,请点击 → 这里了解详情 最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服务 A 是我们开发的系统,它的业务需要调用 B.C.D 等多个服务,这些服务是通过http的访问提供的. 问题是 B.C.D 这些服务都是第三方提供的,不能保证它们的响应时间,快的话十几毫秒,慢的话甚至1秒多,所以这些服务的Latency比较长.幸运地是这些服务都是集群部署的,容错率和并发支持都比较

纤程(FIBER)

Indy 10 还包含对纤程的支持.纤程是什么?简单来说,它也是 一个“线程”,但是它是由代码控制的,而不是由操作系统控制的.实际上,可以认为线程 是一个高级纤程.纤程和 Unix 用户线程(Unix user threads)很相似. 线程是操作系统用来分配时间的基本单元.一个线程包含它自己的栈(stack),特定的寄存器 (processor registers) ,以及一个线程上下文(thread context).线程们自动地被操作系统调度时间. 通常来说,纤程在一个设计良好的多线程应用

Java的纤程库 - Quasar

最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服务 A 是我们开发的系统,它的业务需要调用 B . C . D 等多个服务,这些服务是通过http的访问提供的. 问题是 B . C . D 这些服务都是第三方提供的,不能保证它们的响应时间,快的话十几毫秒,慢的话甚至1秒多,所以这些服务的Latency比较长.幸运地是这些服务都是集群部署的,容错率和并发支持都比较高,所以不担心它们的并发性能,唯一不爽的就是就是它们的Latency太高了. 系统A会从Client接收Request,

纤程与Quasar

Java使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你愿意的话可以用-Xss来调小点),更不要说线程切换带来的开销了 为了节省开销,程序员玩出了很多花样. 最常用的是线程池(线程复用,但是完全无法处理阻塞调用的问题) 以及事件驱动框架(NIO或者Netty,用少量的工作线程来服务大量的慢速IO连接,但是EventLoop中也不能有阻塞调用,耗时的逻辑必

Linux 调度器发展简述

引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的一个.作为一个通用操作系统,Linux 调度器将进程分为三类: 交互式进程 此类进程有大量的人机交互,因此进程不断地处于睡眠状态,等待用户输入.典型的应用比如编辑器 vi.此类进程对系统响应时间要求比较高,否则用户会感觉系统反应迟缓. 批处理进程 此类进程不需要人机交互,在后台运行,需要占用大量的系

RxJava(11-线程调度Scheduler)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51821940 本文出自:[openXu的博客] 目录: 使用示例 subscribeOn原理 多次subscribeOn的情况 observeOn原理 调度器的种类 各种操作符的默认调度器 源码下载 ??RxJava中 使用observeOn和subscribeOn操作符,你可以让Observable在一个特定的调度器上执行,observeOn指示一个Observable在一个特定的调度器

第12章 纤程(Fiber)

12.1 纤程对象的介绍 (1)纤程与线程的比较 比较 线程(Thread) 纤程(Fiber) 实现方式 是个内核对象 在用户模式中实现的一种轻量级的线程,是比线程更小的调度单位. 调度方式 由Microsoft定义的算法来调度,操作系统对线程了如指掌.内核对线程的调度是抢占式的. 由我们自己调用SwitchToFiber来调度,内核对纤程一无所知.线程一次只能执行一个纤程代码,纤程间的调度不是抢占式的. 备注 ①一个线程可以包含一个或多个纤程.操作系统随时可能夺走纤程所在线程的运行.当线程被