【译】Golang中的调度(1):OS调度器 - OS Scheduler

为了更好理解Go调度器的内在机制,我会以三个部分的内容分别进行阐述,链接如下:

  1. Golang中的调度(1):OS调度器 - OS Scheduler
  2. Golang中的调度(2):Go调度器 - Go Scheduler
  3. Golang中的调度(3):并发- Concurrency

本部分内容主要讨论操作系统层次的调度器工作机制。

引言

Go调度器能使你的多线程Go应用程序运行得更加有效率,这归功于Go调度器与OS(操作系统)调度器能与硬件上有效地协同工作(Mechanical Sympathy)。然而,如果你的多线程Go应用程序,其设计与运行不能和调度器在硬件上有效地协同,毫无疑问,这样的多线程是程序是失败的。对OS与Go调度器工作机制有一个大致的理解,这有助于你正确地设计多线程程序。

我们将以较高视角(higher-level)来解释调度器的内在机制。我会提供一些例子使你看清调度器的工作流程,这有助你设计更好的程序。尽管当你在设计多线程程序时,你需要考虑很多方面的东西,但调度器是一个非常重要的基础知识,这是你需要掌握的。

OS调度器

操作系统的调度器是非常复杂的。它必须考虑其配套硬件的配置与性能,包括但不限于多处理器、多核、CPU高速缓存(cache memory)、NUMA(Non-Uniform Memory Access),没有这些,调度器无法尽可能的高效工作。值得高兴的是,你无需深入探讨这些主题,仍然可以就调度器的工作方式建立良好的思维模型。 

你的程序最终只是一系列的机器指令,它们会被一条接一条的有序执行。为了做到这一点,操作系统使用了线程的概念。线程的工作是按序执行分配给它的指令集,直到没有指令可供这条线程执行,这就是为何我称一个线程为:“一条执行的路径(a path of execution)”

每个单独运行的应用程序都会创建一个进程,而每个进程都会有一个初始线程,线程可以创建更多的线程。所有的线程都是相互之间独立运行的,并且线程的调度是在线程级上,而非进程级。线程能够并发运行(每个线程都在一个内核上打开),或者并行运行(每个线程同时运行在不同的内核上)。线程同时维护着它的状态(用于安全与局部性)以及它独占的执行指令集。

OS调度器必须确保当有能被执行的线程时,内核不是空闲状态。它还会创造一种假象,即所有的线程能在同一时间内被执行。在创造这种假象的过程中,调度器会运行优先级更高的线程。但是,优先级相对较低的线程也不会被减少其执行时间。同时,调度器还需要尽可能快速地作出明智的决策来最大程度地减少调度延时(latency)。

要实现这一调度算法,需要考虑的因素很多,幸运地是,随着数十年行业经验的积累,我们所用的算法已很成熟。为了更好的理解调度算法,这里需要描述一些重要的概念。

执行指令

程序计数器(Progarm counter-PC),有时又被称为指令指针(Instruction Pointer-IP),是使线程跟踪下一条要执行的指令。在大多数处理器中,程序计数器指的是下一条指令而非当前指令。

图 1 指令指针   https://www.slideshare.net/JohnCutajar/assembly-langua

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值