当前位置: 首页 > news >正文

go语言八股

1、参考csdn博客
2、Go高质量面试题

1、进程、线程、协程

进程:

process
进程是资源分配的基本单位,包括内存、文件描述符等。是计算机运行程序的一个独立单位。每个进程具有自己独立的内存空间,进程之间不能直接访问彼此的数据。

线程:

thread
cpu调度的基本单位,一个进程可以包含多个线程,线程除了有一些自己的必要的堆栈空间之外,其他资源都是共享线程中的,共享的资源包括:

  • 所有线程共享相同的虚拟地址空间,即它们可以访问同样的代码段、数据段和堆栈段
  • 文件描述符:进程打开的文件描述符进程级别的资源,所以同一个进程中的线程可以共享打开的文件描述符,意味着它们可以同时读写同一个文件
  • 全局变量:全局变量是进程级别的变量,可被同一个进程中的所有线程访问和修改
  • 静态变量:静态变量也是进程级别的变量,在同一个进程中的线程之间共享内存空间
  • 进程id、进程组id

独占的资源:

  • 线程id
  • 寄存器组的值
  • 线程堆栈
  • 错误返回码
  • 信号屏蔽码
  • 线程的优先级

协程:

用户态的线程,可以通过用户程序创建、删除。协程切换时不需要切换内核态 ,上下文切换的开销比线程和进程更小。协程是用户态的轻量级线程,允许在程序中执行非阻塞操作。

协程与线程的区别

  • 线程是操作系统的概念,而协程是程序级的概念。线程由操作系统调度执行,每个线程都有自己的执行上下文,包括程序计数器、寄存器等。而协程由程序自身控制。
  • 多个线程之间通过切换执行的方式实现并发。线程切换时需要保存和恢复上下文,涉及到上下文切换的开销。而协程切换时不需要操作系统的介入,只需保存和恢复自身的上下文,切换开销较小。
  • 线程是抢占式的并发,即操作系统可以随时剥夺一个线程的执行权。而协程是合作式的并发,协程的执行权由程序自身决定,只有当协程主动让出执行权时,其他协程才会得到执行机会。

线程的优点:

  • 创建一个新线程的代价要比创建一个新进程小的多
  • 线程之间的切换相较于进程之间的切换需要操作系统做的工作很少
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量

线程的缺点

共享内存带来的安全性问题、缺乏隔离性、复杂的同步机制、调试困难等

有栈协程和无栈协程

  • 有栈协程为每个协程分配独立的堆栈。同一协程的局部变量存储在这个堆栈上。切换协程时,需要保存当前协程的堆栈上下文,恢复目标协程的堆栈上下文。这意味着在切换时需要一定的开销(保存和恢复堆栈信息),但不涉及操作系统内核。Go语言中的有栈协程:goroutines
  • 无栈协程不为每个协程单独分配堆栈,而是将局部变量和协程状态保存在共享的堆中。切换时通过某种状态机制进行,而无需显式的上下文切换。JavaScript中的无栈协程async/await,用于异步编程,状态机来管理,await中断当前执行,把上下文存储在公共内存中,后续某个点时继续。

Go语言–垃圾回收

GC-垃圾回收-Garbage Collection
在这里插入图片描述

Go v1.3之前的标记-清除

1、暂停业务逻辑,找到不可达的对象,和可达对象
2、开始标记,程序找出它所有可达的对象,并做上标记
3、标记完了之后,然后开始清除未标记的对象
4、停止暂停,让程序继续跑。然后循环重复这个过程,直到process程序生命周期结束

标记-清除的缺点:

1、STW(stop the world):在标记和清除过程中,程序会暂停所有的正常执行操作,对于实时系统会出现短暂的应用卡顿
2、标记需要扫描整个heap(堆,内存空间),查看每一个对象是否仍可被程序引用,在大型应用程序中,这个过程可能会耗费大量时间资源
3、清除数据会产生heap碎片:在清除阶段,已标记为无需保留的对象会被去掉,留下的不连续的内存空间称为碎片。如果堆中碎片过多,可能造成内存分配效率低,尤其是下一次需要分配大块内存时。
为了减少STW的时间,对“标记-清除”中的第三步和第四步进行了替换。

