赖勇浩(http://laiyonghao.com)
线程
线程是指进程中的一个单一顺序的控制流,是操作系统能够调度的最小单位,一个进程中可以有多条线程,分别执行不同的任务。线程有内核线程和用户线程之分,但在本文中仅指内核线程。在软件开发中,使用线程有以下好处:
1、在多核或多路 CPU 的机器上多线程程序能够并发执行,提高运算速度;
2、把 I/O,人机交互等与密集运算部分分离,提升 I/O 吞吐量和增进用户体验。
线程的缺点也很明显:
1、创建一条线程需要较大的内存开销,导致不能创建海量的线程;
2、线程由操作系统调度(分配时间片),线程切换的 CPU 成本比较高,导致大量线程存在时大量 CPU 资源消耗在线程切换上;
3、同一进程的多条线程共享全部系统资源,在多线程间共享资源需要进入加锁,大量的锁开销不提,重要的是加大了编写程序的复杂性,这一点你看看有多少书名含有“多线程”三个字就明白写个多线程应用有多难了;
4、I/O 方面,多线程帮助有限,以 TCP Socket Server 为例,如果每一个 client connection 由一条专属的线程服务,那么这个 server 可能并发量很难超过 1000。为了进一步解决并发带来的问题,现代服务器都使用 event-driven i/o 了。
event-driven i/o 解决了并发量的问题,但引入了“代码被回调函数分割得零零碎碎”的问题。特别是当 event-driven i/o 跟 multi-threading 结合在一起的时候,麻烦就倍增了。解决这个问题的办法就使用绿色线程,绿色线程可以在同一个进程中成千上万地存在,从而可以在异步 I/O 上封装出同步的 APIs,典型的就是用基于 greenlet + libevent 开发的 python 库 gevent。绿色线程的缺陷在于操作系统不知道它的存在,需要用户进行调度,也就无法利用到多核或多路 CPU 了。为了解决这个问题,很多大牛都做出了巨大的努力,并且成果斐然,scala、google go 和 rust 都较好地解决了问题,下文以 rust 的并发模型为例讲一下。
rust 提出一个 Task 的概念,Task 有一个入口函数,也有自己的栈,并拥有进程堆内存的一部分,为方便理解,你可以把它看作一条绿色线程。rust 进程可以创建成千上万个 Tasks,它们由内建的调度器进行调度,因为 Tasks 之间并不共享数据,只通过 channels/ports 通信,所以它们是可并行程度很高。rust 程序启动时会生成若干条(数量由 CPU 核数决定或运行时指定)线程,这些线程并行执行 Tasks,从而利用多个 CPU 核心。
如上图,rust 应用程序不停地 spawn 出一个又一个 Tasks,它们由 tasks 调度器管理,在适当的时机,调度器会把某一个 Task 分配给原生线程执行,如果这个 Task 进入 I/O 等待或主动让出 CPU(sleep),那么这个 Task 会被交回给调度器,而相应的原生线程会执行另一个新分派的 Task。尽管使用 rust 编程语言是不能创建线程的(直接调用 C 函数不算),但 rust 应用程序实际上是多线程的(一般情况下),它能够充分地利用多核或多路 CPU。
综上,类似 rust 的 Task 的概念是比线程更好的并发模型,更安全,编写的代码也更加容易维护(关于维护性,我相信写过 gevent 程度或 go 程序的同学会认同的)。线程当然不会消亡,但随着 scala/go/rust 的成熟,在可以预见的将来,线程会退到它呆着的角落:远离普通程序员,只有少数人需要了解它的细节。
分享到:
相关推荐
抖音最新解决“不宜公开及0播放”技术汇总.rar
数”不宜迟——革新数据策略、斩获数字投资新业绩.pdf 数”不宜迟——革新数据策略、斩获数字投资新业绩.pdf 数”不宜迟——革新数据策略、斩获数字投资新业绩.pdf 数”不宜迟——革新数据策略、斩获数字投资新业绩....
2. 技术成果名称不宜太宽泛或包含太多节点或工艺单元,宜推荐高度集成的工艺技术;也不宜太窄或者太小。 3. 技术成果名称应精练,不宜出现“研究、产业、应用”等字样,不含英文缩写。 4. 技术成果领域包括:水污染...
各级数据中心技术要求 附录1 各级数据中心技术要求 项目 技术要求 备注 A 级 B 级 C 级 选址 距离停车场 不应小于20m 不宜小于10m 包括自用和外部停车 场 距离铁路或高速 公路的距离 不应小于800米 不宜小于100米 不...
美容仪镍超标 不宜照搬国外标准.pdf
高中历史之历史百科上课的“8个不宜”老师你做过几个?新学期给自己提个醒素材
护理婴幼儿五不宜
对信息技术的认识 摘要 人类社会已步入信息时代,在广大中小学开设信息技术必修课是教育部根据我国的现实 国情做出的重大决策。普及信息技术教育是素质教育的必然要求,是培养创新型人才的 需要,是教育本身发展的...
夏季消暑十不宜.docx
看望病人不宜久留.doc
不宜流通人民币硬币.pdf
HR说话不宜满.pdf
符拉迪沃斯托克不宜飞行
离线 chrome 爽的不宜乐呼
20210322-中金公司-基础化工行业:同一碳排放,不宜统一碳定价.pdf
写毕业论文必须要注意的方面·很有用哦 毕业论文的内容要求 1.题目:应简洁、明确、有概括...3.关键词:从论文标题或正文中挑选3~5个最能表达主要内容的词作为关键词,同时有中、英文对照,分别附于中、英文摘要后。
不宜流通人民币挑剔标准.docx
就餐时不宜发短信.doc
不宜混栽的果树品种.pdf
白酒板块周报:短期波动不宜过分担忧,中长期确定性较高.pdf