第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Golang 在切換上下文時只保存 %rsp、%rip 和 %rbp?

為什么 Golang 在切換上下文時只保存 %rsp、%rip 和 %rbp?

Go
拉風(fēng)的咖菲貓 2022-05-18 09:40:51
在一般的用戶線程上下文切換實現(xiàn)(like setjmp/longjmpand the function returnway)中,我們保存和恢復(fù)被調(diào)用者保存的寄存器,但golang只保存和恢復(fù)%rsp,%rip并且%rbp在gobuf中。以 x86_64 為例,golang 用 runtime.gosave 保存 goroutine 上下文,用runtime.gogo恢復(fù)goroutine 上下文。那么為什么golang會這樣呢?
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻1852條經(jīng)驗 獲得超1個贊

顯然,GoLang 仍然使用低效的調(diào)用約定,其中唯一保留調(diào)用(也稱為非易失性)的寄存器是 RSP 和 RBP。

對編譯器的調(diào)用runtime.gosave與任何其他函數(shù)調(diào)用一樣(即它最終在執(zhí)行某些操作后返回,并且不會修改其自己的堆??蚣苤系娜魏蝺?nèi)容)。與任何其他函數(shù)調(diào)用一樣,調(diào)用者必須假定它會破壞所有調(diào)用破壞(易失性)寄存器(除了 RSP 和 RBP 之外的所有寄存器)。因此,它希望在調(diào)用中存活的任何值都必須溢出到堆棧槽(或它們所屬的其他內(nèi)存位置)。

出于同樣的原因,Csetjmp只需要保存調(diào)用保留寄存器。和內(nèi)核上下文切換功能是一樣的。


這篇 2017 年谷歌群組帖子說這就是它的調(diào)用約定/ABI 的工作方式,從鏈接的代碼來看,它看起來仍然沒有得到改進。

Go 的調(diào)用約定也低效地傳遞堆棧上的所有參數(shù),這與 x86-64 System V ABI 不同,后者傳遞寄存器中的前 6 個整數(shù)參數(shù)(和前 8 個 FP)。


查看完整回答
反對 回復(fù) 2022-05-18
  • 1 回答
  • 0 關(guān)注
  • 262 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號