2007年6月5日星期二

Windows和Unix的线程_摘抄

这里先介绍下线程的概念,线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,Sun的Solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程,不能像Windows NT系统那样(2000是NT5.0,XP是NT5.1,2K3是NT5.2)一个进程有很多个线程。现在,多线程技术已经被许多操作系统所支持,包括 Windows/NT和Linux。但是线程的实现在类Unix下并不相同,基本上分为内核支持方式和用户空间支持方式,如果线程的上下文切换是在内核中实现的,我们就称之为内核方式实现,但如果线程的切换是在用户空间进行的我们就称之为用户方式实现,内核并不知情,当然还有两种方式的混合方式,用户空间中的多个线程在内核空间有相应的内核线程与之对应(通常我们称此内核线程为LWP-轻级进程)。
我们再看看linux下线程的实现,linux的线程编程有两个库pthread和pth,对于pthread的实现是内核方式的实现,每个线程在 kernel中都有task结构与之对应,也就是说用ps命令行是可以看见多个线程,线程的调度也是由内核中的schedule进行的。
再来看看Windows的多线程,Windows NT和Windows95是一个抢先型多任务、多线程操作系统。因为它使用抢先型的多任务,所以它拥有与UNIX同样平滑的处理和进程独立。多线程就更进一步。一个独立的程序默认是使用一个线程,不过它可以将自己分解为几个独立的线程来执行,例如,其中的一个线程可以发送一个文件到打印机,而另一个可以响应用户的输入。这个简单的程序设计修改可以明显减少用户等待的时间,让用户无需担心长时间的计算、重绘屏幕、文件读写等带来的不便。
多线程还可以让你从许多高端的多处理器NT机器中得到好处。例如,你购买了一个高级的RISC机器,可以使用多达10个CPU芯片,但在开始的时候你只购买了一个CPU。你写了一个简单的Mandelbrot set程序,你发现需要15秒的时间来重新绘制Mandelbrot set的画面。

那么,Windows平台的线程和类Unix平台(包括Linux)的进程的区别是什么呢?
  熟悉WIN32编程的人一定知道,WIN32的进程管理方式与UNIX上有着很大区别,在UNIX里,只有进程的概念,但在WIN32里却还有一个“线程”的概念,那么UNIX和WIN32在这里究竟有着什么区别呢?
  UNIX里的fork是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。
  WIN32里的进程/线程是继承自OS/2的。在WIN32里,“进程”是指一个程序,而“线程”是一个“进程”里的一个执行“线索”。从核心上讲,WIN32的多进程与UNIX并无多大的区别,在WIN32里的线程才相当于UNIX的进程,是一个实际正在执行的代码。但是,WIN32里同一个进程里各个线程之间是共享数据段的。这才是与UNIX的进程最大的不同。
对于多任务系统,共享数据区是必要的,但也是一个容易引起混乱的问题,在WIN32下,一个程序员很容易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后,另一个线程却又修改了它,结果引起程序出问题。但在UNIX下,由于变量本来并不共享,而由程序员来显式地指定要共享的数据,使程序变得更清晰与安全。
至于WIN32的“进程”概念,其含义则是“应用程序”,也就是相当于UNIX下的exec了。

没有评论: