Golang協程實現流量統計系統(2)

2022-03-11 19:58:39 字數 2098 閱讀 2718

fork系統呼叫用於建立乙個稱為子程序的新程序,該子程序與進行fork()呼叫的程序(父程序)同時執行。

建立新的子程序後,兩個程序都將在fork()系統呼叫之後執行下一條指令。

子程序使用與父程序相同的pc(程式計數器),相同的cpu暫存器,相同的開啟檔案。

它不帶任何引數,並返回乙個整數值。以下是fork()返回的不同值。

負值:建立子程序失敗。

零:返回到新建立的子程序。

正值:返回給父級或呼叫者。該值包含新建立的子程序的程序id。

光看上面的解釋有點幹,來份**

#include #include 

#include

intmain()

輸出:

hello world!hello world!

執行fork函式後,父程序和子程序都會執行下一行**和後面的**,所以會輸出兩遍

#include #include 

intmain()

輸出

hello

hello

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 = 0

child 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個核心空間執行緒執行乙個使用者空間執行緒。這種充分利用了多核系統的優勢但是上下文切換非常慢,因為每一次排程都會在使用者態和核心態之間切換。每個使用者執行緒對應多個核心...