首页 > 其他分享 >Go面试专题(一)

Go面试专题(一)

时间:2024-05-29 18:45:45浏览次数:18  
标签:专题 并发 对象 标记 面试 屏障 GC Go

1 选择go的原因?

  • 简单性
    Go语言的语法简洁清晰,没有过多的封装和继承机制,学习和使用门槛较低。
  • 高并发
    Go语言从语言层面原生支持并发,通过goroutine和channel实现并发编程,比如Web服务器可以轻松处理大量并发连接。
  • 高性能
    Go程序接近机器码运行,甚至有些情况下性能可以与C程序相媻,而开发效率又高于C/C++。GC(垃圾回收)简单高效。
  • 静态链接
    Go编译后生成的是单个静态链接的二进制文件,方便部署,跨平台也更简单。
  • 标准库
    Go语言自带了很多强大的标准库,网络编程、并发编程、编码解码等功能一应俱全。

与Java相比,Go语言的性能更出色,对并发支持更好。同时Go没有像Java那样庞大的类库和复杂的语法,更注重语法的简洁和可读性。

但Java在企业级应用、成熟的框架和庞大的资源库上仍占有优势,生态更为完善。

总的来说,Go语言更适合编写底层系统编程、分布式系统、网络编程等对性能和并发性有较高要求的领域。

2 带GC的语言都有哪些,说一下Go语言的GC

有GC(垃圾回收)的编程语言有很多,比如Java、C#、Python、Ruby、Go等。其中比较流行和常用的语言有:

  1. Java
  2. C#
  3. Go
  4. Python
  5. Node.js(JavaScript)
  6. Ruby
  7. Scala
  8. Rust

Go的GC
变革

  1. Go V1.3的标记-清除(mark and sweep)法。
  2. Go V1.5的三色并发标记法。
  3. Go V1.5的强三色不变式、弱三色不变式、插入屏障、删除屏障。
  4. Go V1.8的混合写屏障机制。

Go语言使用了三色标记清除(Tri-Color Mark Sweep)算法进行垃圾回收。这是一种增量式的并发GC算法。

Go V1.5的三色并发标记法, 主要流程是:

  1. 启动STW
  2. 新创建的对象默认颜色是白色
  3. GC回收从根节点一次遍历所有对象,把遍历到的对象从白色集合放入灰色集合。
  4. 循环遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合,直到灰色中无任何对象
  5. 停止STW
  6. 回收所有的白色标记表的对象.也就是回收垃圾。

强三色不变式和弱三色不变式。
在三色标记法的过程中对象丢失,需要同时满足下面两个条件:

条件一:白色对象被黑色对象引用
强三色不变式
规则:不允许黑色对象引用白色对象

条件二:灰色对象与白色对象之间的可达关系遭到破坏
弱三色不变式
规则:黑色对象可以引用白色对象,但是白色对象的上游必须存在灰色对象

实现机制:插入写屏障和删除写屏障。

插入写屏障:
规则:当一个对象引用另外一个对象时,将另外一个对象标记为灰色。
满足:强三色不变式。不会存在黑色对象引用白色对象

插入屏障仅会在堆内存中生效,不对栈内存空间生效,这是因为go在并发运行时,大部分的操作都发生在栈上,函数调用会非常频繁。

删除写屏障
规则:在删除引用时,如果被删除引用的对象自身为灰色或者白色,那么被标记为灰色。
满足弱三色不变式。灰色对象到白色对象的路径不会断

对比插入写屏障和删除写屏障:

  • 插入写屏障:
  • 插入写屏障哪里都好,就是栈上的操作管不到,所以最后需要对栈空间进行stw保护,然后rescan保证引用的白色对象存活。
  • 删除写屏障:
  • 在GC开始时,会扫描记录整个栈做快照,从而在删除操作时,可以拦截操作,将白色对象置为灰色对象。
  • 回收精度低。

Go V1.8的混合写屏障机制。

混合写屏障的具体核心规则如下:

  1. GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),
  2. GC期间,任何在栈上创建的新对象,均为黑色。
  3. 被删除的对象标记为灰色。
  4. 被添加的对象标记为灰色。

GoV1.8三色标记法加混合写屏障机制,栈空间不启动屏障机制,堆空间启动屏障机制。整个过程几乎不需要STW,效率较高。

