热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

LINUX进程,线程

http:shaohui.mearchives256N久之前,某两人为了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下的线程机制.



推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 深入理解动态链接库及其应用
    本文将探讨动态链接库的基本概念,包括Windows下的动态链接库(DLL)和Linux下的共享库(Shared Library),并详细介绍如何在Linux环境中创建和使用这些库。 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • 本文介绍如何从JSON格式的文件中提取数据并将其分配给Bash脚本中的变量。我们将探讨具体的命令和工具,帮助你高效地完成这一任务。 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 随着技术社区的发展,越来越多的技术爱好者选择通过撰写博客来分享自己的学习经验和项目进展。本文将介绍一个具体案例,即将一套原本运行于Windows平台的代码成功移植到Linux(Redhat)环境下的过程与挑战。 ... [详细]
  • WinSCP: 跨Windows与Linux系统的高效文件传输解决方案
    本文详细介绍了一款名为WinSCP的开源图形化SFTP客户端,该工具支持SSH协议,适用于Windows操作系统,能够实现与Linux系统之间的文件传输。对于从事嵌入式开发的技术人员来说,掌握WinSCP的使用方法将极大提高工作效率。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
author-avatar
风清淡雅的梦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有