← 返回目录

进程、线程的区别

第 11 / 29 卷日期:

进程、线程的区别

调度:进程是资源管理的基本单位,线程是程序执行的基本单位。

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

拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。

系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,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. 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
  2. 2Go string 和 []byte 的区别
  3. 3数组和切片的区别
  4. 4扩容前后的Slice是一样的吗
  5. 5Go语言map是有序的还是无序的, 为什么
  6. 6go里面的map是并发安全的吗?如何并发安全
  7. 7Go 的错误处理和 Java 的异常处理对比
  8. 8介绍一下panic和recover
  9. 9什么是defer?有什么作用
  10. 10Go并发
  11. 11进程、线程的区别
  12. 12什么是go runtine
  13. 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
  14. 14什么是互斥锁(mutex)?在什么情况下会用到它们?
  15. 15Mutex有几种模式
  16. 16goroutine什么情况会发生内存泄漏?如何避免。
  17. 17Go语言中GC的流程是什么
  18. 18Go 中的内存逃逸现象是什么?
  19. 19CAP 理论,为什么不能同时满足
  20. 20说一下 Gin 的路由怎么实现的
  21. 21简述slice的底层原理,和数组的区别是什么
  22. 22defer底层原理
  23. 23侵入式和非侵入式的区别
  24. 24goroutine与线程的区别
  25. 25goroutine在什么情况下会被挂起呢?
  26. 26GC(垃圾回收)原理 1.5版本
  27. 27简述Go的垃圾回收机制
  28. 28协程优势及其通信方式
  29. 29Go的内存对齐