`

科普帖:线程与进程

阅读更多

这么解释问题吧:

  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 服务器的原因。

 

本文整理自我在 segmentfault 的问答。

15
9
分享到:
评论
10 楼 mz0827 2013-09-18  
kuchaguangjie 写道
进程: process
线程: thread


thread 属于 1个 process,
1个 process 可以有多个 thread,

同1个 process 的 threads 共享资源, 除了 stack, local variable,

jvm 相当于 1个 process,
1个java Thread 相当于 1个 thread,


感觉1楼说的  比  楼主的还要精辟。
9 楼 home198979 2013-09-18  
iteye真没有好文章了么?这种文章还放首页,服!!!
8 楼 caizi12 2013-09-18  
有没有更深入的普及,例如就讲讲java的进程和线程,线程到底是什么东西,怎么运行等相关的,一直对线程理解不了,一个jvm实例是不是就一个main线程,什么时候会创建一个新的线程,好多不明白。
7 楼 ray_linn 2013-09-18  
光填写数据不能等同于windows CreateProcess, 要等价必须进行代码段替换。

你这个帖子说得太浅了,请参考:

http://blogs.ejb.cc/archives/969/comparison-of-the-process-of-linux-and-windows
6 楼 ray_linn 2013-09-18  
fork 和 windows createprocess不能等同,你必须测试fork/exec才等于windows create process.
5 楼 wlxlz 2013-09-18  
谢谢lz分享,真的是豁然开朗
4 楼 timer_yin 2013-09-18  
非常不错 通俗易懂
3 楼 Jack_ljk 2013-09-18  
看来windows应用要升级了,不然就要被淘汰。
2 楼 artdialog 2013-09-18  
太精辟了,通俗易懂。
1 楼 kuchaguangjie 2013-09-17  
进程: process
线程: thread


thread 属于 1个 process,
1个 process 可以有多个 thread,

同1个 process 的 threads 共享资源, 除了 stack, local variable,

jvm 相当于 1个 process,
1个java Thread 相当于 1个 thread,

相关推荐

Global site tag (gtag.js) - Google Analytics