内核中的同步与任务调度
ucosII多核移植和扩展的原理以及注意事项

uC/OS-II是源码开放、可固化、可移植、可裁剪、可剥夺的实时多任务OS 内核,适用于任务多、对实时性要求较高的场合。
uC/OS-II适合小型系统,具有执行效率高、占用空间小、实时性优良和可扩展性等特点,最小内核可编译至2K。
uC/OS-II内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。
所谓RTOS移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
大部分的uC/OS-II代码试用C写的,但仍需要用C和ASM写一些与处理器相关的代码,这是因为uC/OS-II在读写处理器寄存器时只能通过ASM实现。
要是uC/OS-II正常运行,处理器必须满足一定的条件:处理器的C编译器能产生可重入代码;用C语言就可以打开和关闭中断;处理器支持中断,并能产生定时中断;处理器支持能够容纳一定量数据的硬件堆栈;处理器有将SP和其他CPU reg读出和存储到堆栈或内存中的指令;uC/OS-II移植工作主要包括以下三个方面的内容:(1)修改与处理器核编译器相关的代码:主要在includes.h中,修改数据类型定义说明,OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()和堆栈增长方向定义OS_STK_GROWTH。
(2)用C语言编写10个移植相关的函数:主要在OS_CPU_C.C中,包括堆栈初始化OSTaskStkInit()和各种回调函数。
(3)编写4个汇编语言函数:主要在OS_CPU_A.ASM中,包括:_OSTickISR //时钟中断处理函数_OSIntCtxSW //从ISR中调用的任务切换函数_OSCtxSW //从任务中调用的任务切换函数_OSStartHighRdy //启动最高优先级的任务uC/OS-II移植的关键问题:(1)临界区访问:uC/OS-II需要先禁止中断再访问代码临界段,并且在访问完毕后重新允许中断,这就使得uC/OS-II能够保护临界段代码免受多任务或ISR的破坏。
RTOS面试题目(3篇)

第1篇一、基础知识1. 请简述RTOS的概念和特点。
2. 什么是实时系统?它与普通操作系统的区别是什么?3. RTOS的主要功能有哪些?4. 请列举几种常见的RTOS,并简要介绍它们的特点。
5. 什么是任务?在RTOS中,任务是如何管理的?6. 什么是优先级?优先级在RTOS中有什么作用?7. 什么是调度?RTOS中的调度策略有哪些?8. 什么是中断?中断在RTOS中有什么作用?9. 什么是同步和互斥?RTOS中常用的同步机制有哪些?10. 什么是实时任务?实时任务有哪些特点?二、FreeRTOS1. 请简述FreeRTOS的基本架构。
2. FreeRTOS的任务调度策略是什么?3. 请解释FreeRTOS中的任务栈和堆栈溢出。
4. 在FreeRTOS中,如何创建、删除和切换任务?5. FreeRTOS中如何实现任务之间的同步和互斥?6. 请解释FreeRTOS中的阻塞队列和消息队列。
7. 在FreeRTOS中,如何实现任务的定时器功能?8. FreeRTOS中如何使用信号量?9. 请简述FreeRTOS的内存管理机制。
10. 在FreeRTOS中,如何实现任务的死锁检测?三、uC/OS1. 请简述uC/OS的基本架构。
2. uC/OS的内核管理模块有哪些?3. 请解释uC/OS的任务调度策略。
4. 在uC/OS中,如何创建、删除和切换任务?5. uC/OS中如何实现任务之间的同步和互斥?6. 请解释uC/OS中的任务优先级继承和优先级天花板。
7. 在uC/OS中,如何实现任务的定时器功能?8. 请简述uC/OS的内存管理机制。
9. 在uC/OS中,如何使用任务钩子函数?10. 请解释uC/OS中的中断管理机制。
四、VxWorks1. 请简述VxWorks的基本架构。
2. VxWorks的内核管理模块有哪些?3. 请解释VxWorks的任务调度策略。
4. 在VxWorks中,如何创建、删除和切换任务?5. VxWorks中如何实现任务之间的同步和互斥?6. 请解释VxWorks中的信号量、互斥锁和条件变量。
Linux课程介绍-第五章(1)

2.进程系统堆栈 每个进程都有一个系统堆栈,用来保存中断现场信息和进 程进入内核模式后执行子程序(函数)嵌套调用的返回现 场信息。 每个进程的系统堆栈和task_struct数据结构之间存在 紧密联系,因而二者物理存储空间也连在一起 系统堆栈的大小静态确定,用户堆栈可在运行时动态扩展
5.2.3 对进程的操作 1.进程的创建 各个进程构成了树形的进程族系 内核在引导并完成了基本的初始化以后,就有 了系统的第一个进程(即初始化进程,实际上 是内核线程)。除此之外,所有其他的进程和 内核线程都由这个原始进程或其子孙进程所创 建。 除初始化进程外,其他进程都是用系统调用 fork( )和clone( )创建的。 fork( )是全部复制 ,而clone( ) 有选择地 复制
●进程控制系统用于进程管理、进程同步、进程通 信、进程调度和内存管理等。 ●内存管理控制内存分配与回收。
●文件系统管理文件、分配文件空间、管理空闲空 间、控制对文件的访问并为用户检索数据。 ●Linux系统支持三种类型的硬件设备:字符设备、 块设备和网络设备。 ●核心底层的硬件控制负责处理中断以及与机器通 信。
• 内核所在的地址空间称作内核空间 • 其他应用程序称为外部管理程序,大部分是对外围设 备进行管理和界面操作,外部管理程序和用户进程所 占据的地址空间成为外部空间
Linux内核概述
Unix内核用C语言写成 单一内核:所有的操作系统功能均被封装 在内核中,与外部程序处于不同的地址空 间。外部程序智能通过功能调用来访问内 核 微内核:内核只提供最基本、最核心的一 部分操作,如创建和删除任务、中断管理、 进程管理、存储器管理、进程间通信等, 而其他功能如文件系统、网络协议栈则在 内核外操作。
3.进程的终止
由浅入深介绍

VxWorks 由浅入深介绍关键词:实时操作系统任务消息VxWorks Tornado摘要:本文档对实时操作系统作了简要介绍,并针对VxWorks系统的特点进行了具体的说明和分析,从VxWorks系统的任务管理、通信机制、系统配置、系统接口几个方面展开。
1. VxWorks操作系统概述1.1. VxWorks 操作系统简介基于微内核的,可裁减,可抢占(也可支持任务优先级反转),实时多任务操作系统.VxWorks系统最提供多处理器间和任务间高效的信号灯、消息队列、管道、网络透明的套接字。
为了获得最快速可靠的中断响应,VxWorks系统的中断服务程序ISR有自己的上下文。
VxWorks实时操作系统由400多个相对独立的、短小精炼的目标模块组成,用户可根据需要选择适当模块来裁剪和配置系统,这有效地保证了系统的安全性和可靠性。
系统的链接器可按应用的需要自动链接一些目标模块。
这样,通过目标模块之间的按需组合,可得到许多满足功能需求的应用。
VxWorks操作系统的基本构成模块包括以下部分:• 高效的实时内核WindVxWOrks实时内核(Wind)主要包括基于优先级的任务调度、任务同步和通信、中断处理、定时器和内存管理。
• 兼容实时系统标准POSIXVxWOrks提供接口来支持实时系统标准P.1003.1b.• I/O系统VxWOrks提供快速灵活的与ANSI-C相兼容的I/O系统,包括UNIX的缓冲I/O和实时系统标准POSIX的异步I/O。
VxWOrks包括以下驱动:网络--- 网络设备(以太网、共享内存)管道--- 任务间通信RAM --- 驻留内存文件SCSI --- SCSI硬盘,磁碟,磁带键盘--- PC x86键盘(BSP仅支持x86)显示器--- PC x86显示器(BSP仅支持x86)磁碟--- IDE和软盘(BSP仅支持x86)并口--- PC格式的目标硬件• 本机文件系统• I/O系统VxWorks的文件系统与MS-DOS、RT-11、RAM、SCSI等相兼容。
实时操作系统RTOS发展概述

(2)抢占式任务调度测试:通过设置不同的优先级,测试RTOS在不同优先 级任务间的切换情况。
(3)静态优先级调度测试:为不同任务分配固定的优先级,测试RTOS在处 理静态优先级任务时的性能。
2、中断处理测试
中断处理是RTOS的重要功能之一,它用于处理外部事件的紧急响应。中断处 理测试的主要目标是评估RTOS在处理外部中断时的响应速度和处理能力。在实际 测试中,可以通过以下方法进行测试:
实时操作系统RTOS发展概述
目录
01 实时操作系统(RTOS) 发展概述
02 参考内容
实时操作系统(RTOS)发展概 述
随着嵌入式系统和物联网技术的飞速发展,实时操作系统(RTOS)在诸多应 用领域变得越来越不可或缺。本次演示将简要回顾RTOS的发展背景和现状,阐述 其定义、特点和应用领域,分析当前的市场前景和主要竞争对手,介绍RTOS的技 术实现方案并列举实际应用案例,最后总结RTOS的发展历程和应用价值,提出未 来的发展趋势和应用前景。
4、可定制性:为了满足不同应用的需求,实时操作系统将提供更多的可定 制选项。用户可以根据自己的需求来选择和配置操作系统,以满足特定的性能和 功能需求。
5、安全性增强:随着系统复杂性和连通性的增加,安全性成为了一个重要 的问题。实时操作系统将越来越注重安全性增强,包括对内存保护、数据加密和 访问控制等功能的支持。
(1)绝对时间戳测试:获取系统当前时间戳,与标准时间进行对比,计算 时间误差。
(2)相对时间戳测试:在不同时间点获取系统时间戳,并计算时间差值, 评估RTOS的时间戳稳定性。
三、结论
实时操作系统实时性能测试技术是评估RTOS性能的重要手段。通过对RTOS的 任务调度、中断处理和时间戳等功能进行全面测试,可以准确评估RTOS的性能, 为相关应用提供参考。在未来的研究中,应该继续深入探讨实时性能测试技术, 提高RTOS的性能评估准确性和效率。
Linux 2.6内核的Fair-Share调度算法研究

