进程、线程的区别
进程、线程的区别
调度:进程是资源管理的基本单位,线程是程序执行的基本单位。
切换:线程上下文切换比进程上下文切换要快得多。
拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O 设备等,OS 所付出的开销显著大于在创建或撤销线程时的开销,进程切换的开销也远大于线程切换的开销。
协程和线程的区别
线程和进程都是同步机制,而协程是异步机制。
线程是抢占式,而协程是非抢占式的。需要用户释放使用权切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
一个线程可以有多个协程,一个进程也可以有多个协程。
协程不被操作系统内核管理,而完全是由程序控制。线程是被分割的CPU资源,协程是组织好的代码流程,线程是协程的资源。但协程不会直接使用线程,协程直接利用的是执行器关联任意线程或线程池。
协程能保留上一次调用时的状态。
并行和并发的区别
并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。单核处理器可以做到并发。比如有两个进程 A 和 B,A 运行一个时间片之后,切换到 B,B 运行一个时间片之后又切换到 A。因为切
换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。
并行就是在同一时刻,有多个任务在执行。这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。
Go语言并发模型
Go语言的并发模型建立在goroutine和channel之上。其设计理念是共享数据通过通信而不是通过共享来实现
Goroutines 是Go中的轻量级线程,由Go运行时(runtime)管理。与传统线程相比,goroutines的创建和销毁开销很小。程序可以同时运行多个goroutines,它们共享相同的地址空间。
Goroutines之间的通信通过channel(通道)实现。通道提供了一种安全、同步的方式,用于在goroutines之间传递数据。使用通道可以避免多个goroutines同时访问共享数据而导致竞态条件的问题。
多路复用:select 语句允许在多个通道操作中选择一个执行。这种方式可以有效地处理多个通道的并发操作,避免了阻塞。
互斥锁和条件变量
Go提供了sync包,其中包括 Mutex(互斥锁)等同步原语,用于在多个goroutines之间进行互斥访问共享资源。
sync 包还提供了 Cond(条件变量),用于在goroutines之间建立更复杂的同步。
原子操作: Go提供了sync/atomic包,其中包括一系列原子性操作,用于在不使用锁的情况下进行安全的并发操作。
全站分卷索引 · 29 卷
- 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
- 2Go string 和 []byte 的区别
- 3数组和切片的区别
- 4扩容前后的Slice是一样的吗
- 5Go语言map是有序的还是无序的, 为什么
- 6go里面的map是并发安全的吗?如何并发安全
- 7Go 的错误处理和 Java 的异常处理对比
- 8介绍一下panic和recover
- 9什么是defer?有什么作用
- 10Go并发
- 11进程、线程的区别
- 12什么是go runtine
- 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
- 14什么是互斥锁(mutex)?在什么情况下会用到它们?
- 15Mutex有几种模式
- 16goroutine什么情况会发生内存泄漏?如何避免。
- 17Go语言中GC的流程是什么
- 18Go 中的内存逃逸现象是什么?
- 19CAP 理论,为什么不能同时满足
- 20说一下 Gin 的路由怎么实现的
- 21简述slice的底层原理,和数组的区别是什么
- 22defer底层原理
- 23侵入式和非侵入式的区别
- 24goroutine与线程的区别
- 25goroutine在什么情况下会被挂起呢?
- 26GC(垃圾回收)原理 1.5版本
- 27简述Go的垃圾回收机制
- 28协程优势及其通信方式
- 29Go的内存对齐