调度激活机制

Avoiding Blocking System Calls in a User-Level Threads Scheduler for Shared Memory Multiprocessors

这是我很早就下载的一个pdf 文档,具体哪里下的忘了,特向作者致谢,这文档真的不错!题目我保留了,需要全文的朋友可以自己google ,这篇文章我只翻译部分,略了很多,主要加上自己的想法。强烈建议阅读原文!
作者信息:
Andrew Borg
andborg@orbit.net.mt
University of Malta
June 26, 2001
                               
摘要

smp 近来大规模应用于并行计算,多线程被证明非常适合smp 。程序员利用线程库编写多线程程序。线程库要么自己调度线程要么把调度任务交给操作系统内 核。但是这两种方法都会引起一些问题。本文描述了两个用户级别的调度器,一个适于单cpu ,一个适于smp 。这些机制会使在执行阻塞系统调用时不会在内核 阻塞。为了实现这个目的,我们利用系统扩展里面一个叫做 调度激活 的机制。避免阻塞在那些需要同时处理很多客户端的服务器程序里非常有用。一个提供静态 页面的web 服务器也将从中受益。
1.
引言
     
老版本的unix 及类unix 系统对多线程并发编程支持的很不让人满意。这些使得设计并行应用非常困难。多线程在很多并行编程中是同时协同过程的容器。
     
传统意义的线程被分为内核线程和用户线程。用户线程的主要优势就是高效,它的调度核心在用户空间实现。内核线程就不那么高效了,它需要内核来提供调度机 制。这篇论文里面,我们提供一个调度激活机制来对用户线程提供内核级别的支持。通过这种犯法,用户线程保持着它的高效,并且调度核心仍然在用户空间。
2.
背景
2.1.
从进程到内核线程
  
线程的概念在1965 年就有了。在那时它们不叫线程,而叫进程。
   unix
下进程的概念就是一个执行绪(线程)加上一个地址空间。因此,unix 下的进程是重量的。
     
重量级的进程只是实现了粗粒度的并行,这就导致了线程的产生,线程仅仅是一个和别的线程共享地址空间的传统unix 进程,它们也被叫做轻量级进程。轻量级 进程往往被认为是内核线程,因为内核负责它们的创建,销毁,同步,调度。内核既然已经可以看到轻量级进程,那么所有可以用于进程的概念就可以用于轻量级进 程即内核线程了。
2.2.
从内核线程到用户线程
     
内核线程主要不好的地方在于它受制于内核提供的机制。主要就是说用户程序无法享用自己的调度策略,内核怎么调度全看内核怎么实现。内核线程虽然和进程相比轻量了很多,但和用户线程比较起来还是过于重量了。
  ...
     
当应用程序实现用户线程时那么线程被用户程序自己管理。这样就可以选择不同调度策略来应用于不同需求的应用程序。用户线程非常高效,上下文切换高效得多,内核完全不必介入。内核线程虽然比进程好了很多,但还是比不过用户线程。
2.3.
用户线程的问题
     
由于用户线程不被大多数操作系统内核有效支持,那么把已经在内核线程集成的服务集成到用户线程就很困难。由于内核根本看不到用户线程,那么就引起两个很棘手的问题:
      a.
调度问题
      b.
阻塞问题
     
对于a ,内核很有可能调度一个低优先级的县城而放弃高优先级的,另外,如果一个用户线程持有锁,抢占它并不是一个好主意。对于b ,当一个用户线程引起阻塞系统调用时,内核不会通知用户线程。
2.4.
阻塞系统调用
     
本部分主要说如果一个用户线程阻塞在内核了,那么用户的不到任何通知,这样整个进程就全部阻塞了。
3.
调度激活
 
这部分描述当阻塞调用时,调度激活是怎么应对的。
3.1.
调度激活背后的思想
     
调度激活使得当内核觉得要调度用户线程时会通知用户线程。在内核里面相关的内核事件会导致用户线程调度器重新决定调度事宜,决定哪个线程应该运行在哪个虚 拟cpu 上。这个机制通过引进一个新的名叫upcall 的系统调用来实现。upcall 是一个内核到应用的调用,和传统的应用调用内核服务的 downcall 相反。内核就是利用调度激活来实现upcall 的,一个调度激活是一个和传统内核线程一样的执行环境上下文。事实上,调度激活在好多系统 的实现正是利用了内核线程,只是加上了upcall 。在传统的内核线程,都要指派给它自己一个函数,然后交给操作系统运行,调度激活正好相反,它是操作系 统觉得要用调度激活时,就会先创建一个调度激活,然后开始运行一个事先指定好的用户函数。(待续)

 

### AUTOSAR 调度机制详解 AUTOSAR(AUTomotive Open System ARchitecture)是一种广泛应用于汽车电子系统的软件架构标准,其操作系统(AUTOSAR OS)支持多种调度机制,以满足汽车控制系统对实时性、确定性和可靠性的严格要求。在 AUTOSAR OS 中,主要的调度机制包括**调度表(Schedule Table)**和**Alarm 定时器机制**,它们分别适用于不同的任务调度场景。 #### 调度机制(Schedule Table) 调度表是一种**静态定义的调度机制**,通过一系列按时间顺序排列的**到期点(Expiry Points)**来控制任务的激活和事件的触发。每个到期点定义了在特定时间点需要执行的动作,例如激活一个或多个任务,或者设置某些事件[^3]。调度表的结构保证了任务执行顺序的**可预测性**和**同步性**。 调度表中的到期点按时间偏移量(Offset)从小到大排序,确保执行顺序的确定性。每个到期点的时间偏移是相对于调度表的起始点而言的,并且必须唯一,以避免冲突[^3]。这种机制特别适用于**周期性任务**或**顺序调度任务**,例如发动机控制、刹车控制等对时序有严格要求的应用。 调度表的一个显著优势是其**同步能力**,它能够确保多个任务在指定时间点上按预定顺序执行,从而避免任务之间的时序冲突。在 OSEK OS 中,也可以通过计数器和报警器实现类似机制,但调度表提供了更高级的同步支持[^1]。 #### Alarm 定时器机制 Alarm 机制是一种**动态调度机制**,允许在运行时动态设置和修改任务的触发时间和周期[^2]。Alarm 通常与系统计数器(Counter)绑定,当计数器达到设定值时,触发相应的动作,如激活任务或发送事件。 与调度表相比,Alarm 提供了更高的灵活性,适用于**事件驱动任务**或需要根据系统状态动态调整的任务。例如,某些传感器数据的采集频率可能需要根据车辆速度动态调整,此时 Alarm 机制就显得尤为重要。 Alarm 机制也存在一定的调度不确定性。当多个 Alarm 触发的任务同时就绪时,调度器将根据任务优先级决定执行顺序。高优先级任务会抢占低优先级任务,这可能导致低优先级任务的执行延迟,甚至出现周期性任务的“周期晃动”现象[^2]。 #### 调度表与 Alarm 的协同调度 在实际应用中,调度表和 Alarm 机制通常会**共存**,各自负责不同类型的任务调度调度表适用于**周期性、固定时序的任务**,而 Alarm 更适合**动态调整的任务**。当两者同时触发任务时,操作系统的调度策略和任务优先级决定了执行顺序。 如果调度表任务与 Alarm 任务的周期一致,并且调度表任务在执行后被更高优先级任务抢占,调度表任务将在下一个周期重新执行(前提是达到新的到期点),而 Alarm 任务则会在高优先级任务执行完毕后立即执行[^4]。 这种差异意味着在任务调度设计中,需要合理安排任务优先级和触发周期,以避免任务调度的不确定性。如果发现任务周期晃动较大,建议优先考虑使用调度机制,以提高系统调度的确定性和同步性[^4]。 #### 示例代码 以下是一个基于 AUTOSAR OS 的调度表配置示例: ```c // 定义调度表 ScheduleTableType MyScheduleTable = { .Offset = 0, .Length = 5, .Repeating = TRUE, .ExpiryPoints = { { .Offset = 100, .Actions = ACTIVATE_TASK(TaskA) }, { .Offset = 200, .Actions = SET_EVENT(TaskB, Event1) }, { .Offset = 300, .Actions = ACTIVATE_TASK(TaskC) }, { .Offset = 400, .Actions = SET_EVENT(TaskD, Event2) }, { .Offset = 500, .Actions = ACTIVATE_TASK(TaskE) } } }; // 启动调度表 void StartMyScheduleTable(void) { StartScheduleTableRel(MyScheduleTable, 0); // 从当前时间开始执行 } ``` 此示例中,调度表 `MyScheduleTable` 包含五个到期点,每个到期点在指定偏移时间触发相应的任务激活或事件设置操作。调度表在启动后将按照定义的时序周期性执行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值