L n x操作 系 统拥 有 自己 的“ 跳 ” 所 以 当一 个 心 iu 心 ,
[ 文章 编 号]10 —4 8 (0 8 0—0 80 0 3 64 20 )50 1—3
Ln x2 6内核 的 F i S ae调 度算 法研 究 iu . ar h r —
熊 政 ,杨 光 友
( 北 工 业 大 学机 械 工程 学 院 ,湖 北 武 汉 4 0 6 ) 湖 3 0 8
Ln x在 2 6版 本 的 内核 中采 用 了 由 Ig la iu . n oMon r
调度 器 的时 间复杂度 为 O( ) 1.
设计 并实 现 的 O( ) 度算 法_ , 1调 1 大大改 进 了调度 器 ]
的性 能. 2 4版本 的 内核相 比, . 与 . 2 6版 本 具有 系 统
的任 务来 执行 . 当活 动 队 列 中没 有 任 务 时将 活 动 队
列指 针和过 期 队列 指 针进 行 交 换. 由于 只有 1 0个 4
行, 直到有 一个 优先 级 更 高 的 任务 需 要 执 行或 者 是 它 主动放 弃 C U 资 源 , P 否则 它 将 会 一 直执 行 下 去.
级列 表 , 1 0个 为实 时 优 先级 列 表 , 4 前 0 后 O个 为 普
通优 先级 列表H ( 1 . 图 )
它 都一 直 呆 在 原 优 先 级 队 列 头 不 动. 以 当 一 个 所
FF I O型 的实 时任务 获 得 C U 资源 后 , P 它会 一 直 执
实时操作系统的关键实时性体系结构
实时操作系统的关键实时性体系结构实时操作系统(RTOS)是专为在严格的时间限制内完成特定任务而设计的操作系统。
它们在许多关键领域中发挥着重要作用,如航空航天、医疗设备、工业自动化等。
本文将探讨实时操作系统的关键实时性体系结构,包括其定义、特性、以及实现实时性的关键技术。
一、实时操作系统的定义与特性实时操作系统是一种特殊的操作系统,它能够保证在规定的时间内完成对外部事件的响应和处理。
这种系统的主要特点是具有高度的可靠性和可预测性。
以下是实时操作系统的一些基本特性:1. 确定性:RTOS必须能够在确定的时间内完成任务的调度和执行。
2. 可预测性:系统的行为和性能应该是可预测的,以便用户可以依赖其在规定时间内完成任务。
3. 优先级调度:RTOS通常采用优先级调度算法,以确保高优先级的任务能够优先执行。
4. 任务间通信:RTOS提供了多种任务间通信机制,如信号量、消息队列和共享内存等,以支持任务之间的协调和数据交换。
5. 资源管理:RTOS需要有效管理有限的资源,如CPU时间、内存和I/O设备,以避免资源竞争和死锁。
6. 容错性:RTOS应该具备一定的容错能力,能够在出现错误时快速恢复,保证系统的稳定运行。
二、实时操作系统的关键实时性体系结构实时操作系统的体系结构是实现其实时性的关键。
以下是一些核心的实时性体系结构组成部分:1. 内核设计:RTOS的内核是系统的核心,负责任务调度、资源分配和中断处理等。
内核的设计需要精简高效,以减少系统的响应时间。
2. 调度策略:调度策略是RTOS中最重要的组成部分之一。
常见的调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、轮转调度(RR)和优先级调度等。
3. 任务管理:RTOS需要能够创建、调度和管理任务。
任务可以是周期性的,也可以是偶发的,RTOS需要能够根据任务的属性和优先级进行有效管理。
4. 中断处理:中断是RTOS响应外部事件的重要机制。
RTOS需要能够快速响应中断,并在中断服务程序中执行必要的任务切换。
几种嵌入式实时操作系统的分析与比较
⼏种嵌⼊式实时操作系统的分析与⽐较VxWorks、µClinux、µC/OS-II和eCos是4种性能优良并被⼴泛应⽤的实时操作系统。
本⽂通过对这4种操作系统的主要性能进⾏分析与⽐较,归纳出它们的选型依据和适⽤领域。
1 4种操作系统的介绍(1)VxWorksVxWorks是美国WindRiver公司的产品,是⽬前嵌⼊式系统领域中应⽤很⼴泛,市场占有率⽐较⾼的嵌⼊式操作系统。
VxWorks实时操作系统由400多个相对独⽴、短⼩精悍的⽬标模块组成,⽤户可根据需要选择适当的模块来裁剪和配置系统;提供基于优先级的任务调度、任务间同步与通信、中断处理、定时器和内存管理等功能,内建符合POSIX(可移植操作系统接⼝)规范的内存管理,以及多处理器控制程序;并且具有简明易懂的⽤户接⼝,在核⼼⽅⾯甚⾄町以微缩到8 KB。
(2) µC/OS-IIµC/OS-II是在µC-OS的基础上发展起来的,是美国嵌⼊式系统专家Jean J.Labrosse⽤C语⾔编写的⼀个结构⼩巧、抢占式的多任务实时内核。
µC/OS-II 能管理64个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点。
(3)µClinuxµClinux是⼀种优秀的嵌⼊式Linux版本,其全称为micro-control Linux,从字⾯意思看是指微控制Linux。
同标准的Linux相⽐,µClinux的内核⾮常⼩,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强⼤的⽹络功能、出⾊的⽂件系统⽀持、标准丰富的API,以及TCP/IP⽹络协议等。
因为没有MMU内存管理单元,所以其多任务的实现需要⼀定技巧。
(4)eCoseCos(embedded Configurable operating system),即嵌⼊式可配置操作系统。
精准解读FreeRTOS的十三大特性
精准解读FreeRTOS的十三大特性
FreeRTOS 由Richard Barry 开发,是一个开源的、可移植的、小型的嵌入式实时操作系统内核。
FreeRTOS 既支持抢占式多任务,也支持协作式多任务。
FreeRTOS的主要特性如下:
实时性:FreeRTOS 可以配置成为一个硬(Hard)实时操作系统内核。
要注意这里用的是可以,FreeRTOS 也可以配置为非实时型内核,甚至于部分任务是实时性的,部分不是。
这一点比uC/OS-II 要灵活。
任务数量:FreeRTOS对任务数没有限制,同一优先级也可以有多个任务。
这点上比uC/OS-II 好。
抢占式或协作式调度算法:任务调度既可以为抢占式也可以为协作式。
采用协作式调度算法后,一个处于运行态任务除非主动要求任务切换(Yielding),否则是不会被调度出运行态的。
linux内核中的workqueue_和work_使用方法__示例及解释说明
linux内核中的workqueue 和work 使用方法示例及解释说明1. 引言1.1 概述Linux内核是操作系统的核心,工作队列(workqueue)和work是其重要的组成部分。
工作队列提供了一种异步机制,用于处理长时间运行的任务或者需要在后台执行的任务。
而work则是具体的任务对象,通过将任务封装为work对象,可以方便地在工作队列中进行调度和管理。
1.2 文章结构本文将详细介绍Linux内核中的工作队列(workqueue)和work的使用方法,并通过示例和解释说明来展示其具体应用。
文章分为五个部分:引言、Workqueue和Work基础知识、Workqueue使用方法、Work使用方法和示例说明以及结论与展望。
1.3 目的本文旨在帮助读者全面了解Linux内核中工作队列和work的概念以及它们的使用方法。
通过深入解析其原理和实践案例,读者可以掌握如何利用工作队列和work来进行高效地后台任务处理,并为未来的研究和应用提供思路和参考。
2. Workqueue和Work基础知识:2.1 Workqueue介绍:Workqueue是Linux内核中的一种机制,用于管理和执行工作任务。
它是一种异步处理的机制,可以在后台处理一些耗时的操作,而不会阻塞系统或其他任务的执行。
2.2 Work介绍:Work是由Workqueue管理的工作任务。
每个Work代表一个需要在后台执行的具体工作。
一个Work可以被认为是一段代码,在特定条件或事件发生时被调用执行。
2.3 Work之间的关系:Workqueue可以创建和管理多个Work任务。
当某个条件满足时,例如硬件中断发生或定时器超时,Workqueue会从任务队列中选择一个可用的Work,并将其分配给空闲的内核线程来运行,以完成相应的工作。
在这个过程中,多个Work之间不存在直接依赖关系。
每个Work都是独立地被分配、执行和管理。
它们并行运行,并且不需要等待其他Work的完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内核中的同步与任务调度 本文作者: 康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室。如果需要可以联系通过kanghua151@msn.com联系他。
摘要:同步概念在多线程和多进程编程中已经被诠释得很全面。同步方法对于用户应用程序来讲使用简单,无需过多考虑它们产生的原因(唯一的原因就是线程或进程并发)。但是内核中的同步处理就要复杂得多,开发者必须知道内核中任务得调度方式,才能有效的控制内核中的同步。所以本文就将结合内核任务调度,分析内核中的同步措施,并结合一个实例讲述内核中如何综合运用各种同步方法。
并发,竞争与同步:
并发,竞争和同步的概念,我们假定大家都有所了解,本文不再重申。我们讨论的重点放在什么情况会发生内核并发上?如何防止内核并发?有那些同步方法?以及这些方法的行为有何特点和如何使用它们? 下面一段描述了上述几个概念之间的大致关系,这种关系在内核中同样适用。 对于多线程程序的开发者来说,往往会利用多线程访问共享数据,避免繁琐的进程间通讯。但是多线程对共享数据的并发访问有可能产生竞争,使得数据处于不一致状态,所以需要一些同步方法来保护共享数据。多线程的并发执行是由于线程被抢占式的调度——一个线程在对共享数据访问期间(还未完成)被调度程序中断,将另一个线程投入运行——如果新被调度的线程也要对这个共享数据进行访问,就将产生竞争。为了避免竞争产生,需要使线程串行地访问共享数据 ,也就是说访问需要同步——在一方对数据访问结束后,另一方才能对同一数据进行访问。
内核并发原因
上述情况是用户空间并发产生的普遍原因,对于内核来说并发原因也大致类似,但是情况要更多样,也更复杂。 对于单处理机器来说情况相对简单一些。在2.6版本内核之前,Linux内核是非抢占式的——在内核任务没有执行完之前不能被打断,这样的话,内核中程序并发执行的情况很少,准确地讲只有两种可能: 一 :中断发生 ,因为中断执行是异步的,而且中断是在非抢占式内核中打断当前运行内核代码的唯一方法,所以中断显然是可以和其它内核代码并发执行的。因此如果中断操作和被中断的那内核代码都访问同样的内核数据,那么就会发生竞争。 二 :睡眠和再调度, 处于进程上下文(下面会进行讲述)的内核任务可以睡眠(睡眠意味放弃处理器),这时调度程序会调度其它程序去执行(首先执行调度任务队列中的内核任务,然后执行软中断等,最后从运行队列中选择一个高优先级的用户进程运行)。显然这里也会造成内核并发访问,当睡眠的内核任务和新投入运行的内核任务访问同一共享数据时,就发生了竞争。请看参考资料 1 2.6版本的内核变成了抢占式内核——内核可能在任何时刻抢占正在运行的内核代码。所以内核中发生并发执行的情况大大增加了。内核抢占成为了内核程序并发的又一种可能,所以在开发抢占式内核代码时需要时刻警惕抢占产生的竞争。 单处理器上的并发是逻辑上的伪并发,事实上所谓并发的内核程序其实是交错地占用处理器。真正的并发执行程序,必须依靠对称多处理器。但无论是逻辑上的并发还是真正的并发,都会产生竞争,而且它们的处理也是相同的。但是对于对称多处理器来说,由于两个或多个处理器可以在同一时刻执行代码,所以会不可避免地给内核带来并发可能,如果分别在不同处理器上执行的内核代码同时访问同一共享数据,竞争就产生了。因此,不用说对称多处理是内核并发的又一种可能。 请看参考资料2
可以看到随着Linux内核不断演化,在内核对系统支持更加全面,对任务调度更加高效的同时,也给内核带来了更多的并发可能,更容易引起竞争。上面提到的各种并发情况在内核中都必须得到有效的处理,才能确保内核有高稳定性。 无论是中断产生的并发或是睡眠引起的并发,还是内核抢占引起的并发,要想在内核开发中很好地避免,就必须从本质上了解它们的并发原因。只有在掌握内核任务的调度机制后,才可以真正的达到对并发可能的预测,进而能够采取合适的同步方法——锁——来避免并发。 下面我们就对任务调度进行讨论。对比并发产生的条件,分析内核中的调度发生的条件。
内核中的任务调度:
我们这里所说的任务调度不同于常说的进程调度。进程调度是:内核中的调度程序在进程运行队列中选择合适的(优先级高的)进程执行。而我们所说的内核任务调度指的是,内核中的任务获得执行机会。对于内核并发来说,内核任务之间的关系尤为重要。 首先我们来看看内核有那些任务,各有什么特点。
内核任务种类
硬中断操作: 硬中断是指那些由处理器以外的外设产生的中断,这些中断被处理器接收后交给内核中的中断处理程序处理。要注意的是:第一,硬中断是异步产生的,中断发生后立刻得到处理,也就是说中断操作可以抢占内核中正在运行的代码。这点非常重要。第二,中断操作是发生在中断上下文中的(所谓中断上下文指的是和任何进程无关的上下文环境)。中断上下文中,不可以使用进程相关的资源,也不能够进行调度。请看参考资料2
软中断操作: 软中断是Linux中为了执行一些硬中断操作来不及完成的任务而采取的推后执行机制。因为硬中断操作期间的中断会被抛弃,所以硬中断是在不安全时间运行的。不安全时间应该尽量短,所以采用软中断来执行大部分任务,它会把硬中断做不完的耗时任务推后到安全时间执行(软中断期间不会丢弃中断信号)。 软中断不象硬中断那样时随时都能够被执行,笼统来讲软中断会在内核处理任务处理完毕后返回用户级程序前得到处理机会。具体的讲有三个时刻它将被执行(do_softirq()):硬件中断操作完成后;内核调度程序中;系统调用返回时,(另外的内核线程ksoftirqd周期执行软中断)。需要说明的是软中断的执行也处于中断上下文中,所以中断上下文对它的限制是
和硬中断一样的。 Tasklet 和bottom half Tasklet和bottom half都是建立在软中断之上的两种延迟机制,其中具体不同在于软中断是静态分配的,而且同类软中断可以并发地在几个CPU上运行;Tasklet可以动态分配,并且不同种类的Tasklets可以并发地在几个CPU上运行,但同类的tasklets 不可以;bottom half只能静态分配,实质上下半部分是一个不能与其它下半部分并发执行的高优先级tasklet,即使它们类型不同,而且在不同CPU上运行。 系统调用 系统调用是用户程序通过门机制来进入内核执行的内核例程,它运行在内核态,处于进程上下文中(进程上下文包括进程的堆栈等等环境),所以系统的调用代码可以对进程相关数据进行访问,可以执行调度程序,也可以睡眠。
内核任务之间并发关系
上述内核任务很多情况是可以交错执行的,所以很有可能产生竞争(都要访问同一个数据结构时,就产生了竞争)。下面分析这些内核任务之间有那些可能的并发行为。 可以抽象出,程序(用户态和内核态一样)并发执行的总原因无非是正在运行中得程序被其它程序抢占,所以我们必须看看内核任务之间的抢占关系: 中断处理程序可以抢占内核中的所有程序(当没有锁保护时),包括软中断,tasklet,bottom half和系统的调用,甚至也包括中断处理程序。也就是说中断处理程序可以和这些所有的内核任务并发执行,如果被抢占的程序和中断处理程序都要访问同一个资源,就产生了竞争。 软件中断可以抢占硬中断处理程序以外的内核程序,所以内核代码(比如,系统调用)中有数据和软中断共享,就有会有竞争。此外要注意的是,软中断即使是同种类型的也可以并发的运行在不同处理器上,所以它们之间共享数据都会产生竞争。(如果在用一个处理器上软中断是不能相互抢占的)。 同类的tasklet不可能同时运行,所以对于同类tasklet不会产生并发;但两个不同种类的tasklet有可已在不同处理器上并发运行,如果之间有数据共享就会产生竞争(同类的tasklet在同一个处理器上运行的tasklet不发生相互抢占的情况)。 Bottom half 无论是否是同类的,即使在不同处理器上也都不能并发执行,它是绝对串行化的,所以它们之间永远不能产生竞争。 注意:tasklet和bottom half是建立在软中断之上的,所以它们也都遵从软中断的调度规则——都可以打断进程上下问中的内核代码(系统调用),都可被硬中断打断——这些都可能产生并发。 系统调用这种内核代码可能和各种内核代码并发,除了上面提到的中断(软,硬)抢占它产生并发外,它是有可能自发性地主动睡眠(比如在一些阻塞性的操作中),放弃处理器,重新调度其它任务,所以系统调用中并发情况更普遍,尤其当用户空间需要和内核空间共同操作全局数据时,一定要注意保护。
内核同步方法 为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。 Linux使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。 目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两重锁以及它们的变种,一个是自旋锁,另一个是信号量。我们下来就着重介绍一下这两中锁机制。 自旋锁 自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要