`
kongweile
  • 浏览: 517382 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

LINUX进程, 线程

 
阅读更多

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下的线程机制.

分享到:
评论

相关推荐

    Linux进程线程编程

    理解并掌握Linux进程线程编程,是深入学习Linux系统编程的关键。下面将详细介绍这两个概念以及相关的进程间通信机制。 **1. 进程:** 进程是程序的一次执行实例,它拥有独立的内存空间,包括代码、数据、栈和堆等。...

    linux 进程线程小程序

    本教程“linux 进程线程小程序”将深入探讨这两个概念,以及如何利用信号量、管道和共享内存进行进程间的通信。 首先,让我们了解什么是进程。在Linux系统中,进程是程序的一次动态执行过程,它具有独立的内存空间...

    linux进程线程

    linux进程线程

    linux 进程 线程 fork 的深入思考

    ### Linux 下进程、线程与 fork 的深入理解 #### 题目背景及解析 本篇文章将基于一道经典的面试题目来探讨 Linux 下进程创建机制,特别是 `fork` 函数的工作原理。该题目不仅考验应试者对进程创建的理解,还涉及了...

    Linux 进程 线程学习笔记

    ### Linux进程与线程创建详解 #### 进程与线程的概念 在深入探讨Linux下C语言编程中进程和线程的创建之前,我们先来理解一下进程与线程的基本概念。 - **进程**:是操作系统进行资源分配和调度的基本单位,每个...

    linux的进程线程编程(高清书签版)

    综上所述,Linux进程线程编程的学习笔记整理涵盖了进程的基本概念、进程的创建与管理、进程类型、进程状态转换、线程编程、进程间通信和信号处理等多个方面。掌握这些知识点对于深入理解Linux操作系统运行机制、编写...

    linux 进程间通信及多线程操作源码

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)和多线程编程是实现高效并发处理的关键技术。本文将深入探讨这两种技术,并结合"全双工邮箱通讯"的源码实例,来阐述如何利用它们实现数据交换。 ...

    linux 线程 pdf

    ### Linux多线程程序设计知识点总结 #### 一、线程理论基础 1. **线程的概念** - **定义**:线程是程序执行流的最小单元,一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和栈组成。在多线程环境下,每个...

    Linux进程、线程和调度(1)

    接下来,我们将详细探讨与Linux进程、线程和调度相关的知识点。 首先,Linux进程是系统分配资源的基本单位,具有独立的地址空间。进程生命周期包括就绪(ready)、运行(running)、睡眠(sleep)、停止(stopped)...

    操作系统课程设计-linux进程与线程的通讯

    在操作系统课程设计中,Linux进程与线程的通信是一个核心且复杂的主题。在这个项目中,学生将深入理解操作系统内核如何管理和协调不同进程和线程之间的数据交换,从而实现高效的任务执行。以下是对这个主题的详细...

    Linux进程间通讯视频教程

    在IT领域,Linux操作系统...此外,了解和掌握Linux进程间通信,也有助于你更好地理解和使用其他高级特性,如守护进程、线程同步等。在实际开发中,灵活运用这些通信方法可以优化系统性能,提高程序的可扩展性和可靠性。

    linux 进程和线程

    linux下的进程、线程

    \嵌入式linux开发教程之进程与线程--千锋培训

    嵌入式Linux开发教程深入探讨了进程与线程的概念及其在操作系统中的实现,这对于理解和开发高效、并发的嵌入式应用程序至关重要。以下是这些知识点的详细解释: **一、基础知识:线程和进程** 1. **进程**:是操作...

    嵌入式软件开发技术:第5章 嵌入式Linux多线程编程.ppt

    在Linux系统中,线程是进程内独立的一条运行路线,处理器调度的最小单元,也可以称为轻量级进程。线程可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享。线程的上下文切换的开销比创建进程小得多...

    linuxio进程线程网络编程

    ### Linux进程与线程 #### 进程 在Linux系统中,进程是资源分配的基本单位,每个进程都有一个唯一的进程ID(PID)。进程具有独立的地址空间,能够执行一段程序,并拥有自己的系统资源,如内存、文件描述符等。进程...

    linux进程的最大线程数 及最大进程数.zip

    linux进程的最大线程数 及最大进程数.zip

    linux_code.rar_linux 多线程_linux 线程_多线程编程

    在Linux系统中,多线程编程是实现高效并发执行任务的一种常见方法。通过创建和管理多个线程,程序可以充分利用现代多核处理器的资源,提高软件的响应速度和整体性能。"linux_code.rar"这个压缩包包含了一些关于Linux...

    linux多线程程序实验,用不同线程完成一个矩阵乘法,以及子进程计算斐波那契数列,父进程输出结果

    在Linux操作系统中,多线程编程是一种常见的技术,它允许程序在同一时间执行多个并发任务,以提高系统的效率和响应性。本实验通过创建多个线程,分别用于执行矩阵乘法和计算斐波那契数列,展示了多线程在并发处理...

    linux 多进程多线程编程

    Linux 多进程多线程编程 Linux 多进程多线程编程是指在 Linux 操作系统下使用 C 语言进行多进程和多线程编程的技术。该技术可以大幅度提高程序的执行效率和响应速度,提高系统的并发能力和资源利用率。 1. 创建...

    linux多线程编程ppt

    早期的Linux 2.2内核中,线程实际上是通过进程模拟的,这意味着每个线程都是一个轻进程,由`fork()`创建,线程数量受到限制。到了Linux 2.4内核,线程限制被解除,引入了LinuxThread库,采用了“一对一”的线程模型...

Global site tag (gtag.js) - Google Analytics