当前位置导航:炫浪网>>网络学院>>操作系统>>Linux教程

剖析Linux 2.6内核移植--超线程篇

    应用2.6内核超线程模式

    对于大多数应用软件开发者来说,Linux 2.4和2.6内核家族间的大部分差异对它们没有直接的影响。大多数内核变化只是为了提高系统性能而已。但也有例外,对某些应用软件而言,内核和系统的变化对它们的推广和它们对其它进程和线程的管理都具有一定的影响。

    2.6内核为用户带来了一种新的、改进的超线程模式。这种模式是通过NPTL(Native POSIX Thread Library)实施的。新的超线程模式的采用对于开发人员、系统运行时间库(如GNU C库)、共享应用软件库等有着非凡的意义。本文将介绍基本的超线程概念,讨论已有的Linux超线程模式,并着重指出在2.6内核下如何修改已有多线程应用软件。

    超线程技术

    在Linux之类的多进程操作系统中,一个进程生成另一个进程是最基本的概念。最典型的例子是外壳程序,如Bash外壳程序。它是一个标准的Linux命令翻译程序。外壳程序根据用户的命令执行相应的应用程序,可以直接启动多个命令并等待它们完成,也可以将多个命令分开同时执行。

    一个进程通常可以通过一组fork()和exec()函数调用来生成新的进程。初始进程调用fork()函数,产生一个子进程。子进程继承了母进程的整个执行环境。fork()函数调用将子进程的进程标识(PID)反馈给母进程,同时还包括子进程中的PID.然后,子进程使用exec()函数调用来执行其它的命令,改变继承来的执行环境。同时,母进程或者迅速退出,或者等待子进程回到其初始状态。

    Linux超线程模式

    Linux 2.6内核以前所有版本的标准Linux超线程库被称为LinuxThreads.这种库可以与不低于GLIBC 2.0版本GNU C库一起工作,并且与POSIX兼容。

    在LinuxThreads和Native POSIX Thread Library(NPTL)源代码的编译过程中,产生的主要库是libpthread.so和libpthread.a.为此,LinuxThreads和pthreads名称过去可以互换使用。但是引入NPTL后,两者极易发生混淆。本文使用LinuxThreads和NPTL以便明确区分两个超线程库和它们的功能。

    LinuxThreads拥有不同的性能、可伸缩性和可用性限制。LinuxThreads针对单一进程可产生的线程数通过一个编译器设置。此外,它还使用一个进程管理器协调每个进程产生的所有线程间的关系。这样会大大增加线程建立和消除占用的资源。尽管基本上每个线程都有独立的进程ID,但信号的处理仍是在各个进程中完成的。由于种种原因,在LinuxThreads实施过程中,同时产生并工作的线程数量常常会受到限制。这些原因包括内核与用户空间线程间的不对称关系,缺少线程间通信和分享资源所需的线程同步原语等。

    Linux的另一超线程模式是IBM公司的下一代POSIX线程(NGPT)项目。它是一个与LinuxThreads套件一起工作的外部超线程库。但是它可以提供额外的POSIX支持和优于标准LinuxThreads套件的性能。NGPT套件可用于Linux2.4和更早的内核,由于新超线程模式的产生,其应用范围越来越小。

    NPTL自从出现2.5内核后便开始逐渐代替LinuxThreads和NGPT.NPTL为Linux系统提供更高性能的超线程支持,并且可提供多线程企业应用软件所需的基本功能,此外还可提供高容量、高加载量的网络和邮件服务器等。NPTL的开发是2.5内核开发进程的一部分,并且与Linux运行时元件(如GLIBC)集成在一起,具备了众多优势的NPTL是未来Linux线程的发展方向。

    一些Linux系统生产商(如Red Hat公司)已开始向旧版本内核追加NPTL,甚至通过一个环境变量为特定的可选进程创建超线程环境。在支持此功能的系统中,变量可以通过下面的命令来设置:

    # export LD_ASSUME_KERNEL=2.4.1

    对于那些原本依靠LinuxThreads模式的已有应用软件来说,要想继续在NPTL环境下工作,这是一个比较聪明的办法,但同时也是一个权宜之计。为了能更好的利用NPTL的设计和性能优势,用户需要对使用超线程模式的现有应用软件的代码进行升级。

应用软件的重编译

尽管有许多应用软件从2.4内核到2.6内核移植过程中不需要重新编译,但是大多数多线程应用软件的NPTL附加技术需要进行略微的修改。

那些需要重新编译的应用软件也许会受到升级编译程序的影响。这些编译程序一般都包含在基于2.6内核的Linux套件中,例如TimeSys Linux系统。TimeSys在推出2.6 Reference Distributions的同时捆绑了GCC的3.3.2版本的C和C++编译程序,并使用升级版本的binutils套件弥补标准Linux工具链的不足。

使用基于2.6的内核并不意味着用户已自动使用NPTL。为了决定系统使用的超线程库,用户可以执行下面的命令,对GNU_LIBPTHREAD_VERSION环境变量进行检测,如下所示:

# getconf GNU_LIBPTHREAD_VERSIONlinuxthreads-0.10

If your system uses the NPTL, the command would return the value of NPTL 

that your system was using,as in the following example:

# getconf GNU_LIBPTHREAD_VERSIONnptl-0.60

 

[1] [2] 下一页  

相关内容
赞助商链接