为什么要引⼊线程?线程为什么能弥补进程的缺点
⾸先我们需要明⽩,线程与进程⼀样,线程和进程会被os统⼀调度,所以所有的线程和进程都是⼀起并发运⾏的,如果线程不是并发的,是不可能实现程序的多线任务的。
有了线程以后,凡是程序涉及到多线任务时,都使⽤多线程来实现,使⽤多线程来实现时,线程间的切换和数据通信的开销⾮常低,正因为开销⾮常低,因此线程还有另⼀个名称,叫”轻量级的进程“。
总结的讲,说⽩了线程就是为了多线任务⽽⽣的,多线程的多线⼆字,不就是多线任务的多线⼆字吗。
疑问:使⽤线程来实现时,线程也需要切换和通信,这不跟进程⼀样吗?为什么线程就能降低切换和通信的开销呢?
为什么线程切换的开销很低
使⽤多进程来实现程序的多线任务,多线并发运⾏时,涉及到的是进程间的切换,我们前⾯就说过,进程间切换时开销⾮常⼤。
但是使⽤多线程来实现多线任务,由于线程本质上它只是程序(进程)的⼀个函数,只不过线程函数与普通函数的区别是,普通函数时单线的运⾏关系,⽽线程函数被注册为线程后,是多线并发运⾏,如图所⽰。
对于普通函数来说,只有当相互调动时才会涉及函数间的切换,但是对于线程函数来说,只要运⾏的时间⽚到了就会切换,但是不管是那种函数间的切换,进程⾃⼰函数的切换只是进程内部的事情,不涉及进程间切换,函数切换当然也需要开销,但是这些开销相⽐进程间就省去了进程间切换的巨⼤开销。
当然如果是不同进程的线程之间需要切换的话,还是会涉及到进程间的切换的,但是不管怎么说,线程的出现,⾄少为程序内部多线任务之间的切换,省去了⼤笔的进程切换所导致“资源开销”。
为什么线程间数据通信的开销很低
线程的本质就是函数,请问⼤家函数之间如果想要数据共享(通信)的话,应该怎么办?
函数间通信有两种⽅式:
(1)具有相互调⽤关系函数来说
使⽤函数传参来通信。
(2)对于没有调⽤关系的函数来说
使⽤全局变量来通信。
A函数⼀⼀>全变变量⼀⼀>B函数
所以说全局变量的作⽤是什么?
就是⽤来实现⽆调⽤关系的函数间通信的。进程中所有的线程函数除了相互并发运⾏外,没有调⽤关系,所以线程函数间想要数据共享的话,就使⽤全局变量来通信。
从这⾥可以看出,进程内部的线程间进⾏数据共享⾮常容易,使⽤全局变量即可,根本不需要调⽤什么os提供的通信机制,所以线程间通信的开销⾃然就⾮常的低。
进程间的通信需要调⽤操作系统提供的相关函数,这些函数运⾏需要开销。
那么疑问来了,线程切换就不需要开销吗?
刚说过,线程的切换其实就是函数间的切换(保存函数状态在栈中),切换的开销来说,已经⾮常⼩了。
是不是有了线程后,进程是不是就不需要了进程间通信和线程间通信的区别
线程是不可能完全替代掉进程的,只有在多线任务时会替代进程,但是运⾏新程序时,还是必须通过创建⼦进程来实现。
通过前⾯的讲解,我们知道线程的本质是函数,函数运⾏需要内存空间,这个内存空间怎么来,事实上线程所需内存空间就是进程的内存空间,因此线程的运⾏时依赖于进程,如果没有进程所提供的内存空间这个资源,线程根本⽆法运⾏。
换句话说,线程作为函数,只是进程的⼀个部分⽽⼰,线程是不可能脱离进程⽽独⽴存在。
所以同⼀个进程中的所有线程,都是运⾏在进程空间中的,换句话说同⼀个进程中所有线程共享相同的进程空间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论