linux内核调度.docVIP

  • 14
  • 0
  • 约4.81万字
  • 约 53页
  • 2017-03-28 发布于重庆
  • 举报
linux内核调度

本章将为大家介绍内核中存在的各种任务调度机理以及它们之间的逻辑关系(这里将覆盖进程调度、推后执行、中断等概念、),在此基础上向大家解释内核中需要同步保护的根本原因和保护方法。最后提供一个内核共享链表同步访问的例子,帮助大家理解内核编程中的同步问题。 ? ? 内核任务调度与同步关系引言 对于从事应用程序开发的朋友来说,用户空间的任务调度与同步之间的关系相对简单,无需过多考虑需要同步的原因。这一是因为在用户空间中各个进程都拥有独立的运行空间,进程内部的数据对外不可见,所以在各个进程即使并发执行也不会产生对数据访问的竞争。第二是因为用户空间与内核空间独立,所以用户进程不会与内核任务交错执行,因此用户进程不存在与内核任务并发的可能。以上两个原因使得用户同步仅仅需要在进程间通讯和多线程编程时需要考虑。 但是在内核空间中情况要复杂的多,需要考虑同步的原因大大增加了。这是因为内核空间中的共享数据对内核中的所有任务可见,所以当在内核中访问数据时,就必须考虑是否会有其他内核任务并发访问的可能、是否会产生竞争条件、是否需要对数据同步。而内核并发的“罪魁祸首”便是内核中复杂多变的任务调度——这里的任务调度包含所有可能引起内核任务更换的情况。 并发,竞争和同步的概念,我们假定大家都有所了解,本文不再重申。下面一段描述了上述几个概念之间的大致关系,这种关系在内核中同样适用。 对于多线程程序的开发者来说,往往会利用多线程访问共享数据,避免繁琐的进程间通讯。但是多线程对共享数据的并发访问有可能产生竞争,使得数据处于不一致状态,所以需要一些同步方法来保护共享数据。多线程的并发执行是由于线程被抢占式的调度——一个线程在对共享数据访问期间(还未完成)被调度程序中断,将另一个线程投入运行——如果新被调度的线程也要对这个共享数据进行访问,就将产生竞争。为了避免竞争产生,需要使线程串行地访问共享数据?,也就是说访问需要同步——在一方对数据访问结束后,另一方才能对同一数据进行访问。 内核任务 这里所定义的内核任务是指内核中执行的一切活动对象,每个内核任务都拥有一个独立的程序计数器、栈和一组寄存器。更重要的是它们都属于内核调度(这里的调度是广义上的,不要与进程调度混淆)对象,也就是说它们是可以在内核中交错执行的。 内核任务分类 内核任务包含“内核线程”、“系统调用”、“硬件中断”、“半底任务”等几类。下来我们就简要的讨论上述几类内核任务的特点。 系统调用 ????系统调用是用户程序通过门机制来进入内核执行的内核例程,它运行在内核态,处于进程上下文中(进程上下文包括进程的堆栈等等环境),可以认为是代表用户进程的内核任务,因此具有用户态任务的特性,比如可以执行进程调度程序(schedule())、可以睡眠、可以访问当前进程数据(通过current)。但它属于内核任务,所以在执行过程中不能被抢占(2.6内核前),只能自己放弃cpu(睡眠)时,系统才能可能重新调度别的任务。(有关系统调用部分请看《系统调用》一章) 硬中断任务 硬中断是指那些由处理器以外的外设产生的中断,这些中断被处理器接收后交给内核中的中断处理程序处理。要注意的是:第一,硬中断是异步产生的,中断发生后立刻得到处理,也就是说中断操作可以抢占内核中正在运行的代码。这点非常重要。第二,中断操作是发生在中断上下文中的(所谓中断上下文指的是和任何进程无关的上下文环境)。中断上下文中不可以使用进程相关的资源,也不能够进行调度或睡眠。因为调度会引起睡眠,但睡眠必须针对进程而言(睡眠其实是标记进程状态,然后把当前进程推入睡眠列队),而异步发生的中断处理程序根本不知道当前进程的任何信息,也不关心当前那个进程在运行,它完全是个过客。(有关系统调用部分请看《硬件中断》一章) 下半底任务 半底的来历完全出自上面提到的硬中断的影响。硬件中断任务(处理程序)是一个快速、异步、简单的对硬件做出迅速响应并在最短时间内完成必要操作。硬中断处理程序可以抢占内核任务并且执行时还会屏蔽同级中断或其它中断,因此中断处理必须要快、不能阻塞。这样一来对于一些处理要求过程比较复杂的任务就不合适在中断任务中一次处理。比如,网卡接收数据过程中首先网卡发送中断信号告诉CPU来取数据,然后系统从网卡中读取数据存入系统缓冲中,再下来解析数据然后送入应用层。这个过程如果都让中断处理程序处理显然过程太长,造成新来的中断丢失。因此Linux开发人员将这种任务分割为两个部分,一个叫上底,即中断处理程序,短平快地处理与硬件相关的操作(如从网卡读数据到系统缓存);而把对时间要求相对宽松的任务(如解析数据的工作)放在另一个部分执行,这个部分就是我们这里要讲的下半底。 下半底是一种退后执行任务,它将某些不那么紧迫的任务推迟到系统更方便的时刻运行。内核中实现下半底的手段经过不断演化,目前

文档评论(0)

1亿VIP精品文档

相关文档