免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 766 | 回复: 0
打印 上一主题 下一主题

Linux线程技术(原创) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-14 10:08 |只看该作者 |倒序浏览
Linux线程技术

Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器以及减小(进程/线程)上下文切换开销。
一、        进程和线程的关系
根据操作系统的定义:进程是系统资源管理的最小单位,线程是程序执行的最小单位。线程和进程十分相似,不同的只是线程比进程小。首先,线程采用了多个线程可共享资源的设计思想;例如,它们的操作大部分都是在同一地址空间进行的。其次,从一个线程切换到另一线程所花费的代价比进程低。再次,进程本身的信息在内存中占用的空间比线程大,因此线程更能允分地利用内存。线程可以看作是在进程内部执行的指定序列。线程和进程的最大区别在于线程完全共享相同的地址空间,运行在同一地址上。

二、 Linux线程的定义
线程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。在两个普通进程(非线程)问进行切换时,内核难备从一个进程的上下文切换到另一个进程的上下文要花费很大的开销。这里上下文切换的主要任务是保存老进程CPU状态并加载新进程的保存状态,用新进程的内存映像替换者进程的内存映像。线程允许你的进程在几个正在运行的任务之间进行切换,而不必执行前面提到的完整的上下文。
在Unix类系统中曾经出现过一些不同线程标准,它们都支持可移植操作系统接口标准POSIX(Portable Operating System Interface Standard)。POSIX标准由IEEE制订,并由国际标准化组织接受为国际标准。POSIX1003.1c是一个用于线程(在一个程序中当前被执行的代码段)的标准。以前是 P1993.4 或 POSIX.4 的一部分,这个标准已经在 1995 年被 IEEE 通过,归入 ISO/IEC 9945-1:1996。
所以本文介绍线程是针对POSIX线程 ,也就是pthread。也因为Linux对它的支持最好。相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。
也可以将线程和轻量级进程(LWP)视为等同,但其实在不同的系统/实现中有不同的解释,LWP更恰当的解释可能为一个虚拟CPU或内核的线程。它可以在帮助用户态线程实现一些特殊的功能。Pthread是一种标准化模型,它用来把一个程序分成一组能够同时执行的任务。
什么场合会使用Pthread即线程?
1、        在返回前阻塞的IO任务能够使用一个线程处理IO,同时继续执行其他处理任务。
2、        在有一个或多个任务受不确定性事件,比如网络通信的可获得性影响的场合,能够使用线程处理这些异步事件同时继续执行正常的处理。
3、        如果某些程序功能比其他的功能更重要,可以使用线程以保证所有功能都出现,但那些时间密集型的功能具有更高的优先级。
从以上三点可以归纳位:在检查程序中潜在的并行性,也就是说找出能够同时执行任务时使用Pthread。但是以上已经介绍了Linux进程模型已经提供了执行多个进程的能力,已经可以进行并行或并发编程。可是线程能够让你对多个任务的控制程度更好,。使用资源更少,因为一个单一的资源,如全局变量,可以由多个线程共享。而且,在拥有多个处理器的系统上,多线程应用会比用多个进程实现的应用执行的
三、Linux线程实现方法
目前线程用两种方法实现:
(1)用户态线程:
用户线程是一个精细的软件工具,允许多线程的程序运行时不需要特定的内核支持。如果一个进程中的某一个线程调用了一个阻塞的系统调用,该进程就会被阻塞,当然该进程中的其他所有线程也同时被阻塞,因此UNIX使用了异步I/O机制。这种机制主要的缺点在于在一个进程中的多个线程的调度中无法发挥多处理器的优势(如上述的阻塞情况)。
其优点包括:
1、某些线程操作的系统消耗大大减少。比如,对属于同一个进程的线程之间进行调度切换时不需要调用系统调用,因此将减少额外的消耗,往往一个进程可以启动上千个线程也没有什么问题。
2、 用户态线程的实现方式可以被定制或修改以适应特殊应用的要求。这对于多媒体实时过程等尤其有用。另外,用户态线程可以比核心态线程实现方法的默认情况支持更多的线程。
(2)核心态线程
这种线程的实现方法允许不同进程中的线程按照同一相对优先调度方法进行调度。这有利于发挥多处理器的并发优势。目前线程主要的实现方法是用户态线程。有几个研究项目已经实现了一些核心态线程的形式。其中比较著名的是MACH分布式操作系统。通过允许用户代码对内核线程调度的参与,该系统将用户态和核心态两种线程实现方法的优点结合了起来。通过提供这样一个两级调度机制,内核在保留了对处理器时间分配的控制的同时,也使一个进程可以充分利用多处理器的优势。
四、Linux对超线程技术支持
超线程技术是Intel 公司的创新设计,藉由在一颗实体处理器中放入二个逻辑处理单元,让多线程软件可在系统平台上平行处理多项任务,并提升处理器执行资源的使用率。使用这项技术,处理器的资源利用率可获得提升,大大增加处理的传输量。 超线程使得单个的处理器可以伪装成操作系统看来二个或更多的多个处理器。Linux内核在2.4.17发布中开始包含对Intel P4处理器的超线程(Hyperthreading)的支持(2.4最初的发布版本中不支持它)。Linux是第一个把超线程特性引入市场的操作系统,尽管早在一年前Intel就发布了兼容的处理器。它包括了以下增强技术:
1.        128 字节锁对齐。
2.        螺旋等待循环优化 。
3.        基于非执行的延迟循环 。
4.        检测支持超线程的处理器,并启动逻辑处理器,如同该机器是SMP(多处理器构架) 。
5.        MTRR 和微码更新(Microcode Update)驱动程序中的串行化,因为它们影响共享状态 。
6.        在逻辑处理器上的调度发生之前,当系统空闲时对物理处理器上的调度进行优先级排序时,对调度程序进行优化 。
7.        偏移用户堆栈以避免 64K 混叠 。
五、 Linux进程和线程的发展
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期。现在,多线程技术已经被许多操作系统所支持,包括Windows NT/2000和 Linux。这里我们看看Linux进程和线程发展过程。
1999年1月发布的Linux 2.2内核中,进程是通过系统调用fork创建的,新的进程是原来进程的子进程。需要说明的是,在2.2.x中,不存在真正意义上的线程(Thread)。Linux中常用的线程pthread实际上是通过进程来模拟的。也就是说linux中的线程也是通过fork创建的,是“轻”进程。Linux 2.2缺省只允许4096个进程/线程同时运行。高端系统同时要服务上千的用户,所以这显然是一个问题,一度是阻碍Linux进入企业级市场的一大因素。
2001年1月发布的Linux 2.4内核消除了这个限制,并且允许在系统运行中动态调整进程数上限。因此,进程数现在只受制于物理内存的多少。在高端服务器上,即使只安装了512M内存,现在也能轻而易举地同时支持1万6千个进程。
在2.5内核中已经做了很多的改进线程性能的工作。在2.6中改进的线程模型仍然是由 Ingo Molnar 来完成的。它基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核内在的对新的 NPTL(Native Posix Threading Library)的支持,这个新的 NPTL 是由 Molnar 和 Ulrich Drepper 合作开发的。
2003年12月发布的2.6内核,进程调度经过重新编写,去掉了以前版本中效率不高的算法。以前,为了决定下一步要运行哪一个任务,进程调度程序要查看每一个准备好的任务,并且经过计算来决定哪一个任务相对来说更为重要。进程标识号(PID)的数目也从32000升到10亿。内核内部的大改变之一就是Linux的线程框架被重写,以使NPTL(Native POSIX Thread Library)可以运行于其上。NPGL自从出现在2.5内核后就开始逐渐代替NGPT(Linux的另一种可选线程模型Next Generation Posix Threads for Linux)。NGPT是一个M:N线程模型(M个用户态线程对应N个核心态线程),就目前所知,NGPT是基于GNU Pth(GNU Portable Threads)项目而实现的M:N模型,而GNU Pth是一个经典的用户级线程库实现。)和LinuxThreads(Linux标准线程库)。2.6内核现在可以处理任意数目的线程,PID最大可以到20亿(IA32构架)。NPTL的设计目标归纳可归纳为以下几点:POSIX兼容性、SMP结构的利用、低启动开销、低链接开销(即不使用线程的程序不应当受线程库的影响) 、与LinuxThreads应用的二进制兼容性、软硬件的可扩展能力 、多体系结构支持、NUMA支持 、与C++集成。
对于运行负荷繁重的线程应用的Pentium Pro以及更先进的处理器而言,这是一个主要的性能提升;它也是企业级应用中的很多高端系统一直以来所期待的。线程框架的改变包含Linux线程空间中的许多新的概念,包括线程组、线程各自的本地存储区、POSIX风格信号以及其他改变。改进后的多线程和内存管理技术有助于更好地运行大型多媒体应用软件。
以上简单介绍了Linux线程的属性、和进程关系、线程的实现方法和Linux对超线程技术支持已经Linux线程发展过程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP