騰訊云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.pswp.cn/bicheng/77299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77299.shtml
英文地址,請注明出處:http://en.pswp.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;事務提交時通過…