http://shaohui.me/archives/256
N久之前, 某两人为了linux的调度基本单元是进程还是线程争得面红耳赤, 当然, 且不论为了一个技术问题不顾体面其用心何在, 单纯从技术角度讲, 这是个挺好的问题.
单纯的下一个结论几乎总是错误的, 所谓的对与错也只不过是在特定的时段和特定的场景下符合规律的一种状态, 一旦时过境迁, 对的东西往往变成了错误的, 而错误的东西又会变成对的.所以我建议在这里不要使用"对"或是"错"来判定事务, 只能说是在当前的情况下, 从UUU角度看XXX更显得更"符合实际".
我们都知道linux是不断发展的.在早期版本中, linux的基本调度单元是Task, 只到现在, 依然是它.
在早期版本中, 一个Task对应着一个进程, 完全没有线程这个概念.
随着时间的发展, 线程的概念出现的, 但是linux并没有马上接受这一概念, 要知道, 线程是现代操作系统的特征, 向一个现有的操作系统内核引入线程是一件伤筋动骨的事情, 更何况在线程概念的早期, 受历史原因(UNIX)和硬件的限制(多核尚不是主流), 线程的地位尚不确定. 所以, linux并没有在内核中引入线程的概念.
但是, linux提供了一个新的系统调用clone, 通过该系统调用, 内核中的多个进程可以共享一些信息, 比如进程空间等. 注意, 此时linux内核的基础调度单元依然是Task, 而且在内核看来, 一个进程依然对应着一个Task.
有了clone系统调用, 人们在用户态就可以模拟出线程的行为. 但是, 内核并没有线程的概念, 他依然将所有的进程看着是独立的. 这个用户态模拟的线程现实是linux pthread lib.
虽然可以在一定程度上模仿出线程的行为, 但是那些只有在内核中才能实现的线程的行为, 在用户态是模拟不了的. 而且, 随着时间的发展, 内核技术的进步, 已经多核的普及, 促生了linux 2.6内核版本.
注意, linux kernel 2.6是一个飞跃性的版本, 大家都认同, 本次版本将linux从传统操作系统晋升为现代操作系统. 其中最重要的改进就是, 内核中引入了线程组的概念.
这里要分析一下, clone调用的引入, 使得两个进程可以共享一些资源, 但是内核依然将两个进程看做是独立的, 互不相关的. 它们拥有自己的独立进程id, 信号处理等等.
2.6 内核中引入了线程组的概念, 也就是说在clone调用时, 如果设置了适当的标志位(libc 的NPTL 库正确的实现了这一特性), 内核将把新创建的进程和原进程视为一个组, 这个组称之为"线程组", 组中的进程称之为"线程". 注意, 到了这一步, 内核的调度单元依然是Task, 在内核中, 每个Task对应着一个进程, 只不过, 这个进程有可能是一个单独的进程, 也有可能是一个"线程组"中的一个线程.
线程组中的所有线程(进程)共享同一个进程pid, 给线程组中的任何一个线程发送信号, 整个线程组中的线程都能收到信号.
综上所述, 可以得出以下一些结论:
1. 内核的调度单元是Task
2. 2.6以前的内核中没有线程的概念. 每个Task对应一个进程.
3. 2.6以后的内核中增加了线程组的概念, 每个Task对应一个进程, 或者是一个线程组中的一个线程. 所谓的线程, 只是几个相关进程中的一个.
进一步, 2.6的这种改法, 符合现代操作系统对于进程和线程的内涵. 因为在现代操作系统中:
进程: 提供计算资源.
线程: 进行计算.
从这个角度出发, 在2.6以后的linux中, 对于多线程程序, 我们可以看做是一个进程 + 多个线程. 对于单线程程序, 我们也可以看做是一个进程 + 一个线程. 在这样统一个看法中可以说一个Task对应一个线程, 进而得出"内核的调度单元是线程"的结论.
当然, 我们也可以不使用现代操作系统的观点, 这样的话, 对多线程程序, 我们可以看做是内核将多个进程组织起来形成的一个进程, 对于单线程程序, 我们就把它看做是一个进程, 进而也可以得出"内核的调度单元是进程"的结论.
其实真正重要的是, 系统是否给我们系统了符合线程行为定义的机制, 至于下面的实现是进程还是线程, 都不是我们关心的, 因为正是有了进程, 线程这样的抽象的概念, 我们才能够在更高的层面上认识问题, 更好的使用它们.
所以, 争论内核的调度单元是Task, 进程, 线程, 其实是混淆了看问题的角度, 时空, 以及无法区分抽象和现实而产生的, 当然, 单纯的技术问题也可以用来当着"指鹿为马", 但别人看来只是一场笑话.
附一篇很好的文章, 比较详细的描述介绍了linux下的线程机制.
http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/
分享到:
相关推荐
在Linux操作系统中,进程和线程是两个核心概念,它们是程序执行的载体。本教程“linux 进程线程小程序”将深入探讨这两个概念,以及如何利用信号量、管道和共享内存进行进程间的通信。 首先,让我们了解什么是进程...
在Linux操作系统中,进程和线程是两种基本的执行单元,它们在系统级和应用程序级起着至关重要的作用。理解并掌握Linux进程线程编程,是深入学习Linux系统编程的关键。下面将详细介绍这两个概念以及相关的进程间通信...
### Linux 下进程、线程与 fork 的深入理解 #### 题目背景及解析 本篇文章将基于一道经典的面试题目来探讨 Linux 下进程创建机制,特别是 `fork` 函数的工作原理。该题目不仅考验应试者对进程创建的理解,还涉及了...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)和多线程编程是实现高效并发处理的关键技术。本文将深入探讨这两种技术,并结合"全双工邮箱通讯"的源码实例,来阐述如何利用它们实现数据交换。 ...
在操作系统课程设计中,Linux进程与线程的通信是一个核心且复杂的主题。在这个项目中,学生将深入理解操作系统内核如何管理和协调不同进程和线程之间的数据交换,从而实现高效的任务执行。以下是对这个主题的详细...
Linux多线程服务端编程:使用muduo+C网络库.pdf Linux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:...
linux进程线程
linux下的进程、线程
### Linux进程与线程创建详解 #### 进程与线程的概念 在深入探讨Linux下C语言编程中进程和线程的创建之前,我们先来理解一下进程与线程的基本概念。 - **进程**:是操作系统进行资源分配和调度的基本单位,每个...
在IT领域,Linux操作系统...此外,了解和掌握Linux进程间通信,也有助于你更好地理解和使用其他高级特性,如守护进程、线程同步等。在实际开发中,灵活运用这些通信方法可以优化系统性能,提高程序的可扩展性和可靠性。
在Linux系统中,线程是进程内独立的一条运行路线,处理器调度的最小单元,也可以称为轻量级进程。线程可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享。线程的上下文切换的开销比创建进程小得多...
从给定的文件信息中,我们可以提炼出一系列关于Linux操作系统的关键知识点,主要集中在进程、线程、网络编程以及系统管理方面。以下是对这些知识点的详细阐述: ### Linux进程与线程 #### 进程 在Linux系统中,...
嵌入式Linux开发教程深入探讨了进程与线程的概念及其在操作系统中的实现,这对于理解和开发高效、并发的嵌入式应用程序至关重要。以下是这些知识点的详细解释: **一、基础知识:线程和进程** 1. **进程**:是操作...
在Linux操作系统中,进程与线程编程是系统编程的一个重要组成部分,它涉及到操作系统对于程序执行的控制和管理。本文将基于文档内容,详细介绍Linux下的进程和线程编程知识。 首先,理解进程和程序的概念是学习进程...
linux进程的最大线程数 及最大进程数.zip
Linux多线程服务端编程,高清无水印!~
Linux多线程服务端编程是陈硕大神的一本linux服务端开发实战书籍。
### Linux多线程程序设计知识点总结 #### 一、线程理论基础 1. **线程的概念** - **定义**:线程是程序执行流的最小单元,一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和栈组成。在多线程环境下,每个...
Linux 多进程多线程编程 Linux 多进程多线程编程是指在 Linux 操作系统下使用 C 语言进行多进程和多线程编程的技术。该技术可以大幅度提高程序的执行效率和响应速度,提高系统的并发能力和资源利用率。 1. 创建...
在Linux系统中,多线程编程是实现高效并发执行任务的一种常见方法。通过创建和管理多个线程,程序可以充分利用现代多核处理器的资源,提高软件的响应速度和整体性能。"linux_code.rar"这个压缩包包含了一些关于Linux...