关于进程和线程,此前已经有很多优秀的文章了,这里只是抛砖引玉,基于自己的理解并整理加深印象。
操作系统下的进程与线程
在正式介绍进程和线程之前,从操作系统的角度了解一下。
众所周知,现代的操作系统(Mac OS X,UNIX,Linux,Windows等)都是支持“多任务”的操作系统。
那么什么是“多任务”呢?简单的说,多任务就是同时运行多个任务,比如一边听歌,一边写博客。
多核 CPU可以直接同时运行多个任务,
而对于单核 CPU 来说,只能让系统轮流执行每个任务,因为任务之间切换很快,在宏观上看上去就是同时执行的了。
对于操作系统来说,一个任务就是一个进程。
而有的进程同时做几件事情,也就是同时运行多个子任务,我们把进程内的这类子任务称为线程。
由于每个进程至少要干一件事情,所以,一个进程至少有一个线程。
PHP 默认是执行单任务的进程,也就是只有一个线程。如果我们要同时执行多个任务怎么办?
有两种解决方案:
- 启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
- 启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。
多线程
线程是最小的执行单元,而进程由至少一个线程组成,知道这一点后,再来理解多线程就不难了。
多线程就是指一个进程中同时有多个线程正在执行。
为什么要使用多线程?
对于一个程序来说,很多操作事非常耗时的,如数据库I/O操作、文件读写等。如果使用单线程,那么就只能等待该线程处理完这些操作之后,才能继续往下执行其他操作。
而如果使用多线程,就可以将耗时的那部分操作通过其他线程去执行,从而提高程序执行效率。
多线程的缺点
- 使用过多线程会过度消耗系统资源,因为创建线程需要开辟新的内存。
- 影响系统性能,操作系统需要来回对多线程进行切换。
- 同时还需要考虑线程异常(挂起、中止)时可能会对造成程序的影响。
总结:
多线程是异步的,分别创建N 个线程并不能说明他们就是在同时运行,实际上是操作系统在各个线程之间来回切换,并且切换速度非常快,这也就造成了在宏观上给我们同时运行的错觉。
多进程
多进程就是指计算机同时执行多个进程。
多进程还是多线程
下面引用一个知乎上的回答,非常通俗的解释了选择多进程还是多线程的问题。
- 单进程单线程:一个人在一个桌子上吃菜。
- 单进程多线程:多个人在同一个桌子上一起吃菜。
- 多进程单线程:多个人每个人在自己的桌子上吃菜。
多线程的问题是多个人同时吃一道菜的时候容器发生争抢。例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候菜已经被夹走了。通俗点说也就说资源共享容器发生冲突争抢。
对于Windows 系统来说,“开桌子”的开销很大,因此Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程的学习重点是资源争抢与同步方面的问题。
而对于Linux 系统来说,“开桌子”的开销很小,因为Linux 鼓励大家尽量每个人都开自己的桌子吃菜。但这同事也带来了新的问题:两个人坐在不同的桌子上,说话不方便。因为,Linux 多线程的学习重点是进程之间的通讯方式。