Zephyr线程生命周期及状态

2020/08/12 11:48
阅读数 435

Zephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期。

线程状态

线程在其生命周期中有下面6种状态:

  • New 创建:线程被创建起来但还没有运行,thread_state对应_THREAD_PRESTART

  • Ready 就绪:线程处于就绪状态,等待被调度执行,thread_state对应_THREAD_QUEUED

  • Running 运行:线程占用CPU运行中,thread_state为0

  • Waiting 等待:线程等待IO或者内核事件,thread_state对应_THREAD_PENDING

  • Suspended 挂起:线程被挂起,thread_state对应_THREAD_QUEUED

  • Terminated 终止:线程终止退出生命周期,thread_state对应_THREAD_QUEUED
    在实现中线程的状态记录在struct k_thread的base.thread_state中,线程的状态定义在kernel_structs.h中

状态转换

Zephyr线程的6种状态的转换图如下

从状态转换图可以看到一共有8种动作会引起Thread的状态转换,说明如下:

  • create 创建一个线程,创建线程时会指定一个延时,线程将在延时之后执行,由下面行为引起:
    k_thread_create

  • start 开始执行一个线程,由下面行为引起:
    k_thread_start
    创建线程指定的delay时间到

  • dispatch 线程被调度执行,由下面行为引起:
    引发调度时,例如正在运行的线程时间片用完或者等待IO,或者是高优先级线程等待资源结束抢占当前线程

  • interrupt 当前线程被中断,由下面行为引起:
    引发调度时,例如当前运行的线程时间片用完,或者被高优先级线程抢占CPU

  • IO or Event wait,等待事件,由下面行为引起:
    等待mutex,sem,mailbox,msg等内核对象时

  • suppend 线程被挂起,由下面行为引起:
    k_thread_suspend,被其它thread suspend
    k_sleep,自己进入睡眠

  • resume 恢复挂起线程,由下面行为引起:
    k_thread_resume
    k_wakeup
    k_sleep的时间到了

  • abort 中止线程,由下面行为引起:
    k_thread_abort 中止掉指定线程
    线程函数返回

参考

https://docs.zephyrproject.org/latest/reference/kernel/threads/index.html


文章转载自HalfCoder点击这里阅读原文了解更多




Zephyr项目是一个由Linux基金会主持的协作项目,它是一个开放源码协作项目,将来自整个行业的领导者联合起来,构建一个最佳的小型、可伸缩、实时操作系统(RTOS),该系统针对跨多个架构的资源受限设备进行了优化。


联系关于Zephyr Project




Linux基金会是非营利性组织,是技术生态系统的重要组成部分。 

Linux基金会通过提供财务和智力资源、基础设施、服务、活动以及培训来支持创建永续开源生态系统。在共享技术的创建中,Linux基金会及其项目通过共同努力形成了非凡成功的投资。请长按以下二维码进行关注。

本文分享自微信公众号 - LFAPAC(gh_8442c14fe49e)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部