LanYunのBlog

LanYunのBlog

马上订阅 LanYunのBlog RSS 更新: https://lanyundev.com/atom.xml

实现Shell“多线程”

2022年5月5日 22:00

前言

Shell一行行地执行实在是太影响效率.本文将带你提升你的Shell执行效率,采用伪”多线程”的方式启动多个后端进程,最大程度利用cpu性能.

本文代码关键点有一定的注释,方便读者理解并灵活使用.本文示例及部分内容摘录自互联网,由本人整理成以下内容.遵守CC BY-NC-SA 4.0协议.


先问你一个问题.

多线程有什么用?

这里引用知乎pansz用户的回答

  1. 单进程单线程:一个人在一个桌子上吃菜
  2. 单进程多线程:多个人在同一个桌子上一起吃菜
  3. 多进程单线程:多个人每个人在自己的桌子上吃菜

多线程的问题是多个人同时吃一道菜的时候容易发生争抢
例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了…
此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。

  1. 对于 Windows 系统来说,【开桌子】的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。

  2. 对于 Linux 系统来说,【开桌子】的开销很小,因此 Linux 鼓励大家尽量每个人都开自己的桌子吃菜。这带来新的问题是:坐在两张不同的桌子上,说话不方便。因此,Linux 下的学习重点大家要学习进程间通讯的方法。

开桌子的意思是指创建进程,开销这里主要指的是时间开销.

注意,线程和进程是不同的!

多线程就像火车的多个车厢,而进程则是火车。

在我们实现多线程之前,先了解2个概念.
有名管道FIFO和File Descriptor (FD)

有名管道FIFO

管道文件有两种,一个是有名管道,一个是匿名管道。

“FIFO”则是有名管道(有名字的)。
它的特性是:如果一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作,数据就可以如同在shell或者其它地方常见的的匿名管道一样流线执行。

利用有名管道FIFO的上述特性就可以实现一个队列控制了。

**你可以这样想:一个女士公共厕所总共就10...

剩余内容已隐藏

查看完整文章以阅读更多