为什么要引入线程?线程为什么能弥补进程的缺点


首先我们需要明白,线程与进程一样,线程和进程会被os统一调度,所以所有的线程和进程都是一起并发运行的,如果线程不是并发的,是不可能实现程序的多线任务的。
有了线程以后,凡是程序涉及到多线任务时,都使用多线程来实现,使用多线程来实现时,线程间的切换和数据通信的开销非常低,正因为开销非常低,因此线程还有另一个名称,叫”轻量级的进程“。
总结的讲,说白了线程就是为了多线任务而生的,多线程的多线二字,不就是多线任务的多线二字吗。
疑问:使用线程来实现时,线程也需要切换和通信,这不跟进程一样吗?为什么线程就能降低切换和通信的开销呢?

为什么线程切换的开销很低

使用多进程来实现程序的多线任务,多线并发运行时,涉及到的是进程间的切换,我们前面就说过,进程间切换时开销非常大。
但是使用多线程来实现多线任务,由于线程本质上它只是程序(进程)的一个函数,只不过线程函数与普通函数的区别是,普通函数时单线的运行关系,而线程函数被注册为线程后,是多线并发运行,如图所示。
普通函数与线程函数
对于普通函数来说,只有当相互调动时才会涉及函数间的切换,但是对于线程函数来说,只要运行的时间片到了就会切换,但是不管是那种函数间的切换,进程自己函数的切换只是进程内部的事情,不涉及进程间切换,函数切换当然也需要开销,但是这些开销相比进程间就省去了进程间切换的巨大开销。
当然如果是不同进程的线程之间需要切换的话,还是会涉及到进程间的切换的,但是不管怎么说,线程的出现,至少为程序内部多线任务之间的切换,省去了大笔的进程切换所导致“资源开销”。

为什么线程间数据通信的开销很低

线程的本质就是函数,请问大家函数之间如果想要数据共享(通信)的话,应该怎么办?
函数间通信有两种方式:
(1)具有相互调用关系函数来说
使用函数传参来通信。
(2)对于没有调用关系的函数来说
使用全局变量来通信。
A函数一一>全变变量一一>B函数
所以说全局变量的作用是什么?
就是用来实现无调用关系的函数间通信的。进程中所有的线程函数除了相互并发运行外,没有调用关系,所以线程函数间想要数据共享的话,就使用全局变量来通信。

从这里可以看出,进程内部的线程间进行数据共享非常容易,使用全局变量即可,根本不需要调用什么os提供的通信机制,所以线程间通信的开销自然就非常的低。
进程间的通信需要调用操作系统提供的相关函数,这些函数运行需要开销。

那么疑问来了,线程切换就不需要开销吗?
刚说过,线程的切换其实就是函数间的切换(保存函数状态在栈中),切换的开销来说,已经非常小了。

是不是有了线程后,进程是不是就不需要了

线程是不可能完全替代掉进程的,只有在多线任务时会替代进程,但是运行新程序时,还是必须通过创建子进程来实现
通过前面的讲解,我们知道线程的本质是函数,函数运行需要内存空间,这个内存空间怎么来,事实上线程所需内存空间就是进程的内存空间,因此线程的运行时依赖于进程,如果没有进程所提供的内存空间这个资源,线程根本无法运行
换句话说,线程作为函数,只是进程的一个部分而己,线程是不可能脱离进程而独立存在。
所以同一个进程中的所有线程,都是运行在进程空间中的,换句话说同一个进程中所有线程共享相同的进程空间。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM