Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493276
  • 博文数量: 106
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1083
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-22 18:20
文章分类

全部博文(106)

文章存档

2009年(1)

2008年(105)

我的朋友

分类: LINUX

2008-05-09 15:40:13

程序(包括应用程序和操作系统的程序)总是以某种特定的活动形式在处理器上的执行。在Linux系统中,应用程序总是以进程的形式在用户空间中执行的,当然应用程序的进程可以通过系统调用的方式进入内核空间,此时系统调用中的进程则是Linux内核中的一种活动形式。除此之外,Linux内核中还有如下的一些活动形式:内核线程(kernel thread),中断(硬中断),软件中断(软中断),任务蕾(tasklet)和下半区(bottom half)。
       不同的内核活动形式有其各自的特点和应用范围,尤其要考虑各活动形式在并发执行上的不同。各内核活动形式在多处理器系统中并发执行上的特点如下:对于硬中断和任务蕾,同一种活动不能并发执行,不同的活动则可以并发;对软中断,同一个和不同的活动都可以并发执行;对下半区,同一个活动和不同的活动实体都不能并发执行。
       另外各活动形式因其他内核活动形式而导致的活动中断特点如下:硬中断中只有慢速中断活动可以被其他硬中断打断,其他硬中断活动都不能被打断;软中断、任务蕾和下半区都会被硬中断打断活动,但都不能被其他活动形式打断;普通进程和系统调用都可以被其他的内核活动形式(硬中断、软中断、任务蕾和下半区)打断。
       下面将分别介绍各种活动形式。

内核线程
        Linux内核线程是通过调用内核函数kernel_thread()而产生的。Linux内核使用内核线程来将内核分成几个功能模块。Linux内核线程有如下特点:
      1. 内核线程是通过系统调用clone()来实现的,使用CLONE_VM标志(用户还可以提供其他标志,CLONE_PID,CLONE_FS,CLONE_FILES等),因此内核线程与调用的进程(current)具有相同的进程空间。
      2. 由于调用进程是在内核里调用kernel_thread(),因此当系统调用返回时,子进程也处于内核态中,而子进程随后调用fn,当fn退出时,子进程调用exit()退出,所以子进程是在内核态运行的。
      3. 由于内核线程是在内核态运行的,因此内核线程可以访问内核中数据,调用内核函数,运行过程中不能被抢占等等。

硬中断
       外设利用硬中断,向操作系统通知一些重要事件。硬件中断会打断某个处理器上的当前活动,然后再执行相关的中断处理例程。

软中断
        软中断实际上是一种不同于真正中断的,调度后才能执行的活动。软中断与硬中断的主要差别在于;硬件中断会主动打断另一种活动,而软中断要由一种内核活动调度它的执行,它必须一直等到调度程序调用自己为止。软中断处理例程被调度的时机只能出现在系统调用或硬件中断终止之后。

下半区
       为了保持中断处理尽可能短小,耗时的中断处理任务通常被划分成两部分:上半区和下半区。上半区负责在触发的中断之后单纯地运行那些最重要的任务。上半区对应着中断处理例程。下半区运行所有不太紧急的运算及因时间原因无法在中断处理例程中执行的运算。运行上半区时会调度下半区的执行,一旦因为中断的结束而再次调用调度程序,则很可能会运行下半区。下半区是并行性最低的一种活动形式,在系统的所有处理器上,每次只能并发地运行一个下半区。

任务蕾
       任务蕾是并行可执行软件中断和旧下半区的一种混合体
阅读(827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~