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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

操作系統(tǒng)線程是否在 go-routine 執(zhí)行的 io 上被阻塞?

操作系統(tǒng)線程是否在 go-routine 執(zhí)行的 io 上被阻塞?

Go
拉風(fēng)的咖菲貓 2022-06-01 17:29:35
在我的機(jī)器上有 4 個(gè)邏輯處理器。所以有四個(gè)上下文P1, P2, P3&P4使用 OS 線程M1, M2, M3&M4$ lscpuArchitecture:        x86_64CPU op-mode(s):      32-bit, 64-bitByte Order:          Little EndianCPU(s):              4On-line CPU(s) list: 0-3Thread(s) per core:  2Core(s) per socket:  2Socket(s):           1在下面的代碼中:package mainimport (    "fmt"    "io/ioutil"    "net/http")func getPage(url string) (int, error) {    resp, err := http.Get(url)    if err != nil {        return 0, err    }    defer resp.Body.Close()    body, err := ioutil.ReadAll(resp.Body)    if err != nil {        return 0, err    }    return len(body), nil}func worker(urlChan chan string, sizeChan chan<- string, i int) {    for {        url := <-urlChan        length, err := getPage(url)        if err == nil {            sizeChan <- fmt.Sprintf("%s has length %d (%d)", url, length, i)        } else {            sizeChan <- fmt.Sprintf("%s has error %s (%d)", url, err, i)        }    }}func main() {    urls := []string{"http://www.google.com/", "http://www.yahoo.com",        "http://www.bing.com", "http://bbc.co.uk", "http://www.ndtv.com", "https://www.cnn.com/"}    urlChan := make(chan string)    sizeChan := make(chan string)    for i := 0; i < len(urls); i++ {        go worker(urlChan, sizeChan, i)    }    for _, url := range urls {        urlChan <- url    }    for i := 0; i < len(urls); i++ {        fmt.Printf("%s\n", <-sizeChan)    }}有六個(gè)執(zhí)行例程http.Get()1)OS thread() 是否被io() 上M1的 go-routine() 阻塞?上下文G1http.Get()P1或者G1Go 調(diào)度程序是否會(huì)從 OS 線程(M1)搶占 go-routine( ) http.Get()?并分配G2給M1... 如果是,則在搶占 時(shí)G1,G1Goruntime如何G1在 IO() 完成后恢復(fù)http.Get?2)檢索用于每個(gè) go-routine(G) 的上下文編號(hào) (P) 的 api 是什么?用于調(diào)試目的..3) 我們使用 C pthreads 庫(kù)為上述讀寫器問題使用計(jì)數(shù)信號(hào)量維護(hù)關(guān)鍵部分。為什么我們不使用 go-routines 和通道來(lái)使用關(guān)鍵部分?
查看完整描述

1 回答

?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊

不,它不會(huì)阻塞。我粗略的(并且沒有來(lái)源,我是通過 osmosis 得到的)理解是,每當(dāng)一個(gè) goroutine 想要執(zhí)行一個(gè)具有等效非阻塞版本的“阻塞”I/O 時(shí),

  1. 改為執(zhí)行非阻塞版本。

  2. 將它自己的 ID 記錄在一個(gè)由它“阻塞”的句柄鍵入的表中。

  3. 將完成的責(zé)任轉(zhuǎn)移到一個(gè)專用線程,該線程位于select循環(huán)中(或poll任何可用的等效線程)等待此類操作解除阻塞,并且

  4. 掛起自身,釋放其操作系統(tǒng)線程(M)以運(yùn)行另一個(gè) goroutine。

當(dāng) I/O 操作解除阻塞時(shí),選擇循環(huán)在表中查找哪個(gè) goroutine 對(duì)結(jié)果感興趣,并安排它運(yùn)行。這樣,等待 I/O 的 goroutine 就不會(huì)占用一個(gè) OS 線程。

在無(wú)法以非阻塞方式完成的 I/O 或任何其他阻塞系統(tǒng)調(diào)用的情況下,goroutine 通過將其線程標(biāo)記為阻塞的運(yùn)行時(shí)函數(shù)執(zhí)行系統(tǒng)調(diào)用,并且運(yùn)行時(shí)將為 goroutines 創(chuàng)建一個(gè)新的 OS 線程以被安排在。這保持了讓 GOMAXPROCS 運(yùn)行(未阻塞)goroutines 的能力。對(duì)于大多數(shù)程序來(lái)說(shuō),這不會(huì)導(dǎo)致太多的線程膨脹,因?yàn)橛糜谔幚砦募⑻捉幼值鹊淖畛R姷南到y(tǒng)調(diào)用已經(jīng)變得異步友好。(感謝@JimB 提醒我這一點(diǎn),以及有用的鏈接答案的作者。)


查看完整回答
反對(duì) 回復(fù) 2022-06-01
  • 1 回答
  • 0 關(guān)注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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