Go v1.5 三色标记法

  • **白色:**未被访问的对象
  • 灰色:已被访问但其引用尚未被完全扫描的对象
  • 黑色:已被访问且其所有引用都已被扫描的对象

1、把新创建的对象,默认的颜色都标记为“白色”
在这里插入图片描述
2、每次GC回收开始,然后从根节点开始遍历所有对象,把遍历到的对象从白色集合放入“灰色”集合
在这里插入图片描述
3、遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入到黑色集合

在这里插入图片描述
4、重复第三步,直到灰色无任何对象
在这里插入图片描述
在这里插入图片描述
5、回收所有的白色标记的对象,回收垃圾

三色标记法不采用STW时可能出现的问题:

需同时满足如下条件:
1、白色对象被黑色对象引用
如果在标记期间,程序动态地创建了指向白色对象的新引用,而白色对象被黑色对象引用,可能没有被标记为灰色,这个白色对象就不被视为可达对象,从而可能错误地被回收
2、灰色对象对白色对象的引用丢失
一个仍然存在的对象但因引用关系错变而被错误地标记为白色,进而被回收的错误
在这里插入图片描述
这两种情况同时满足,会出现对象丢失

强三色不变式

  • 定义:黑色对象不能直接引用白色对象,只能通过灰色对象间接引用白色对象
  • 本质:保证了黑色对象和白色对象之间必须有灰色对象作为“中间人”

弱三色不变式

  • 定义:所有被黑色对象引用的白色对象,必须直接或间接地被某个灰色对象引用
  • 本质:保证了从根对象出发,能够访问所有活跃的对象
http://www.dtcms.com/a/290537.html

相关文章:

  • MySQL(149)如何进行数据清洗?
  • 09_Spring Boot 整合 Freemarker 模板引擎的坑
  • 【C++】stack和queue拓展学习
  • 库卡气体保护焊机器人省气的方法
  • Mac上安装Homebrew的详细步骤
  • 【CNN】卷积神经网络池化- part2
  • Pytorch01:深度学习中的专业名词及基本介绍
  • 有关Maven的个人笔记总结
  • Zetane:让深度学习不再抽象,一键3D可视化
  • SpringSecurity 详细介绍(认证和授权)
  • 直播专用域名租用全解析:开启直播新境界
  • 板凳-------Mysql cookbook学习 (十二--------3_2)
  • 基于 STM32 的数字闹钟系统 Proteus 仿真设计与实现
  • ASP .NET Core 8高效集成Redis缓存实战
  • C++中的deque容器
  • C#/.NET/.NET Core技术前沿周刊 | 第 47 期(2025年7.14-7.20)
  • 解决vscode中vue格式化后缩进太小的问题,并去除分号 - 设置Vetur tabSize从2到4,设置prettier取消分号semi
  • Hyperledger Fabric V2.5 生产环境部署及安装Java智能合约
  • 从0开始学习R语言--Day53--AFT模型
  • 什么是“差分“?
  • WebkitSpeechRecognition 语音识别
  • 【备忘录】Ubuntu 配置虚拟显示器
  • 嵌入式学习-土堆目标检测(1)-day26
  • 每日数据推荐:一线城市基于手机信令的职住数据
  • 主流监控设备RTSP地址
  • 从env到mm_struct:环境变量与虚拟内存的底层实现
  • Linux 任务调度在进程管理中的关系和运行机制
  • STM32键盘带蓝牙功能
  • 时空数据可视化新范式:基于Three.js的生产全流程时间轴回溯技术解析
  • 首家!数巅AskBI通过中国信通院数据分析智能体专项测试