返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >go语言中线程和进程的区别是什么
  • 913
分享到

go语言中线程和进程的区别是什么

go语言Golang 2023-05-14 20:05:56 913人浏览 薄情痞子
摘要

区别:1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。3、线程上下文切换比进程上下文切换要快得多。4、进程切换需要的资源很最大,效率很低;线程切换需要的

区别:1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。3、线程上下文切换比进程上下文切换要快得多。4、进程切换需要的资源很最大,效率很低;线程切换需要的资源一般,效率一般。5、进程拥有自己的堆栈,进程之间不共享堆栈;线程拥有自己的栈,共享堆。

go语言中线程和进程的区别是什么

教程操作环境:windows7系统、Go 1.18版本、Dell G3电脑。

什么是线程、进程?

进程

  • 是一个具有一定独立功能的程序在一个数据集上的一次动态执行过程
  • 是操作系统进行资源分配和调度的一个独立单位
  • 是应用程序的运行的载体

线程

  • 线程是程序执行中一个单一的顺序控制流程
  • 是程序执行流的最小单位
  • 是处理器调度和分配的基本单位
  • 一个进程可以有一个或多个线程
  • 各个线程之间共享程序的内存空间

任务调度

大部分操作系统(Windows、linux)的任务调度采用时间片轮转的抢占式调度方式
该调度方式如下:

  • 在一个进程中,当一个线程任务执行几毫秒后,会由操作系统内核进行调度

  • 通过硬件的计数器中断处理器,让该线程强制暂停并将该线程的寄存器放入内存中

  • 通过查看线程列表决定接下来执行哪一个线程

  • 然后从内存中恢复该线程的寄存器,最后恢复该线程的执行,从而去执行下一个任务

这种方式保证了每个线程轮流执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在同时进行,这就是我们说的并发

1.png

进程和线程的区别

  • 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位

  • 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线

  • 线程上下文切换比进程上下文切换要快得多

  • 进程切换需要的资源很最大,效率很低;线程切换需要的资源一般,效率一般。

  • 进程拥有自己的堆栈,进程之间不共享堆栈,由操作系统调度

    线程拥有自己的栈,共享堆,也是由操作系统调度

多线程和多核

多核处理器是指在一个处理器上集成了多个运算核心从而提高计算能力。也就是有多个真正并行计算的处理核心,每一个处理核心对应一个内核线程。

内核线程

每一个处理核心对应一个内核线程。
比如:

  • 单核处理器对应一个内核线程
  • 双核处理器对应两个内核线程
  • 四核处理器对应四个内核线程

内核线程(Kernel Thread,KLT)就是直接由操作系统内核支持的线程。该线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。

超线程技术

目前处理器都采用了超线程技术将一个 物理处理核心模拟成两个逻辑处理核心,也就是两个内核线程。
所以我们看到的电脑一般都是双核四线程、四核八线程。
在操作系统中我们看到CPU数量是实际物理CPU数量的两倍,如双核四线程可以看到4CPU。

如我当前编写文章的这台mbp就是i7 6核12线程:

2.png

