浅显的聊聊操作系统线程和线程调度

161 篇文章 12 订阅

goroutine调度器是建立在操作系统线程之上的,本文大概的介绍一下有关操作系统线程和线程调度规则的一些概念和含义。

现在抛开定义,根据如下一段C程序直观感受下什么是线程:

#include <stdio.h>#include <unistd.h>#include <pthread.h>#define N (1000 * 1000 * 1000)volatile int g = 0;void *start(void *arg){        int i;        for (i = 0; i < N; i++) {                g++;        }        return NULL;}int main(int argc, char *argv[]){        pthread_t tid;        // 使用pthread_create函数创建一个新线程执行start函数        pthread_create(&tid, NULL, start, NULL);        for (;;) {                usleep(1000 * 100 * 5);                printf("loop g: %d\n", g);                if (g == N) {                        break;                }        }        pthread_join(tid, NULL); // 等待子线程结束运行        return 0;}

C有常用的pthread线程库,其创建的用户态线程其实就是Linux操作系统内核所支持的线程,与Go工作线程是一样的,这些线程都有Linux内核负责调度和管理,Go在此之上做了一个goroutine,实现了一个二级线程。

上述程序运行之后会有两个线程,一是操作系统将程序加载起来运行时创建的主线程,另外一个是主线程调用pthread_create创建的start子线程,主线程在创建完子线程之后,每隔500毫秒打印一下全局变量g的值,直到g等于10亿,而start线程启动后就开始执行一个10亿次的对g自增加1的循环,这两个线程同时并发在系统中运行,操作系统内核负责对其进行调度和管理,编程人员无法精准预知某个线程何时运行。

关于操作系统对线程的调度,有以下两个问题:

  1. 何时发生调度?

  2. 调度时会做哪些事情?

操作系统必须在得到CPU控制权之后才能发生调度,那接下来的问题就是用户程序在CPU运行时如何让CPU去执行操作系统代码从而让内核获取控制权?

以下两种情况时,CPU会从执行用户程序跳转去执行操作系统代码:

  1. 用户程序使用系统调用进入操作系统内核。

  2. 硬件中断。硬件中断处理程序由操作系统提供,发生硬件中断会执行此代码。

硬件中断有个很重要的时钟中断,这是操作系统发起抢占调度的基础。

操作系统会在执行操作系统代码路径上某点检查是否需要调度,所以操作系统对线程的调度,也会发生在上述两种情况之中。

来看下在单核电脑上述C程序的输出:

bobo@ubuntu:~/study/c$ gcc thread.c -o thread -lpthreadbobo@ubuntu:~/study/c$ ./threadloop g: 98938361loop g: 198264794loop g: 297862478loop g: 396750048loop g: 489684941loop g: 584723988loop g: 679293257loop g: 777715939loop g: 876083765loop g: 974378774loop g: 1000000000

可以看出,主线程和start在轮流运行,这就是操作系统对它们进行调度的结果,操作系统一会儿将start调度起来运行,一会儿将主线程调度起来运行。

从程序输出结果可以看到抢占调度的身影,因为主线程在start运行过程中得到了运行,而start线程执行start函数没有发生系统调用,并且这个程序又是在单核操作系统中运行,没有其它CPU来运行主线程,所以如果没有中断时发生抢占调度,操作系统就无法获取CPU的控制权,也就不可能发生线程调度。

再来看看操作系统在发送线程调度时会发生什么事儿?

操作系统会将不同的线程调度到同一个CPU上去执行,而每个线程运行时又会使用CPU的寄存器,但每个CPU只有一组寄存器,所以操作系统将线程B调度到CPU运行时需先将正在运行线程A所使用的的寄存器的值全部存储到内存,再将线程B保存在内存中的寄存器的值放回CPU寄存器中,如此B就恢复到之前运行的状态接着执行。

线程调度时操作系统需保存和恢复的寄存器除了通用寄存器之外,还有指令指针寄存器rip以及栈相关的栈顶寄存器rsp和栈基寄存器rbp,rip决定了线程下一条需要执行的指令,两个栈寄存器决定了线程执行时需要使用到的栈内存,所以恢复CPU寄存器的值就相当于改变了CPU下一条将要执行的指令,同时也切换了函数调用栈。

