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

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

Goroutine I/O 調度

Goroutine I/O 調度

Go
料青山看我應如是 2021-10-25 20:22:34
Golangs goroutines 為 goroutine (-programmer) 提供了一個阻塞 I/O 的接口。在幕后,運行時自然會使用某種非阻塞 I/O 來防止 OS 掛起 OS 線程,以便運行時可以在執(zhí)行 I/O 時在 OS 線程之上運行另一個 goroutine。運行時什么時候考慮執(zhí)行的 I/O 以便它可以重新調度 goroutine?明確地說,假設我有一個net.TCPConn我調用的,我Write什么時候可以期望重新安排 goroutine?conn, err := net.Dial("tcp", serverAddr)conn.Write(buffer)timestamp = time.Now()那是什么時候我可以期望使用時間戳?當緩沖區(qū)被復制到 golang 運行時?何時將緩沖區(qū)復制到運行時和操作系統(tǒng)的內核空間?當緩沖區(qū)被復制到運行時、內核空間以及網卡的發(fā)送緩沖區(qū)時?緩沖區(qū)何時通過網絡/從 NIC 發(fā)送?當緩沖區(qū)已被接收端確認時,TCP 堆棧?
查看完整描述

2 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

您可以查看文件https://github.com/golang/go/blob/master/src/net/fd_unix.go(寫入函數(shù))。

基本上,這取決于套接字緩沖區(qū)是否有足夠的空間。

如果套接字緩沖區(qū)中有足夠的空間來容納您的寫操作的大小,數(shù)據(jù)將立即寫入套接字緩沖區(qū)。我想這對應于您的第二個答案。此外,內核實際上可能會發(fā)送數(shù)據(jù)包(或將其添加到 NIC 隊列),但它獨立于 Go 運行時。

如果套接字緩沖區(qū)中沒有足夠的空間來容納整個寫入操作,則只會立即將部分數(shù)據(jù)寫入套接字緩沖區(qū)。然后,調用將阻塞(通過運行時輪詢引擎),直到內核在套接字緩沖區(qū)中留出一些空間(通過發(fā)送一些數(shù)據(jù)包)。只要有一些空間可用,并且所有數(shù)據(jù)都已復制,呼叫就會解除阻塞。

您應該考慮在 net 包通過系統(tǒng)調用將整個緩沖區(qū)寫入套接字緩沖區(qū)時采用的時間戳。


查看完整回答
反對 回復 2021-10-25
?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

在下面的文章介紹了netpoller是如何工作的:

每當 goroutine 嘗試讀取或寫入連接時,網絡代碼將執(zhí)行操作,直到收到此類錯誤,然后調用 netpoller,告訴它在準備再次執(zhí)行 I/O 時通知 goroutine。然后 goroutine 被調度到它正在運行的線程之外,另一個 goroutine 在它的位置運行。

當 netpoller 收到來自 OS 的通知,它可以對文件描述符執(zhí)行 I/O 時,它會查看其內部數(shù)據(jù)結構,查看是否有任何 goroutine 在該文件上被阻塞,如果有,則通知它們。然后 goroutine 可以重試導致它阻塞的 I/O 操作并成功執(zhí)行此操作?!?/p>

因此我們得出結論,只要底層系統(tǒng)調用完成對整個緩沖區(qū)的寫入,就可以重新調度 goroutine。在 Linux 的情況下,當消息被復制到內核空間發(fā)送緩沖區(qū)時似乎是蜜蜂:阻塞套接字:確切地說,“send()”何時返回?.?這又是我的第二個原始選項“當緩沖區(qū)被復制到運行時和操作系統(tǒng)的內核空間時”。

查看完整回答
反對 回復 2021-10-25
  • 2 回答
  • 0 關注
  • 254 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號