程序一般不会直接使用内核线程,而是使用内核线程的一种高级接口—轻量级进程(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逻辑跑在上面。

由于协程的暂停完全由程序控制,发生在用户态上;而线程的阻塞状态是由操作系统内核来进行切换,发生在内核态上。
因此协程的开销远远小于线程,也就没有上下文切换的开销。

线程和协程的比较

比较项线程协程
占用资源初始单位为1MB,固定不可变初始一般为2KB,可随需要增大
调度所属有OS内核完成由用户完成
切换开销设计模式切换(从用户态切换到内核态),16个寄存器、PC、SP等寄存器的刷新只有三个寄存器的值修改:PC、SP、DX
性能问题资源占用太高,频繁创建销毁会带来严重的性能问题资源占用小,不会带来严重的性能问题
数据同步需要锁等机制确保数据的一致性和可见性不需要多线程的锁机制,因此只有一个线程。也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比线程高很多

【相关推荐:Go视频教程、编程教学】

以上就是go语言中线程和进程的区别是什么的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: go语言中线程和进程的区别是什么

本文链接: https://lsjlt.com/news/203476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go语言中线程和进程的区别是什么
    区别:1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。3、线程上下文切换比进程上下文切换要快得多。4、进程切换需要的资源很最大,效率很低;线程切换需要的...
    99+
    2023-05-14
    go语言 Golang
  • Go语言中线程和进程的区别解析
    go 语言中的进程和线程:进程:独立运行的程序实例,拥有自己的资源和地址空间。线程:进程内的执行单元,共享进程资源和地址空间。特点:进程:开销大,隔离性好,独立调度。线程:开销小,共享资...
    99+
    2024-04-03
    进程 线程 go语言 同步机制
  • go语言中线程和进程的区别有哪些
    这篇文章主要介绍“go语言中线程和进程的区别有哪些”,在日常操作中,相信很多人在go语言中线程和进程的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言中线程和进程的区别有哪些”的疑惑有所帮助!...
    99+
    2023-07-04
  • go语言中协程与线程的区别是什么
    区别:1、一个线程可以多个协程,一个进程也可以单独拥有多个协程;2、线程是同步机制,而协程则是异步;3、协程能保留上一次调用时的状态,线程不行;4、线程是抢占式,协程是非抢占式的;5、线程是被分割的CPU资源,协程是组织好的代码流程,协程需...
    99+
    2023-05-14
    Golang go语言 协程 线程
  • 线程和进程的区别是什么
    线程和进程的区别:1、线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小;2、进程相对独立,需要通过显式机制进行通信,切换开销较大;而线程的管理更为灵活,进程的管理相对复杂。线程和进程是操作系统中...
    99+
    2023-08-10
  • 深入探讨Go语言线程与进程的区别
    go 语言中,线程与进程的主要区别在于:内存空间:线程共享进程的内存空间,而进程拥有自己的独立内存空间。重量级:线程重量级较轻,进程重量级较重。操作系统管理:进程受操作系统管理,线程不受...
    99+
    2024-04-04
    go语言 并发 golang
  • Java之进程和线程的区别是什么
    这篇文章主要介绍“Java之进程和线程的区别是什么”,在日常操作中,相信很多人在Java之进程和线程的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java之进程和线程的区别是什么”的疑惑有所帮助!...
    99+
    2023-07-05
  • Go中什么是协程,协程和线程的区别和联系
    在Go中,协程(Goroutine)是一种轻量级的线程,由Go运行时环境管理。协程是一种用户态的线程,不需要操作系统的线程支持。在G...
    99+
    2023-09-23
    Go
  • go语言和java的区别是什么
    本篇内容主要讲解“go语言和java的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言和java的区别是什么”吧!区别:1、Go不允许函数重载,java允许;2、Java默认允许...
    99+
    2023-07-04
  • go协程和线程有什么区别
    Go协程和线程是两种并发执行的机制,它们有以下几个主要区别:1. 调度器:Go协程由Go语言的运行时调度器(Goroutine Sc...
    99+
    2023-10-20
    go
  • go语言中协程与线程的区别有哪些
    这篇文章主要介绍“go语言中协程与线程的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言中协程与线程的区别有哪些”文章能帮助大家解决问题。区别:1、一个线程可以多个协程,一个进程也可...
    99+
    2023-07-05
  • java进程、线程、纤程的区别是什么
    本篇内容主要讲解“java进程、线程、纤程的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java进程、线程、纤程的区别是什么”吧!在Java 中,这些短小的代码段一般会被放入一个cl...
    99+
    2023-06-16
  • android进程和线程有什么区别
    Android进程和线程是两个概念,它们有以下区别:1. 定义:进程是程序的执行实例,是操作系统对程序的一种抽象;线程是进程中的一个...
    99+
    2023-09-23
    android
  • Python中的多进程编程和多线程编程的区别是什么?
    Python中的多进程编程和多线程编程的区别是什么?在Python中,多进程编程和多线程编程都是实现并行计算的方法。虽然它们都能同时运行多个任务,但其底层原理和使用方式却有所不同。多进程编程是利用操作系统的多进程机制来实现并行计算的。在Py...
    99+
    2023-10-22
    多进程编程 多线程编程 区别
  • 探秘Go语言中线程和进程的差异
    线程和进程是 go 语言并发编程中的不同概念。线程是轻量级执行单元,共享进程资源,而进程是独立运行的程序实例,拥有自己的资源空间。线程创建和切换开销低,而进程更高。线程共享主线程上下文,...
    99+
    2024-04-04
    进程 线程 go语言
  • 理解Go语言中线程和进程的异同
    理解 go 语言中的线程与进程:线程是进程中的轻量级执行单元,共享相同内存;进程是操作系统执行单元,拥有独立资源和隔离性。进程优势:隔离性、简单 ipc;劣势:高开销、特殊内存共享处理。...
    99+
    2024-04-03
    进程 线程 go语言
  • Go语言中Print、Printf和Println的区别是什么
    今天小编给大家分享一下Go语言中Print、Printf和Println的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-07-05
  • Python中多线程、多进程、协程的区别是什么
    今天就跟大家聊聊有关Python中多线程、多进程、协程的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代...
    99+
    2023-06-16
  • Java编程语言中sleep()和yield()的区别是什么
    这篇文章主要讲解了“Java编程语言中sleep()和yield()的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java编程语言中sleep()和yield()的区别是什么”吧...
    99+
    2023-06-17
  • 什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
    文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable ...
    99+
    2023-08-19
    java JavaEE 多线程 进程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作