腾讯云golang一面

在这里插入图片描述

go垃圾回收机制

参考自:https://zhuanlan.zhihu.com/p/334999060

go 1.3 标记清除法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缺点

在这里插入图片描述

go 1.5 三色标记法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

屏障机制

在这里插入图片描述
在这里插入图片描述

插入屏障

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是如果栈不添加,当全部三色标记扫描之后,栈上有可能依然存在白色对象被引用的情况(如上图的对象9). 所以要对栈重新进行三色标记扫描, 但这次为了对象不丢失, 要对本次标记扫描启动STW暂停. 直到栈空间的三色标记结束。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除屏障

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这种方式的回收精度低,一个对象即使被删除了最后一个指向它的指针也依旧可以活过这一轮,在下一轮GC中被清理掉。

缺点

在这里插入图片描述

go 1.8 混合写屏障

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Golang中的混合写屏障满足弱三色不变式,结合了删除写屏障和插入写屏障的优点,只需要在开始时并发扫描各个goroutine的栈,使其变黑并一直保持,这个过程不需要STW,而标记结束后,因为栈在扫描后始终是黑色的,也无需再进行re-scan操作了,减少了STW的时间。

runtime.finalizer(终结器)

runtime.SetFinalizer 是 Go 语言中的一个函数,用于设置对象的终结器(finalizer)。终结器是一个回调函数,当对象被垃圾回收时会被调用,主要用于执行一些清理操作,如释放资源或关闭文件句柄。

package mainimport ("fmt""runtime"
)type MyStruct struct {Name string
}func main() {obj := &MyStruct{Name: "Example"}runtime.SetFinalizer(obj, func(ms *MyStruct) {fmt.Printf("Finalizing: %s\n", ms.Name)})// 使对象可回收obj = nil// 手动触发垃圾回收(仅用于测试)runtime.GC()// 等待终结器执行// time.Sleep(time.Second) // 可以加上这行来确保输出
}

二维的map按行和按列读取哪个快?

参考自 小林coding
在这里插入图片描述
在这里插入图片描述

golang里比较熟的库?

web:gin
数据库:GORM sqlx go-redis
配置管理:viper
日志管理:zap
消息队列:NSQ
微服务:go-zero
图形处理:barcode

Context放map有什么不好的?

Context 是 golang 中十分重要的接口,用于定义 goroutine 中的上下文信息,context 常用于以下几种情况:

  • 数据传递: 在多个 goroutine 中传递数据
  • 超时管理: 通过配置超时时间,可以方便地配置协程的终止时间
  • 终止协程: 通过使用 cancel() 方法,协程可以很方便地终止,可以批量管理多个协程的终止

Context 中放 map:

  • 不适合存储大对象:context 主要用于传递请求范围的数据(如截止日期、取消信号等),而不是用于存储大对象或共享状态。
  • 可能导致数据竞争:如果多个 goroutine 访问同一个 map,可能会导致数据竞争,除非使用适当的同步机制。
  • 增加内存压力:将大型 map 存储在 context 中可能导致不必要的内存占用,影响性能。
  • 语义混淆:context 的设计初衷是为了传递请求范围的值,使用它来存储 map 可能导致代码可读性降低,其他开发者可能不容易理解上下文的使用意图。

golang基本题:创建5个协程顺序打印

