1。单进程单线程:一我的在一个桌子上吃菜。
2。单进程多线程:多我的在同一个桌子上一块儿吃菜。
3。多进程单线程:多我的每一个人在本身的桌子上吃菜。
多线程的问题是多我的同时吃一道菜的时候容易发生争抢,例如两我的同时夹一个菜,一我的刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一我的夹一口以后,在还给另一我的夹菜,也就是说资源共享就会发生冲突争抢。
1。对于 Windows 系统来讲,【开桌子】的开销很大,所以 Windows 鼓励你们在一个桌子上吃菜。所以 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。
2。对于 Linux 系统来讲,【开桌子】的开销很小,所以 Linux 鼓励你们尽可能每一个人都开本身的桌子吃菜。这带来新的问题是:坐在两张不一样的桌子上,说话不方便。所以,Linux 下的学习重点你们要学习进程间通信的方法。
--
补充:有人对这个开桌子的开销颇有兴趣。我把这个问题推广说开一下。
开桌子的意思是指建立进程。开销这里主要指的是时间开销。
能够作个实验:建立一个进程,在进程中往内存写若干数据,而后读出该数据,而后退出。此过程重复 1000 次,至关于建立/销毁进程 1000 次。在我机器上的测试结果是:
UbuntuLinux:耗时 0.8 秒
Windows7:耗时 79.8 秒
二者开销大约相差一百倍。
这意味着,在 Windows 中,进程建立的开销不容忽视。换句话说就是,Windows 编程中不建议你建立进程,若是你的程序架构须要大量建立进程,那么最好是切换到 Linux 系统。
大量建立进程的典型例子有两个,一个是 gnu autotools 工具链,用于编译不少开源代码的,他们在 Windows 下编译速度会很慢,所以软件开发人员最好是避免使用 Windows。另外一个是服务器,某些服务器框架依靠大量建立进程来干活,甚至是对每一个用户请求就建立一个进程,这些服务器在 Windows 下运行的效率就会不好。这"可能"也是放眼全世界范围,Linux 服务器远远多于 Windows 服务器的缘由。
若是你是写服务器端应用的,其实在如今的网络服务模型下,开桌子的开销是能够忽略不计的,由于如今通常流行的是按照 CPU 核心数量开进程或者线程,开完以后在数量上一直保持,进程与线程内部使用协程或者异步通讯来处理多个并发链接,于是开进程与开线程的开销能够忽略了。
另一种新的开销被提上日程:核心切换开销。
现代的体系,通常 CPU 会有多个核心,而多个核心能够同时运行多个不一样的线程或者进程。
当每一个 CPU 核心运行一个进程的时候,因为每一个进程的资源都独立,因此 CPU 核心之间切换的时候无需考虑上下文。
当每一个 CPU 核心运行一个线程的时候,因为每一个线程须要共享资源,因此这些资源必须从 CPU 的一个核心被复制到另一个核心,才能继续运算,这占用了额外的开销。换句话说,在 CPU 为多核的状况下,多线程在性能上不如多进程。
于是,当前面向多核的服务器端编程中,须要习惯多进程而非多线程。
编程