那么在什么场合会使用Pthread呢?◆在返回前阻塞的I/O任务能够使用一个线程处理,同时继续执行其它处理任务。◆在有一个或多个任务受不确定性事件影响,比如网络通信的可获得性影响的场合,能够使用线程处理这些异步事件,同时继续执行正常的处理。◆如果某些程序功能比其它的功能更重要,可以使用线程以保证所有功能都出现,但那些时间密集型的功能具有更高的优先级。以上三点可以归纳为在检查程序中潜在的并行性时,也就是说找出能够同时执行任务时使用Pthread。上面介绍了Linux进程模型已经提供了执行多个进程的能力,可以进行并行或并发编程,但是,线程对多个任务的控制程度要更好,使用资源更少。因为一个单一的资源,如全局变量,可以由多个线程共享,而且,在拥有多个处理器的系统上多线程应用会由用多个进程实现的应用执行。Linux进程和线程技术发展线程技术早在20世纪60年代就被提出,但真正应用多线程到操作系统中还是在20世纪80年代中期。现在,多线程技术已经被许多操作系统所支持,包括Windows NT/2000和Linux。在1999年1月发布的Linux 2.2内核中,进程是通过系统调用fork创建的,新的进程是原来进程的子进程。需要说明的是,在Linux 2.2.x中,不存在真正意义上的线程,Linux中常用的线程Pthread实际上是通过进程来模拟的。也就是说,Linux中的线程也是通过fork创建的,是“轻”进程。Linux 2.2缺省只允许4096个进程/线程同时运行,而高端系统同时要服务上千的用户,所以这显然是一个问题。它一度是阻碍Linux进入企业级市场的一大因素。2001年1月发布的Linux 2.4内核消除了这个限制,并且允许在系统运行中动态调整进程数上限。因此,进程数现在只受制于物理内存的多少。在高端服务器上,即使只安装了512MB内存,现在也能轻而易举地同时支持1.6万个进程。在Linux 2.5内核中,已经做了很多改进线程性能的工作。在Linux 2.6中改进的线程模型仍然是由Ingo Molnar 来完成的。它基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核内在的对新NPTL(Native Posix Threading Library)的支持,这个新的NPTL是由Molnar和Ulrich Drepper合作开发的。2003年12月发布的Linux 2.6内核,对进程调度经过重新编写,去掉了以前版本中效率不高的算法。进程标识号(PID)的数目也从3.2万升到10亿。内核内部的大改变之一就是Linux的线程框架被重写,以使NPTL可以运行其上。Linux的另一种可选线程模型是IBM开发的NGPT(Next Generation Posix Threads for Linux),它是基于GNU Pth(GNU Portable Threads)项目而实现的M:N模型(M个用户态线程对应N个核心态线程)。NPTL的设计目标可归纳为以下几点:POSIX兼容性、SMP结构的利用、低启动开销、低链接开销(即不使用线程的程序不应当受线程库的影响)、与LinuxThreads应用的二进制兼容性、软硬件的可扩展能力、多体系结构支持、NUMA支持,以及与C++集成等。对于运行负荷繁重的线程应用Pentium Pro及更先进的处理器而言,这些是主要的性能提升,也是企业级应用中很多高端系统一直以来所期待的。线程框架的改变包含Linux线程空间中的许多新的概念,包括线程组、线程各自的本地存储区、POSIX风格信号,以及其它改变。改进后的多线程和内存管理技术有助于更好地运行大型多媒体应用软件。
关键词:Linux、Linux线程技术、Linux线程、Linux技术、企业网站建设、引擎的优化