package mainimport ("fmt""sync"
)var N = 5func main() {var wg sync.WaitGroupvar mu sync.Mutexch := make(chan int)wg.Add(1)go func(){defer wg.Done()for i:=1;i<=N;i++{ch<-i}close(ch)}()for i:=1;i<=N;i++{wg.Add(1)go func(){defer wg.Done()mu.Lock()// 即使协程 A 先接收到数据 1,协程 B 可能更早完成 fmt.Println 操作,导致输出顺序错乱。fmt.Println(<-ch)mu.Unlock()}()}wg.Wait()
}

如何用go来实现死锁

在这里插入图片描述

package mainimport ("fmt""sync""time"
)func main() {var m1, m2 sync.Mutexgo func(){// 获取第一个锁m1.Lock()defer m1.Unlock()time.Sleep(time.Second)fmt.Println("尝试获取第二个锁。。。")m2.Lock()defer m2.Unlock()fmt.Println("协程1完成")}()go func(){// 获取第一个锁m2.Lock()defer m2.Unlock()time.Sleep(time.Second)fmt.Println("尝试获取第一个锁。。。")m1.Lock()defer m1.Unlock()fmt.Println("协程2完成")}()select{}
}

线程进程区别?

在这里插入图片描述

进程:我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,那么这个运行中的程序,就被称为「进程」(Process)。

线程:线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。
在这里插入图片描述

GMP原理调度与线程相关

参考自:https://zhuanlan.zhihu.com/p/713236782
在 Go 语言中,协程被称为 goroutine,它非常轻量,体积只有几 KB,支持自动扩容。Go 语言采用 goroutine 和 channel 提供了更容易使用的并发方法,具体为让一组可复用的函数运行在一组线程上,即使有协程阻塞,该线程的协程也可以被 runtime 调度,转移到其他可运行的线程上。

GM模型

在这里插入图片描述
看上去挺像那么回事,但它存在如下缺点:

每个 M 在创建、销毁、调度 G 的时候需要获取锁,形成了激烈的锁竞争。
如果 M 在执行的某个 G 涉及到创建新协程,M 创建了 G’,此时 M 为了继续执行 G,需要把 G’交给 M’执行,违背了局部性原则。(因为 G’是和 G 相关的,最好放在 M 上执行,而不是其他 M’)。
CPU 在 M 之间的频繁切换导致系统开销增大。

映射关系

GM 模型显然不是一个好的协程调度模型,但软件行业没有什么东西是加一层解决不了的,因此 P(协程调度器) 油然而生。从协程的图来看,一个用户态协程绑定了一个内核态线程,即一个协程绑定一个线程。那么是否可以利用 P,尝试不同的绑定方案?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

G(协程)M(线程)P(Process)调度

在这里插入图片描述

  • 全局 goroutine 队列,同上面介绍的 GM 模型,用于存放等待运行的 G。
  • P 的本地队列:同全局队列类似,存放的也是等待运行的 G,数量不超过 256 个。新建 G’ 时,G’ 优先加入到 P 的本地队列,满足局部性。如果队列满了,会将本地队列的一半 G 和新创建的 G 打乱顺序,一起放入全局队列。
  • P 列表:所有的 P 都在程序启动时创建,并保存在数组中,最多有 GOMAXPROCS (可配置)个。
  • M:线程想运行任务就得获取 P,从 P 的本地队列获取 G,P 队列为空时,M 也会尝试从全局队列拿一批 G 放到 P 的本地队列,或从其他 P 的本地队列偷一半放到自己 P 的本地队列。M 运行 G,G 执行之后,M 会从 P 获取下一个 G,不断重复下去。

P 和 M 的数量

  • P 的数量由 环境变量 $GOMAXPROCS 或者是由 runtime 的方法 GOMAXPROCS() 决定,当 P 的数量 n 确定以后,运行时系统会根据这个数量创建 n 个 P。
  • go 程序启动时,会设置 M 的最大数量,默认 10000,但是内核很难支持这么多的线程数。
  • 当没有足够的 M 来关联 P 并运行其中的可运行的 G 时,比如所有的 M 此时都阻塞住了,而 P 中还有很多就绪任务,就会去寻找空闲的 M,而没有空闲的,就会去创建新的 M。
  • M 与 P 的数量没有绝对关系,一个 M 阻塞,P 就会去创建或者切换另一个 M,所以,即使 P 的默认数量是 1,也有可能会创建很多个 M。

4.调度器的设计策略

(1)work stealing 机制

当本线程无可运行的 G 时,尝试从其他线程绑定 P 的队列中偷取 G,而不是销毁线程。

(2)hand off 机制

当本线程因为 G 进行系统调用阻塞时,线程释放绑定的 P,把 P 转移给其他空闲的线程执行。

(3)利用并行

P 的数量由 GOMAXPROCS 设置,最多有 GOMAXPROCS 个线程分布在多个 CPU上 同时运行。GOMAXPROCS 也限制了并发的程度,比如 GOMAXPROCS = 核数/2,则最多利用了一半的 CPU 核进行并行。

(4)抢占

在 coroutine 中要等待一个协程主动让出 CPU 才执行下一个协程。在Go中,一个 goroutine 最多占用 CPU 10ms,防止其他 goroutine 被饿死。

(5)全局G队列

在新的调度器中依然有全局 G 队列,当 P 的本地队列为空时,优先从全局队列获取,如果全局队列为空时则通过 work stealing 机制从其他P的本地队列偷取 G。

生命周期

在这里插入图片描述

1千个goroutine进行阻塞系统调用会怎么样?

Go运行时(runtime)采用M:N调度模型,将goroutine复用在少量操作系统线程(M)上。当goroutine执行阻塞系统调用(如文件IO、同步网络请求)时,当前线程会被操作系统挂起。此时,Go运行时会创建新的线程(通过pthread或Windows线程)来继续运行其他goroutine。

结果:1000个阻塞系统调用会创建约1000个线程(每个阻塞调用占用一个线程)。

上限限制:Go默认允许最多10,000个线程(通过runtime/debug.SetMaxThreads设置),因此1000个线程不会触发崩溃,但需注意资源消耗。

10个linux的命令

https://blog.csdn.net/qq_24950043/article/details/126294756
cat less tail(tail -f)
scp 文件名 目标服务器账号@目标服务器ip:目标路径
pwd
ps
kill (-9)
ssh 账号@服务器ip -p 端口
nohup

grep

参考:https://blog.csdn.net/u012581020/article/details/131421817

grep match_pattern file_name
grep "match_pattern" file_name

1核,10w个goroutine会崩吗?

在这里插入图片描述
在这里插入图片描述

防火墙,对指定ip端口进行拦截,可以在三次握手四次挥手之间哪一次拦截?

在这里插入图片描述

.经过防火墙端口,tcp怎么存真正的ip?

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨平台嵌入式音视频开发指南:EasyRTC音视频通话的多场景适配与AI扩展能力

在数字化通信技术飞速发展的今天&#xff0c;实时音视频通信已成为众多智能设备和应用的核心功能。从智能家居到远程办公&#xff0c;从在线教育到智能安防&#xff0c;音视频通信技术的应用场景不断拓展&#xff0c;对低延迟、高稳定性和跨平台兼容性的需求也在持续增长。在这…

Android 11 去掉性能受到影响通知

源码位置: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java final void finishBooting() {TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",Trace.TRACE_TAG_ACTIVITY_MANAGER);t.traceBegin("Finis…

Mac idea WordExcel等文件git modify 一直提示修改状态

CRLF LF CR 换行符自动转换问题 查看状态&#xff1a;git config --global --list Mac需要开启&#xff0c;window下需要关闭 关闭命令&#xff1a;git config --global core.autocrlf false 命令解释&#xff1a; autocrlf true 表示要求git在提交时将crlf转换为lf&a…

Apache Commons CLI 入门教程:轻松解析命令行参数

文章目录 Apache Commons CLI 入门教程&#xff1a;轻松解析命令行参数一、什么是 Commons CLI&#xff1f;二、为什么选择 Commons CLI&#xff1f;三、快速开始1. 添加依赖2. 基础示例3. 运行示例1. 在Idea中运行2. 命令行中运行3. 使用 Maven/Gradle 运行&#xff08;推荐&a…

VS2022调试嵌入式linux C# 程序 高效的开发方案

1.目标板子配置好ssh,确保PC可以连上 2.目标板子上传VSDBG程序&#xff0c;详见我的上一个文章 3.PC安装winfsp&#xff0c; sshfs,SSHFS-Win Manager.傻瓜式安装&#xff0c;将目标板子映射到PC的某个盘 4.VS2022中&#xff0c;你的工程的exe生成目录到上面盘中某个路径 5…

Python中如何加密/解密敏感信息(如用户密码、token)

敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…

智能体开发的范式革命:Cangjie Magic全景解读与实践思考

引言&#xff1a;当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天&#xff0c;智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月&#xff0c;仓颉社区推出的Cangjie Magic开源平台&#xff0c;以其创新的设计理念和技术架构&#xff0c;为这一领域带来了…

【Java学习笔记】位运算

位运算 一、原码&#xff0c;反码&#xff0c;补码 (1) 二进制的最高位是符号位&#xff1a;0 表示正数&#xff0c;1 表示负数&#xff08;怎么记&#xff1f; 1旋转一下变成-&#xff09; (2) 正数的原码、反码、补码都一样&#xff08;三码合一&#xff09; (3) 负数的反码…

HttpSessionBindingListener 的用法笔记250417

HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口&#xff0c; 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口&#xff0c;用于监听该对象被绑定…

【HDFS入门】HDFS高可用性与容错机制深度解析

目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…

04-libVLC的视频播放器:获取媒体信息

libvlc_media_t* libvlc_media_player_get_media(libvlc_media_player_t* p_mi); 功能说明 核心作用:获取与媒体播放器关联的当前媒体对象返回值:成功:返回libvlc_media_t*指针失败/无关联媒体:返回NULL内存管理:返回的媒体对象引用计数会增加,需要使用libvlc_media_rele…

使用datax通过HbaseShell封装writer和reader同步hbase数据到hbase_踩坑_细节总结---大数据之DataX工作笔记008

最近在做大数据相关功能,有个需求,使用datax同步hbase到hbase中,其中还是有很多细节值得记录: 首先来看一下datax的源码中,如果你使用phoenix创建的表,那么 你就需要使用对应的hbase带有sql字样的,reader和writer. 然后如果你使用datax-web来进行测试的,那么,他默认使用的是h…

如何通过window端来ssh连接本地虚拟机的ubuntu

首先在 Ubuntu 虚拟机上安装和配置 SSH 服务&#xff1a; # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动&#xff0c;则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…

Anolis OS 8.10 发布:软硬协同优化,满足多行业实际应用需求

引言 龙蜥操作系统 Anolis OS 8 是 OpenAnolis 龙蜥社区发行的开源 Linux 发行版&#xff0c;支持多计算架构&#xff0c;提供稳定、高性能、安全、可靠的操作系统支持。Anolis OS 8.10 是 Anolis OS 8 发布的第六个小版本&#xff0c;通过软硬协同&#xff0c;不断完善生态&a…

Java八种常见的设计模式

一、单例模式 单例模式是&#xff08;Singleton Pattern&#xff09;Java中最常用的设计模式之一&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。 实现单例模式的核心是将类的构造方法私有化&#xff0c;以防止外部直接通过构造函数创建实例。同时&am…

4.17---实现商铺和缓存与数据库双写一致以及宕机处理

实现商铺和缓存与数据库双写一致&#xff08;以及强双写一致策略&#xff09; redis点评项目采用的是延时双删策略 双删&#xff1a; 我们更新完数据库之后删除缓存&#xff0c;这样即使有线程并发进来查询&#xff0c;会发现缓存中没有数据&#xff0c;从而会去mysql中查找…

滑动窗口209. 长度最小的子数组

1.题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

osu ai 论文笔记 DQN

e https://theses.liacs.nl/pdf/2019-2020-SteeJvander.pdf Creating an AI for the Rhytm Game osu! 20年的论文 用监督学习训练移动模型100首歌能达到95准确率 点击模型用DQN两千首歌65准确率 V抖用的居然不是强化学习&#xff1f; 5,6星打96准确度还是有的东西的 这是5.…

如何通过工具实现流程自动化

通过自动化工具&#xff0c;企业可以显著提高工作效率、降低人为错误、节省时间和成本。现代企业的运营中&#xff0c;流程管理是确保工作顺畅的关键&#xff0c;而人工处理繁琐的流程不仅容易出错&#xff0c;还会消耗大量的时间和人力资源。通过使用适合的自动化工具&#xf…

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现&#xff08;4.0&#xff09;‌ ‌非严格依赖二阶段提交‌ MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟&#xff08;Logical Clock&#xff09;‌ 和 ‌快照隔离&#xff08;Snapshot Isolation&#xff09;‌ 实现多文档事务&#xff0c;事务提交时通过…