fork系統呼叫用於建立乙個稱為子程序的新程序,該子程序與進行fork()呼叫的程序(父程序)同時執行。
建立新的子程序後,兩個程序都將在fork()系統呼叫之後執行下一條指令。
子程序使用與父程序相同的pc(程式計數器),相同的cpu暫存器,相同的開啟檔案。
它不帶任何引數,並返回乙個整數值。以下是fork()返回的不同值。
負值:建立子程序失敗。
零:返回到新建立的子程序。
正值:返回給父級或呼叫者。該值包含新建立的子程序的程序id。
光看上面的解釋有點幹,來份**
#include #include#include
intmain()
輸出:
hello world!hello world!
執行fork函式後,父程序和子程序都會執行下一行**和後面的**,所以會輸出兩遍
#include #includeintmain()
輸出
hellohello
hello
hello
hello
hello
hello
hello
hello列印的次數等於建立的程序數。
程序總數= 2^n,其中n是fork系統呼叫的數目。所以這裡n = 3,2^3 = 8
fork (); //line 1
fork (); //
line 2
fork (); //
line 3
l1
//there will be 1 child process
/ \ //
created by line 1.
l2 l2 //
there will be 2 child processes
/ \ / \ //
created by line 2
l3 l3 l3 l3 //
there will be 4 child processes
//created by line 3
因此,總共有八個程序(新的子程序和乙個原始程序)。
如果我們想將流程之間的關係表示為樹層次結構,則如下所示:
主程序:p0
第乙個fork函式建立的程序:p1
第二個fork函式建立的程序:p2、p3
第三個fork函式建立的程序:p4、p5、p6、p7
#include #include#include
void
forkexample()
intmain()
輸出:
1.hello
from child!hello
from parent!(or)2.
hello
from parent!hello
from child!
在上面的**中,建立了乙個子程序,fork()在該子程序中返回0,並向父程序返回正整數。
在這裡,兩個輸出都是可能的,因為父程序和子程序正在同時執行。 因此,我們不知道作業系統是首先控制父程序還是子程序。
父程序和子程序正在執行同一程式,但這並不意味著它們是相同的。 os為這兩個程序分配不同的資料和狀態,並且控制這些程序的流可以有所不同。
看下面的例子:
#include #include#include
void
forkexample()
intmain()
輸出:
parent has x = 0child has x = 2
(or)
child has x = 2
parent has x = 0
這裡,乙個程序中的全域性變數更改不會影響其他兩個程序,因為兩個程序的資料/狀態不同。而且父級和子級同時執行,因此有兩個輸出是可能的。
Golang協程排程
有時候可能會出現這種情況,乙個無恥的goroutine阻止其他goroutine執行。當你有乙個不讓排程器執行的 for迴圈時,這就會發生。package main import fmt func main for done fmt.println done for迴圈並不需要是空的。只要它包含了不...
golang 協程理解
本文總結一下go協程的理解,如有錯誤望請指正。網上都說協程是一種輕量級執行緒,執行緒又是一種輕量級的程序。這話在語言層面看來是沒有錯的,但它們的實現是不同的。執行緒是cpu資源排程的最小單位。協程不由cpu進行排程,由應用程式進行排程,也就是由go進行排程。在go中,協程的排程也有專門的排程器。但g...
Golang 協程排程
n個使用者空間執行緒在1個核心空間執行緒上執行。優勢是上下文切換非常快但是無法利用多核系統的優點,多個使用者空間執行緒無法並行執行。1個核心空間執行緒執行乙個使用者空間執行緒。這種充分利用了多核系統的優勢但是上下文切換非常慢,因為每一次排程都會在使用者態和核心態之間切換。每個使用者執行緒對應多個核心...