小艾的自留地

Stay foolish, Stay hungry

关于进程和线程,此前已经有很多优秀的文章了,这里只是抛砖引玉,基于自己的理解并整理加深印象。

操作系统下的进程与线程

在正式介绍进程和线程之前,从操作系统的角度了解一下。

众所周知,现代的操作系统(Mac OS X,UNIX,Linux,Windows等)都是支持“多任务”的操作系统。

那么什么是“多任务”呢?简单的说,多任务就是同时运行多个任务,比如一边听歌,一边写博客。

多核 CPU可以直接同时运行多个任务,
而对于单核 CPU 来说,只能让系统轮流执行每个任务,因为任务之间切换很快,在宏观上看上去就是同时执行的了。

对于操作系统来说,一个任务就是一个进程。
而有的进程同时做几件事情,也就是同时运行多个子任务,我们把进程内的这类子任务称为线程。

由于每个进程至少要干一件事情,所以,一个进程至少有一个线程

PHP 默认是执行单任务的进程,也就是只有一个线程。如果我们要同时执行多个任务怎么办?

有两种解决方案:

  1. 启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
  2. 启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。

多线程

线程是最小的执行单元,而进程由至少一个线程组成,知道这一点后,再来理解多线程就不难了。

多线程就是指一个进程中同时有多个线程正在执行。

为什么要使用多线程?

对于一个程序来说,很多操作事非常耗时的,如数据库I/O操作、文件读写等。如果使用单线程,那么就只能等待该线程处理完这些操作之后,才能继续往下执行其他操作。

而如果使用多线程,就可以将耗时的那部分操作通过其他线程去执行,从而提高程序执行效率。

多线程的缺点

  • 使用过多线程会过度消耗系统资源,因为创建线程需要开辟新的内存。
  • 影响系统性能,操作系统需要来回对多线程进行切换。
  • 同时还需要考虑线程异常(挂起、中止)时可能会对造成程序的影响。

总结:
多线程是异步的,分别创建N 个线程并不能说明他们就是在同时运行,实际上是操作系统在各个线程之间来回切换,并且切换速度非常快,这也就造成了在宏观上给我们同时运行的错觉。

多进程

多进程就是指计算机同时执行多个进程。

多进程还是多线程

下面引用一个知乎上的回答,非常通俗的解释了选择多进程还是多线程的问题。

  • 单进程单线程:一个人在一个桌子上吃菜。
  • 单进程多线程:多个人在同一个桌子上一起吃菜。
  • 多进程单线程:多个人每个人在自己的桌子上吃菜。

多线程的问题是多个人同时吃一道菜的时候容器发生争抢。例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候菜已经被夹走了。通俗点说也就说资源共享容器发生冲突争抢。

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

而对于Linux 系统来说,“开桌子”的开销很小,因为Linux 鼓励大家尽量每个人都开自己的桌子吃菜。但这同事也带来了新的问题:两个人坐在不同的桌子上,说话不方便。因为,Linux 多线程的学习重点是进程之间的通讯方式。

参考链接

评论