Go的GC有如下一些特点:

  • 并发的增量式GC,与应用程序并发运行
  • 对CPU开销控制良好,在20%以内
  • 自动调整GOGC值来控制内存占用
  • 避免在系统压力大时启动GC以防停顿时间过长
  • 避免内存碎片

总结

  • Golang v1.3之前采用传统采取标记-清除法,需要STW,暂停整个程序的运行。
  • 在v1.5版本中,引入了三色标记法和插入写屏障机制,其中插入写屏障机制只在堆内存中生效。但在标记过程中,最后需要对栈进行STW。
  • 在v1.8版本中结合删除写屏障机制,推出了混合屏障机制,屏障限制只在堆内存中生效。避免了最后节点对栈进行STW的问题,提升了GC效率

总的来说,Go语言的GC算法在简单性、开销和用户体验等方面做了很好的权衡和优化。这也是Go适合编写高并发、对延时敏感的系统的一个重要原因。

标签:专题,并发,对象,标记,面试,屏障,GC,Go
From: https://www.cnblogs.com/wise-mushroom/p/18220879

相关文章

  • golang kafka例子
    packagemain//生产者代码import( "fmt" "github.com/IBM/sarama" "time")//基于sarama第三方库开发的kafkaclientvarbrokers=[]string{"127.0.0.1:9092"}vartopic="hello_kafka0"//同步消息模式funcsyncProducer(conf......
  • celery官方解决方案(基于django新)
    使用官方方案之前,先看看目录结构。luffy_api/__init__.pycelery.pysettings.pyurls.pywsgi.pymyapp/__init__.pytasks.py#也就是放在项目名称同名的内部文件夹下(和settings)同名#必须是这样的结构。第一步安装必要的模块......
  • celery通用解决方案(基于django老)
    通用方案移动项目celery_task到项目根目录在视图中写逻辑启动worker-->celery-Acelery_taskworker-ldebug-Peventlet运行django,正常使用接口#1把之前的celery_task移动过到项目根路径,然后开启worker#2在视图函数中提交任务#fromlibs.tx_smsimportg......
  • django 多数据库接入相关操作
    多数据库注册在配置文件中的default同级进行注册即可DATABASES={"default":{.....},"aaa":{.....},"bbb":{.....},}建立数据表模型模型建立后做一些操作让使用更加便携,其他使用此模型的时候正常  Aaa......
  • 我的 Django 注册页面重定向不起作用
    我正试图为我的Django项目制作一个注册页面。当我编译注册表单时,它出现了图片中的错误,因为它试图转到以下路径(hedoublesusers/register):localhost/users/register/users/register/。我的代码如下:......
  • 记一次go项目循环引用问题
    1.问题背景界面歌曲列表需要添加收藏icon。后端需要返回对应歌曲的用户收藏信息。allmusic-api-server/service/favoriatesongservice包下依赖函数:commonservice.GetRelatedInfos()用于查询歌曲相关信息与本次需求无关。allmusic-api-server/service/commonservice包下......
  • 面试题 - C# 交错序列求和
    试题求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+.....+m?最好用C#代码实现。分析这个表达式是一个交错序列的和,其中正数和负数交替出现。通常我们可以使用循环来实现这个计算,但面试官更青睐效率高的方式实现。直观循环法这种方法简单易懂,适合初学者理解和实现......
  • 使用Dockerfile部署go项目
    主旨就是先拉代码,再删旧容器和镜像,再起Dockerfile的容器并执行出go的二进制文件,再运行Dockerfile文件如下FROMgolang:alpine#为我们的镜像设置必要的环境变量ENVGO111MODULE=on\GOPROXY=https://goproxy.cn,direct\CGO_ENABLED=0\GOOS=linux\GO......
  • MongoDb索引
    MongoDb索引数据库索引类似于图书索引。有了索引便不需要浏览整本书,而是可以采取一种快捷方式,只查看一个有内容引用的有序列表。这使得MongoDB的查找速度提高了好几个数量级。不使用索引的查询称为集合扫描,这意味着服务器端必须“浏览整本书”才能得到查询的结果。MongoDB如......
  • Google使用AI改进了 Sheets;开源视觉语言模型llama3v;开源情绪语音模型ChatTTS;
    ✨1:GooglehasimprovedSheetswithAI.Google使用AI改进了Sheets您可以使用Gemini处理您的数据并将其变成老师。优化您的数据Gemini了解您的数据并提出改进建议。例如,它可以将重复数据转换为更实用的下拉框。解释数据通过单击双子座图标,您可以自动获......