传统的操作系统中“线程”和“进程”的区别,Linux中独特线程机制

操作系统引入进程是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量

而引入线程,则是为了减少程序在并发执行时所付出的时间和空间开销,使操作系统有更好的并发性

传统的操作系统(Microsoft Windows或 Sun Solaris等)中线程和进程的比较:

  1. “基本单位”不同:

    进程是资源分配的基本单位,是系统进行资源分配和调度的一个独立单元,拥有独立的资源。但是进程调度和创建或撤销时,时空开销大。进程调度时,需上下文切换,保存当前进程的CPU环境。进程创建或撤消时,系统都要为之分配和回收进程控制块和其他资源。

    线程是调度和分派的基本单位,是一种“轻量级的进程”。线程切换时,仅需保存和设置少量寄存器内容,切换代价小于进程,但是线程没有独立的资源,与属于同一个进程的线程共享该进程的资源。所以线程创建和撤消的开销也小于进程。

  2. 并发性:

    线程进程的一条执行流程,所以一个进程中的线程可并发执行,属于不同进程的线程也可以同进程并发一样执行,所以在多处理机系统中,可以将一进程中的多个线程分配到多个处理机上,加速执行的效率。

  3. 通讯方式:

线程间通过共享的资源进行通讯,访问时需要进行线程间同步控制。

进程间通过管道、消息队列、信号量、共享内存、socket进行通讯,访问时有时需要进程间同步控制。


Linux中独特线程机制

Linux的线程机制的实现与上述操作系统线程的实现差异非常大。上述操作系统都在内核中提供了专门支持线程的机制,而对于Linux,线程只是一种进程间共享资源的手段,一种耗费较少且运行迅速的执行单元。

Linux中的进程具备下列要素:

(1)有一段程序供其执行。(2)有专用的系统堆栈空间。(3)内核中有一个task_struct结构,记录着进程所占用的各项资源。(4)有独立的存储空间(拥有专有的用户空间)。

如果只具备了前面两条而缺第四条,那就称之为“线程”。如果完全没有用户空间,就成为“内核线程”;如果共享用户空间则就称为“用户线程”。

Linux把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表示线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一的task_struct结构,所以在内核中,看起来就像是一个普通的进程。

多线程编程发展历史:

早期Linux不支持线程,直到1996年,Xavier Leroy 等人开发出第一个基本符合POSIX标准的线程库Linux Threads。但LinuxThreads效率低而且问题很多。自内核2.6开始,Linux才真正提供内核级的线程支持,并有两个组织致力于编写新的线程库:NGPT(Next Generation POSIX Threads)和NPTL(Native POSIX Thread Library)。不过前者在2003年就放弃了,因此新的线程库就成为NPTL。NPTL比LinuxThreads效率高,且更符合POSIX规范,所以它已经成为glibc的一部分。

Linux线程库:

用户可以使用如下命令来查看当前系统上所用的线程库:

$ getconf GNU_LIBPTHREAD_VERSION

LinuxThreads线程库的内核线程是用clone系统调用创建的进程模拟的。(《Linux高性能服务器编程》)

传统的操作系统中“线程”和“进程”的区别,Linux中独特线程机制_第1张图片传统的操作系统中“线程”和“进程”的区别,Linux中独特线程机制_第2张图片

 

更详解的 Linux 线程模型的比较:LinuxThreads 与 NPTL

你可能感兴趣的:(Linux)