Linux与Windows线程机制简单比较

线程机制是现代编程技术中常用的一种抽象。该机制提供了在同一程序内共享内存地址空间运行的一组线程。这些线程还可以共享打开的文件和其他资源。线 程机制支持并发程序设计(concurrent programming),在多处理器系统上,它也能保证真正的并行处理(parallelism)。

  Linux实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。Linux的线程都当作进程来实现。内核并没有准备特别的调度算 法或定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的task_struct,所 以在内核中,它看起来就像是一个普通的进程(只是该进程和其他一些进程共享某些资源,如地址空间)。

  上述线程机制的实现与Microsoft Windows或是Sun Solaris等操作系统的实现差异非常大。这些系统都在内核中提供了专门支持线程的机制(这些系统常常把线程称作轻量级进程,lightweight process)。“轻量级进程”这种叫法本身就概括了Linux在此处与其他系统的差异。在其他的系统中,相较于重量级的进程。线程被抽象为一种耗费较 少资源、运行迅速的执行单元。而对于Linux来说,它只是一种进程间共享资源的手段(Linux的进程本身就够轻了)。举个例子来说,加入我们有一个包 含四核线程的进程,在提供专门线程支持的系统中,通常会有一个包含指向四个不同线程的指针的进程描述符。该描述符负责描述像地址空间、打开的文件这样的共 享资源。线程本身再去描述它独占的资源。相反,Linux仅仅负责创建四个进程并分配四个普通的task_struct结构。建立这四个进程是制定它们共 享某些资源就行了。

\

我们知道,Linux下没有任何关于线程的系统调用,内核对线程一无所知,用于实现多线程的,是几个线程包(LinuxThreads,pthread等 等),而Windows下,内核把线程当作调度实体,线程调度在内核内完成。而其他Unix系统,比如FreeBSD,Minix3同样是选择了在用户层 面实现多线程,而一些系统比如Solaris则使用混合方案。



记得Windows核心编程说过,Windows不存在“进程调度”,只有“线程调度”,这是最基本的调度方式(Windows下,任何一个进程都至少有一个线程,main函数会自动成为主线程的函数),这一点是和Linux下以“进程”为调度单位最大的不同。


其实,看线程效率绝不能孤立地看线程模型,要看整个系统,在Windows下,gui是在内核态运行的(参见Windows Internals),Linux下gui是用户态,那么对于gui程序的线程来说,Windows下的内核态线程似乎更适合。

你可能感兴趣的:(Linux与Windows线程机制简单比较)