03 进程与线程

进程与线程概念

程序是存储在存储介质上的一些指令和数据,而进程是一个正在执行的程序的实例,是一个动态的概念,它的状态随着程序指令的执行而不断变化。进程是一个资源分配的单位,它包括了程序、数据和进程控制块(PCB process control block)。线程是CPU调度和分派的基本单位,它由线程ID,程序计数器,寄存器集合以及栈组成。一个进程可以包含多个线程,这些线程共享进程的资源。传统的重量级进程可以看做一个单个线程的进程。
在这里插入图片描述

图3-1 单线程进程与多线程进程对比

调度优先级(scheduling priority)

QNX系统的调度优先级范围是1~255,其中数字越小表示优先程度越低。在默认情况下,线程会继承父线程的优先级,非特权线程的优先级范围是1~63。非特权线程的最高优先级值可以使用procnto* -P选项来进行设置。当设置调度线程优先级超出范围时,有两种错误处理方式:显示错误或优先级饱和。作为POSIX标准的扩展,当设置优先级时,也可以把错误处理方式包装在以下宏中,以指定如何处理超出范围的优先级请求:

  • SCHED_PRIO_LIMIT_ERROR(priority):显示错误
  • SCHED_PRIO_LIMIT_SATURATE(priority):使用允许的最大优先级(达到“最大饱和点”)

除以上方式外,还可以在procnto*的-P选项后面添加一个"s"或"S",则表示在超出优先级范围请求时默认情况下会在“饱和”到允许的最大值,而不是导致错误。

在设置调度优先级最大值时,当值小于10时,取10,当值大于256时,取256。更多信息可以参考procnto指令。

进程管理器有一组随时准备运行的调度优先级为0的特殊的线程,即空闲线程(每个可用的CPU核心一个)。当空闲线程被安排在某个CPU核心上运行时,该CPU核心被认为是空闲的。在任何时刻,一个CPU核心要么空闲,要么繁忙。只有经过一段时间的平均计算,才能说CPU处于某个百分比的繁忙状态(例如,CPU使用率为75%)。

线程有一个实际优先级和一个有效优先级,并且按照它的有效优先级进行调度。线程本身可以同时改变其实际优先级和有效优先级,但有效优先级可能由于优先级继承或调度策略而改变。通常情况下,有效优先级与实际优先级相同。

中断处理程序的优先级高于任何线程,但它们的调度方式与线程不同。如果发生中断,则:

  • 无论正在运行什么线程,都会让出CPU核资源用于中断处理。
  • 内核运行BSP提供的一些特定的硬件代码来识别中断。
  • 内核调用适当的中断处理程序。
  • 内核运行BSP提供的一些特定的硬件代码来进行中断结束处理。

尽管中断不能像线程一样被调度,但是可以将他们看成是优先级最高的线程,因为他们可以抢占任何正在运行的线程。
在这里插入图片描述

图3-2 线程优先级范围

默认情况下,系统线程程调度优先级继承于其父线程。

线程状态(thread status)

在QNX系统中,线程可能存在下列状态:

  • STATE_CONDVAR:此线程在条件变量上阻塞(例如调用pthread_cond_wait())。
  • STATE_DEAD:此线程已经终止,正在等待其他线程将其加入。
  • STATE_INTR:此线程正在等待中断而阻塞(例如调用InterruptWait())。
  • STATE_JOIN:此线程正在等待加入其他线程(例如调用pthread_join())。
  • STATE_MUTEX: 此线程在互斥锁上阻塞(例如调用pthread_mutex_lock())。
  • STATE_NANOSLEEP:此线程正在短时间间隔内休眠(例如调用nanosleep())。
  • STATE_NET_REPLY:此线程正在等待通过网络发送应答(例如调用MsgReply*())。
  • STATE_NET_SEND: 此线程正在等待通过网络发送脉冲或者信号(例如调用MsgSendPulse(), MsgDeliverEvent(), or SignalKill())。
  • STATE_READY:此线程正在等待被执行,而处理器正在执行其他优先级相同或者更高的线程。
  • STATE_RECEIVE:此线程正在等待接收消息(例如调用MsgReceive())。
  • STATE_REPLY:此此线程正在等待应答(例如线程调用了MsgReply()且服务收到了消息)。
  • STATE_RUNNING:处理器正在执行此线程,内核使用一个数组来跟踪正在运行的线程。
  • STATE_SEM:此线程正在等待一个被发送的信号量(例如调用SyncSemWait())。
  • STATE_SEND:此线程正在等待发送消息(例如线程调用了MsgSend(),但是服务器还没有收到消息)。
  • STATE_SIGSUSPEND:此线程正在等待一个信号(例如线程调用sigsuspend())。
  • STATE_SIGWAITINFO:此线程正在等待一个信号(例如线程调用sigwaitinfo())。
  • STATE_STACK:此线程正在等待分配线程栈的虚拟地址空间(例如父线程调用ThreadCreate())。
  • STATE_STOPPED:此线程在等待SIGCONT信号。
  • STATE_WAITCTX:此线程正在等待一个可使用的非整数(例如浮点数)的上下文。
  • STATE_WAITPAGE:此线程正在等待分配虚拟地址空间的物理内存(例如调用mmap())。
  • STATE_WAITTHREAD:此线程正在等待一个子线程创建自己(例如调用ThreadCreate())。

线程状态转移如下图所示:
在这里插入图片描述

图3-3 线程状态跳转

从上图可以看到,当线程一拥有CPU时,他就处于RUNNING状态;当因为各种原因在等在资源准备好时,它就处于BLOCKED状态;当所需要的资源被满足而唤醒时,他就处于READY状态。只有当一个线程处于READY状态时,才有可能被调度器调度。其中除DEAD状态外的所有状态都可以直接转移到READY状态。关于线程的更多详细信息,可以参考QNX官方文档:https://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.neutrino.sys_arch/topic/kernel_Life_Cycle.html

在内核中,READY状态的线程被放在一个叫做就绪队列(ready queue)的数据结构中。我们以一个单核CPU为例来分析就绪队列的工作模型。就绪队列图:

在这里插入图片描述

图3-4 线程就绪队列

在上图中,系统中存在5个就绪线程(B-F)。线程A正在运行。所有其他线程(G-Z)都被阻塞。如果线程A、B和C具有最高的优先级,它们将根据正在运行的线程的调度策略共享处理器。

QNX系统总共支持256个调度优先级,其中有一个特别的调度优先级为0的idle线程总是准备被执行。对于不同的优先级的线程,高优先级线程总是打断抢占低优先级线程CPU。只有在优先级相同的多个处于就绪状态的线程才会使用调度策略对线程进行调度。QNX系统支持以下调度策略:

  • SCHED_FIFO:先进先出调度策(FIFO scheduling)。
  • SCHED_RR:轮询调度策略(Round-robin shceduling)。
  • SCHED_SPORADIC:间歇调度策略(Sporadic scheduling)。
  • SCHED_OTHER:其他调度策略。

调度策略(scheduling policy)

  • 先进先出调度策略(SCHED_FIFO)

在FIFO线程调度策略中,被选中执行的线程会一直执行直到:主动放弃控制权;被更高优先级线程抢占。

  • 轮询调度策略(SCHED_RR)

在RR线程调度策略中,被选中执行的线程会一直执行直到:主动放弃控制权;被更高优先级线程抢占;消耗完时间片。时间片是分配给每个线程的时间单位。一旦它消耗了它的时间片,这个线程就会被放到就绪队列的队尾,而处于相同优先级的下一个就绪线程就会得到CPU执行时间。时间片的大小为4倍ticksize。处理器速度越快,ticksize越小。如果处理器速度超过40MHz,ticksize为1ms。如果处理器速度小于40MHz,ticksize为10ms。

  • 间歇调度策略(SCHED_SPORADIC)

间歇调度策略(SCHED_SPORADIC)通常用于为给定时间段内线程的执行时间提供上限限制。当在同时处理周期性和非周期性事件的系统上执行单调速率分析(RMA)时,这种行为是必不可少的。本质上,该算法允许一个线程为非周期性事件提供服务,而不会影响系统中其他线程或进程的硬截止时间。在间歇调度策略下,线程的优先级可以在前台优先级或普通优先级与后台优先级或低优先级之间动态振荡。有关更多信息,请参见《系统架构指南》中QNX中微子微内核章节中的“零星调度”

  • 其他调度策略

当前版本(QNX7.0)的其他调度策略行为与轮询调度策略相同。这种调度策略的行为可能会在将来的版本中发生变化,所以不建议使用这种调度策略。

在多核(SMP)系统上,调度器在可用的内核之一上运行优先级最高的就绪线程。额外的内核用于运行系统中的其他线程,但不一定是下一个或多个优先级最高的线程;调度器有一定的灵活性,可以尝试优化缓存使用和最小化线程迁移。运行低优先级线程的处理器下次做出调度决策时,将选择优先级较高的线程。调度也受到处理器亲和度的影响,线程可以使用亲和度来指定它们可以在哪个处理器上运行。有关更多信息,请参阅多核处理章节。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

言北万

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

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

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

打赏作者

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

抵扣说明:

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

余额充值