多线程和多进程的区别与联系

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 为多核的状况下,多线程在性能上不如多进程。

于是,当前面向多核的服务器端编程中,须要习惯多进程而非多线程。

编程




多线程使得程序内部能够分出多个线程来作多件事情,而不会形成程序界面卡死。好比迅雷等多线程下载工具就是典型的多线程。一个下载任务进来,迅雷把文件平分红10份,而后开10个线程分别下载。这时主界面是一个单独的线程,并不会由于下载文件而卡死。并且主线程能够控制下属线程,好比某个线程下载缓慢甚至中止,主线程能够把它强行关掉并重启另一个线程。

另外就是一些程序的打印功能,好比记事本、Adobe Reader,打印的时候就只能打印,没法在主界面进行操做,而Word就有“后台打印”的功能,点了打印命令以后,还能够回到主界面进行修改、保存等操做。

另外多线程除了并行完成一些任务之外,还有生产者-消费者模式。好比Windows命令行下在某个硬盘根目录执行一个"dir/s | more"命令,前一条显示硬盘里的全部文件,要执行好久才能执行得完,后面那条命令会把前面命令的输出分屏显示出来。可是执行整条命令时,会马上有显示,也就是说,前面一条命令输出满一页内容到缓冲区,more命令就把缓冲区封死了,等用户敲了一个键显示下一屏的时候,more命令把缓冲区的内容取出并清空,前面的命令才能输出下一屏到缓冲区。这样的多线程使得整条命令不用等待前面的命令所有执行完才能执行下一条命令。

多线程和多进程的区别。日常指的多进程是操做系统下同时运行多个进程,好比Word和Excel同时打开,而且能够并行地同时执行一些操做。这种多进程和多线程没什么比如较的。能够比较的是同一个程序里的多线程和多进程。 多线程由于在同一个进程里,因此能够共享内存和其余资源,好比迅雷里10个线程一齐下载一个文件,这个文件是由进程打开的,而后10个线程均可以往里写入东西。若是是10个进程就不行了,操做系统不容许一个文件由两个进程同时写入。另外,Chrome就是一个典型的多进程程序,里面每一个标签页、扩展、插件都是单独的进程,各自独占资源,相互隔离,一个进程出错死掉只会影响一个页面或者插件,不再会出现Flash插件出错崩溃致使整个浏览器崩溃的状况了。
相关文章
相关标签/搜索