从调度器的角度来看,线程至少包含以下三个部分:

  1. 一组通用寄存器的值。

  2. 将要执行的下一条指令的地址。

  3. 栈。

到此,操作系统对线程的调度可以简单理解为内核调度器对不同线程所使用的寄存器和栈的切换

来对操作系统线程下一个简单的定义:操作系统线程是由内核负责调度且拥有私有的一组寄存器的值和栈的执行流

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

  

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: rt-thread 是一款面向嵌入式系统的实时操作系统,它具有小巧、灵活、可裁剪等特点,适用于各种嵌入式开发平台和应用领域。rt-thread 的中文指导手册旨在为开发者提供详细的技术指导和使用说明,使其能够更好地理解和使用 rt-thread 操作系统。 rt-thread 中文指导手册包含了操作系统的架构、底层驱动、线程管理、内存管理、IPC机制、网络协议栈等重要内容,并提供了实际的例子和应用场景,方便开发者学习和使用。此外,rt-thread 中文指导手册还介绍了开源社区、开发工具和常用硬件平台等相关资源,帮助开发者更好地融入 rt-thread 社区,参与到操作系统的开发和改进中来。 rt-thread 中文指导手册将不断更新和完善,以适应不断变化的市场需求和技术发展。同时,rt-thread 开发团队也将持续提供技术支持和社区建设,与开发者一同推动 rt-thread 在嵌入式领域的发展。 ### 回答2: RT-Thread是一款轻量级、可裁剪的嵌入式实时操作系统,具有可移植性好、资源占用少等优点。RT-Thread操作系统中文指导手册是RT-Thread官方提供的中文文档,包含了系统架构、内核核心、应用框架、驱动开发、网络协议栈等内容。 该指导手册详细介绍了RT-Thread操作系统的设计思路和实现原理,包含了丰富的示例代码、实现细节和使用技巧,方便嵌入式系统开发人员快速上手。 在使用RT-Thread操作系统过程中,可通过该指导手册了解系统的整体结构和各个模块的功能,学习如何进行系统移植、系统配置、内核裁剪、任务调度等相关操作。同时,在应用开发中,可通过该指导手册了解RT-Thread提供的应用框架和API接口,以及常见的驱动开发方法和网络协议栈实现。 RT-Thread操作系统中文指导手册具有简单明了的语言风格和结构布局清晰的特点,易于理解和查阅。对于RT-Thread操作系统的学习和使用具有很高的参考价值,是RT-Thread软件开发者必备的技术文档之一。 ### 回答3: rt-thread是一个轻量级的嵌入式操作系统,适用于各种嵌入式设备的开发。rt-thread操作系统具有很好的可移植性和可扩展性,可以在不同的硬件平台和应用场景下进行应用开发。rt-thread 支持多任务、实时性、轻量级等特点,在工控、智能家居、智能穿戴和智能车载等领域的应用广泛。 rt-thread的中文指导手册很详细,对该操作系统的基本概念、架构、应用开发以及常用驱动等方面进行了全面的介绍。手册首先介绍了rt-thread的特点和优势,包括多任务实时、可扩展性、易移植等,然后介绍了rt-thread的架构和内核对象,包括线程、信号量、消息队列、邮箱等,分别针对这些对象的常用使用方法做了详细的说明和演示。 在应用开发方面,手册对不同的应用场景进行了介绍,例如网络应用、文件系统应用、用户界面应用等,同时也深入讲解了rt-thread的构建和配置、线程同步、中断处理等实践内容。在驱动方面,手册详细阐述了如何使用rt-thread的设备驱动模型来快速开发应用,为开发人员提供了一个较为清晰的开发框架。 总的来说,rt-thread操作系统中文指导手册非常适合初学者学习和开发人员参考,其中浅显易懂的语言和丰富的实例代码都为用户提供了一个高效的编程工具。无论是嵌入式设备的开发还是通用嵌入式应用开发,在rt-thread指导手册的帮助下都能够更方便、更快捷地完成应用开发和维护工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值