make loop

This commit is contained in:
chai2010
2016-01-08 21:06:07 +08:00
parent 93076843ad
commit 8c235ad220

View File

@@ -1,9 +1,9 @@
### 9.8.2. Goroutine調度
OS线程会被操作系统内核调度。每毫秒,一硬件计时器会中断处理器,这会调用一叫作scheduler的核函数。这个函数会挂起当前执行的线程并保存存中它的寄存器容,检查线程列表并决定下一次哪个线程可以被行,并从内存中恢复该线程的寄存器信息,然后恢复执行该线程的现场并开始执行线程。因操作系统线程是被核所度,所以从一个线程向另一“移”需要完整的上下文切,也就是,保存一个用户线程的状态到内存,恢另一个线程的到寄存器,然更新度器的数据结构。这几步操作很慢,因其局部性很差需要几次内存访问,并且会增加行的cpu期。
OS線程會被操作繫統內核調度。每毫秒,一硬件計時器會中斷處理器,這會調用一叫作scheduler的核函數。這個函數會掛起當前執行的線程併保存存中它的寄存器容,檢査線程列表併決定下一次哪個線程可以被行,併從內存中恢複該線程的寄存器信息,然後恢複執行該線程的現場併開始執行線程。因操作繫統線程是被核所調度,所以從一個線程向另一“移”需要完整的上下文切,也就是,保存一個用戶線程的狀態到內存,恢另一個線程的到寄存器,然更新調度器的數據結構。這幾步操作很慢,因其局部性很差需要幾次內存訪問,併且會增加行的cpu期。
Go的运行时包含了其自己的度器,这个调度器使用了一些技手段比如m:n度,因为其会在n操作系统线程上多工(度)mgoroutine。Go度器的工作和核的度是相似的,但是这个调度器只关注单独的Go程序中的goroutine(译注:按程序立)。
Go的運行時包含了其自己的調度器,這個調度器使用了一些技手段比如m:n調度,因爲其會在n操作繫統線程上多工(調度)mgoroutine。Go調度器的工作和核的調度是相似的,但是這個調度器隻關註單獨的Go程序中的goroutine(譯註:按程序立)。
和操作系统的线程调度不同的是Go度器不是用一硬件定器而是被Go言"建"本身进行调度的。例如当一个goroutine用了time.Sleep或者被channel用或者mutex操作阻塞时,调度器使其入休眠并开始执行另一goroutine直到时机到了再去醒第一goroutine。因为因为这种调度方式不需要进入内核的上下文,所以重新度一goroutine比度一个线程代要低得多。
和操作繫統的線程調度不同的是Go調度器不是用一硬件定器而是被Go言"建"本身進行調度的。例如當一個goroutine調用了time.Sleep或者被channel調用或者mutex操作阻塞時,調度器使其入休眠併開始執行另一goroutine直到時機到了再去醒第一goroutine。因爲因爲這種調度方式不需要進入內核的上下文,所以重新調度一goroutine比調度一個線程代要低得多。
练习 9.5: 写一个有两个goroutine的程序两个goroutine会向两个无buffer channel反复地发送ping-pong消息。这样的程序每秒可以支持多少次通信?
練習 9.5: 寫一個有兩個goroutine的程序兩個goroutine會向兩個無buffer channel反複地發送ping-pong消息。這樣的程序每秒可以支持多少次通信?