线程

    OpenHarmony内核每个进程内的线程独立运行、独立调度,当前进程内线程的调度不受其它进程内线程的影响。

    OpenHarmony内核中的线程采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。

    OpenHarmony内核的线程一共有32个优先级(0-31),最高优先级为0,最低优先级为31。

    当前进程内高优先级的线程可抢占当前进程内低优先级线程,当前进程内低优先级线程必须在当前进程内高优先级线程阻塞或结束后才能得到调度。

    线程状态说明:

    • 初始化(Init):该线程正在被创建。

    • 运行(Running):该线程正在运行。

    • 阻塞(Blocked):该线程被阻塞挂起。Blocked状态包括:pend(因为锁、事件、信号量等阻塞)、suspend(主动pend)、delay(延时阻塞)、pendtime(因为锁、事件、信号量时间等超时等待)。

    • 退出(Exit):该线程运行结束,等待父线程回收其控制块资源。

    图 1 线程状态迁移示意图

    线程状态迁移说明:

    • Init→Ready:

      线程创建拿到控制块后为Init状态,处于线程初始化阶段,当线程初始化完成将线程插入调度队列,此时线程进入就绪状态。

    • Running→Blocked:

      正在运行的线程发生阻塞(挂起、延时、读信号量等)时,该线程会从就绪列表中删除,线程状态由运行态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。

    • Blocked→Ready / Blocked→Running:

      阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态;此时如果被恢复线程的优先级高于正在运行线程的优先级,则会发生线程切换,将该线程由就绪态变成运行态。

    • Ready→Blocked:

      线程也有可能在就绪态时被阻塞(挂起),此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。

    • Running→Ready:

      有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为运行态,那么原先运行的线程由运行态变为就绪态,并加入就绪列表中。

    • Blocked→Exit:

      阻塞的线程调用删除接口,线程状态由阻塞态变为退出态。

    线程创建后,用户态可以执行线程调度、挂起、恢复、延时等操作,同时也可以设置线程优先级和调度策略,获取线程优先级和调度策略。

    OpenHarmony内核系统中的线程管理模块,线程间通信为用户提供下面几种功能:

    表 1 线程管理模块功能