go语言中线程和进程的区别有哪些


这篇文章主要介绍“go语言中线程和进程的区别有哪些”,在日常操作中,相信很多人在go语言中线程和进程的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言中线程和进程的区别有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 区别:1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。3、线程上下文切换比进程上下文切换要快得多。4、进程切换需要的资源很最大,效率很低;线程切换需要的资源一般,效率一般。5、进程拥有自己的堆栈,进程之间不共享堆栈;线程拥有自己的栈,共享堆。进程是一个具有一定独立功能的程序在一个数据上的一次动态执行过程是操作系统进行资源分配和调度的一个独立单位是应用程序的运行的载体线程线程是程序执行中一个单一的顺序控制流程是程序执行流的最小单位是处理器调度和分配的基本单位一个进程可以有一个或多个线程各个线程之间共享程序的内存空间大部分操作系统(Windows、Linux)的任务调度采用时间片轮转的抢占式调度方式
该调度方式如下:在一个进程中,当一个线程任务执行几毫秒后,会由操作系统内核进行调度通过硬件的计数器中断处理器,让该线程强制暂停并将该线程的寄存器放入内存中通过查看线程列表决定接下来执行哪一个线程然后从内存中恢复该线程的寄存器,最后恢复该线程的执行,从而去执行下一个任务这种方式保证了每个线程轮流执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换免费云主机域名,给人的感觉就是多个任务在同时进行,这就是我们说的并发。线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线线程上下文切换比进程上下文切换要快得多进程切换需要的资源很最大,效率很低;线程切换需要的资源一般,效率一般。进程拥有自己的堆栈,进程之间不共享堆栈,由操作系统调度线程拥有自己的栈,共享堆,也是由操作系统调度多核处理器是指在一个处理器上集成了多个运算核心从而提高计算能力。也就是有多个真正并行计算的处理核心,每一个处理核心对应一个内核线程。内核线程每一个处理核心对应一个内核线程。
比如:单核处理器对应一个内核线程双核处理器对应两个内核线程四核处理器对应四个内核线程内核线程(Kernel Thread,KLT)就是直接由操作系统内核支持的线程。该线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。目前处理器都采用了超线程技术将一个 物理处理核心模拟成两个逻辑处理核心,也就是两个内核线程。
所以我们看到的电脑一般都是双核四线程、四核八线程。
在操作系统中我们看到CPU数量是实际物理CPU数量的两倍,如双核四线程可以看到4CPU。如我当前编写文章的这台mbp就是i7 6核12线程:程序一般不会直接使用内核线程,而是使用内核线程的一种高级接口—轻量级进程(Lightweight Process,LWP),也就是我们常说的线程。协程(Coroutines)基于线程之上,比线程更加轻量级。一个线程可以拥有多个协程。协程的目的传统应用中一般有会给网络请求创建一个线程去完成业务逻辑。如果是多个请求,就会创建多个线程来出来。
如果遇到很耗时的I/O行为,线程就会一直处于阻塞状态,如果很多线程都是出于这种空闲状态(等待该线程执行完成才能执行),这样就会造成资源应用不彻底,系统的吞吐能力下降。最常见的很耗时的I/O行为比如JDBC,CPU会一直等待数据I/O操作的返回,这时线程根本没有利用CPU去做运算,而是处于空闲状态。同时使用过多的线程,也会带来更多的上下文切换开销。解决上述问题有两个方案:单线程加上异步回调
比如Node.js、Java的Vert.x协程
协程的目的就是当出现长时间I/O操作时,让出当前的协程调度,执行下一个任务,来消除ContexSwith的开销协程的特点线程切换由操作系统负责调度,协程由用户自己调度,因此减少了上下文切换,提高了效率线程默认Stack大小为1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程由于协程在同一线程上,因此可以避免竞争关系二使用锁适用于被阻塞且需要大量并发的场景。但不适用于大量计算的多线程协程的原理协程的流程:当出现I/O阻塞的时候,由协程的调度器进行调度通过将数据流立刻yield掉(主动让出),并记录当前栈上的数据阻塞完成后立刻在通过线程恢复栈,并把阻塞的结果放到这个线程上去跑而跑在由Coroutine负责调度的线程称为Fiber,比如Golang里的go关键字其实就是负责开启一个Fiber,让func逻辑跑在上面。由于协程的暂停完全由程序控制,发生在用户态上;而线程的阻塞状态是由操作系统内核来进行切换,发生在内核态上。
因此协程的开销远远小于线程,也就没有上下文切换的开销。到此,关于“go语言中线程和进程的区别有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: Laravel应用程序中怎么使用模型工厂

本文小编为大家详细介绍“Laravel应用程序中怎么使用模型工厂”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel应用程序中怎么使用模型工厂”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Laravel 模型工厂是你可以在…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/02 19:36
下一篇 03/02 19:39

相关推荐