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。在传统的内核线程,都要指派给它自己一个函数,然后交给操作系统运行,调度激活正好相反,它是操作系 统觉得要用调度激活时,就会先创建一个调度激活,然后开始运行一个事先指定好的用户函数。(待续)
分享到:
相关推荐
### 嵌入式实时操作系统VxWorks内核调度机制分析 #### 1. 引言 嵌入式实时操作系统(RTOS)是现代工业自动化、航空航天、医疗设备等多个领域不可或缺的关键技术之一。其中,VxWorks作为一款成熟的商用RTOS,在众多...
### Linux实时调度机制研究 #### 引言 随着嵌入式系统的快速发展,Linux作为一个开源的操作系统,因其灵活性、可定制性和强大的社区支持,在嵌入式领域得到了广泛应用。Linux原本是为分时系统设计的,其核心目标...
在WFQ调度机制中,实际时间被映射到一个虚拟时间函数上,该函数反映了激活业务流的数量和出口带宽之间的关系。每个流的当前服务报文按照虚拟时间函数进行标记,以确保公平性和准确性。 #### 三、WFQ调度机制的改进 ...
本课程设计的重点是模拟操作系统的两级调度机制,这是一种常见的多任务处理策略。 首先,我们要理解什么是调度。调度是指操作系统内核中的一个过程,它负责决定哪些进程(或线程)应该在什么时候获得CPU的使用权,...
内核2.6.28调度相关的数据结构分析主要集中在Linux操作系统中进程调度的核心机制上。在Linux中,调度器负责决定哪个进程应当获得CPU执行权。本文将深入解析涉及调度的数据结构,主要包括`task_struct`结构体、调度类...
实时调度器为具有严格时间约束的进程提供服务,保证它们能在规定时间内完成,而idle调度器在系统无其他可运行进程时激活,尽可能减少CPU的空闲周期。 在分析Linux调度源码时,理解调度器的架构至关重要,包括调度类...
智能预调度的机制依赖于基站对下行数据调度的响应,如果预调度持续时长设置过短,一旦超过设定的时间限制,该功能就会停止,直到有新的下行数据调度才会重新激活。 预调度持续时长参数(ULSmartPreallocationDur)...
本文的改进方案是引入事件驱动机制,当系统中出现需要快速响应的紧急或重要事件时,通过设置触发事件来激活调度器,实现快速切换,从而提高实时性响应。对于不包含紧急或重要事件的常规时期,调度器依然采用基于时间...
1. **调度的时机**:当当前进程因I/O阻塞、时间片耗尽或其他原因被剥夺CPU时,调度器会被激活,选择下一个进程执行。 2. **调度的方式**:Linux采用了多种调度策略,如抢占式调度、轮转调度等,可以根据不同的场景...
VoIP业务的状态转换图可以帮助理解不同状态下业务的调度决策,包括从激活状态到休眠状态的变化等。 总结来说,LTE中的调度算法是一个复杂的机制,旨在通过合理的资源分配来满足不同业务的需求,同时保证整个网络的...
文中详细讲述了触发器的作用、类型、创建语法、激活和执行机制,并提供了多种实例展示实际应用场景。随后讨论了事件调度器的启用与配置、创建和管理事件的方法及其与触发器的区别与协作。接下来通过几个典型案例展示...
这些机制包括进程调度、任务队列管理、同步机制以及系统定时机制等,它们共同保证了Linux内核的高效稳定运行。对于开发者而言,理解这些机制有助于更好地利用Linux内核提供的强大功能,并根据特定需求对其进行定制和...
- 明确了自动激活系统与客户服务系统、资源管理系统、施工调度系统等之间的交互边界。 - 确保各个系统之间数据传输的顺畅,减少不必要的冗余操作。 #### 五、功能架构 **业务流程分析:** - 描述了自动激活系统的...
### 进程PCB队列的组织、管理(以及进程调度)模拟实验 #### 实验背景及意义 ...通过本实验的学习和实践,不仅能够加深对操作系统中进程管理和调度机制的理解,还能提高编程能力和问题解决能力。
操作系统中的进程控制与调度是确保系统高效运行的关键机制。在这个Lecture5中,主要讨论了以下几个核心知识点: 1. **进程控制**: - **进程控制原语**:是操作系统内核实现进程管理的基本操作,包括创建、撤销、...
在电信行业中,SPS(Semi-Persistent Scheduling)是一种重要的资源分配机制,常用于LTE(Long Term Evolution)和5G NR(New Radio)网络中。SPS主要用于提高数据传输效率,尤其是对于那些需要持续数据流的应用,如...
总的来说,UNIX内核的进程调度机制基于`counter`值和进程状态,确保了系统的公平性和响应性。通过对不同状态的管理以及对时间片的分配,内核能够有效地在多个进程间切换,保证了系统的高效运行。