Linux 2.6内核新变化[2]

[入库:2005年9月19日] [更新:2007年3月25日]

本文简介:

  以下的代码片断显示了每个 CPU 的数据结构问题(在SMP系统中):


  清单 1. 存在内核抢占问题的代码


     int arr[NR_CPUS];


     arr[smp_processor_id()] = i;

     /* kernel preemption could happen here */

     j = arr[smp_processor_id()] /* i and j are not equal as

smp_processor_id() may not be the same */


  在这种情形下,如果在特定点发生了内核抢占,任务将会由于重新调度而被分配到其他处理器

     ——smp_processor_id() 将返回一个不同的值。


  这种情形应该通过锁定来进行保护。


  FPU 模式是另外一种CPU应该被保护起来不被抢占的情形。当内核在执行浮点指令时,FPU 状态不

     被保存。如果这时发生了抢占,由于重新调度,FPU 状态就会与抢占前完全不同。所以 FPU 代码必

     须始终被锁定,以防止内核抢占。


  锁定可以这样来实现,在关键部分禁止抢占,在之后再激活抢占。以下是在2.6内核中禁止和激活抢占的定义:


  preempt_enable() -- 抢占计数器减1

  preempt_disable() -- 抢占计数器加1

  get_cpu() -- 先后调用 preempt_disable() 和 smp_processor_id()

  put_cpu() -- 重新激活preemption()

  使用这些定义,清单 1可以重写成这样:


  清单 2. 使用防抢占锁的代码


    int cpu, arr[NR_CPUS];


     arr[get_cpu()] = i; /* disable preemption */

     j = arr[smp_processor_id()];

     /* do some critical stuff here */

     put_cpu()  /* re-enable preemption */


  注意 preempt_disable()/enable()调用是可以嵌套的。也就是说,preempt_disable() 可以被

     调用 n 次,只有当第 n 次preempt_enable() 被调用后,抢占才被重新激活。


  当使用自旋锁时,抢占是被隐式地禁止的。例如,一个 spin_lock_irqsave() 调用会隐式地通过

     调用 preempt_disable() 来防止抢占;spin_unlock_irqrestroe() 通过调用 preempt_enable()

     来重新激活抢占。



 改进的线程模型以及对 NPTL 的支持


  在2.5内核中已经做了很多的改进线程性能的工作。在2.6中改进的线程模型仍然是由 Ingo Molnar 来完成的。

它基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核内在的对新的 NPTL(Native Posix

Threading Library)的支持,这个新的 NPTL 是由 Molnar 和 Ulrich Drepper 合作开发的。


  2.6内核中其他引人注目的变化 


  文件系统


  对 ext2/ext3 文件系统做了改进,包括对扩展属性和POSIX访问控制列表的支持。NTFS的驱动程序也已经重写,

可以支持(reentrant safe)SMP,大于4KB的簇,等等。同时2.6也支持 IBM 的 JFS(journaling file system)

和 SGI 的 XFS。


  音频


  对桌面用户而言,一个更令人期待的特性是称为 ALSA(Advanced Linux Sound Architecture) 的新的 Linux

音频体系结构,它取代了缺陷很多的旧的 OSS (Open Sound System)。新的声音体系结构支持USB音频和MIDI

设备,全双工重放,等等。在桌面上播放 MP3 和其他音频文件再也不会像以前那样了!


  总线


  SCSI/IDE子系统经过大幅度的重写,一些驱动程序仍然处于测试阶段或者收尾阶段。


  电源管理


  支持 ACPI(高级电源配置管理界面,Advanced Configuration and Power Interface),用于调整 CPU

(可以在不同的负载下使CPU工作于不同的时钟频率以节电)和软件挂起(这一特性仍在测试中)。

  联网和IPSec


  内核中加入了对 IPSec (IP安全)的支持,因此也支持 IP 有效负载压缩等各种 RFC。删除了原来内核内置的HTTP服

务器 kttpd。IPSec 特性使用了内核提供的新的加密 API。这个加密API中包含了各种流行的算法,比如 MD4,MD5

DES,等等。加入了对新的 NFSv4 (网络文件系统)客户机/服务器的支持。


  用户界面层


  2.6内核重写了帧缓冲/控制台层。这将意味着需要更新各种用户空间帧缓冲工具,如 fbset 和 fbdesl。人机界面层还

加入了对近乎所有可接入设备的支持,从触摸屏到盲人用的设备,到各种各样的鼠标。

  线程操作可以提高速度;2.6内核现在可以处理任意数目的线程,PID最大可以到20亿(IA32上)。


本文关键:Linux 2.6内核新变化
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top