在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程。但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行。因此线程被引入操作系统。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?
进程的局限性:
1、在操作系统中,进程的引入提高了计算机资源的利用效率。但在进一步提高进程的并发性时,人们发现进程之间的切换占得比重越来越大。
2、现在的cpu基本都是多核的,而传统的进程不能很好的利用多处理器,因为一个进程在某个时刻只能使用一个处理器。
3、进程间的通信效率受到限制。
引入线程就是为了减小上下文切换的开销、更好的支持多处理器从而达到最大限度的并行、并简化进程间的通信。所以线程就是进程内一个相对独立的、可调度的执行单元,有时,也称为轻量级进程。
多线程程式作为一种多任务、并发的工作方式,有以下的长处:
1、 提高应用程式响应。这对图像界面的程式尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,
此时程式不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,
能够避免这种尴尬的情况。
2、使多CPU系统更加有效。操作系统会确保当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
3、改善程式结构。一个既长又复杂的进程能够考虑分为多个线程,成为几个单独或半单独的运行部分,这样的程式会利于理解和修改。
在现在的编程模式中我们经常为了提高程序运行效率而使用多线程去执行业务,其实在多线程的进程中,每个线程轮流使用CPU,因此实际上线程并不是并行的。比方说一个人要吃掉两个馒头,他可以先吃掉一个,然后再吃掉另一个;他也可以把两个馒头轮流吃。这两种方式其实在总时间上是没有任何减少的,甚至还增加了切换的时间。
从CPU角度线程并无法提升性能,但如果某些线程涉及到等待资源(比如IO,等待输入)时,多线程允许进程中的其它线程继续执行而不是整个进程被阻塞,因此提高了CPU的利用率,从这个角度会提升性能。而且在多CPU或多核的情况下,使用线程不仅仅在宏观上并行,在微观上也是并行的。这也是多线程编程会提高效率的原因。
下面是进程与线程的对比
进程 | 线程 | |
调度 | 进程中可能有多个线程,一个线程的阻塞并不影响整个进程,进程中的其他线程仍然可以参与调度运行 | -- |
并发性 | 进程间可并发 | 同一进程中的线程可并发 |
拥有资源 | 拥有资源,进程中有挂起操作 | 不拥有资源,没有权利决定进程或自己从主存撤出 |
系统开销 | 开销大,数量越多越明显 | 开销小 |
地址空间和其他资源 | 进程间相互独立 | 同一进程中的所有线程共享,不同进程的线程相互不可见 |
通信 | 通过IPC通信 | 可直接读写进程数据段(如全局变量),但需要同步和互斥等手段保持数据一致性 |
本文参考
http://developer.51cto.com/art/201205/334068.htm
http://www.cnblogs.com/hjslovewcl/archive/2011/02/24/2314347.html