-
Notifications
You must be signed in to change notification settings - Fork 0
week11
ssh 帳號
密碼
cd sp
git pull origin msater
cd 09-posix/
cd 02-thresd/
gcc georgeMary.c -lpthread
ls
./a.out
設定 WSL 開發環境 發行項 2022/04/07 4 位參與者
設定 WSL 開發環境的最佳做法逐步指南。 瞭解如何執行 命令來安裝使用 Ubuntu 的預設 Bash 殼層,也可以設定為安裝其他 Linux 發行版本、使用基本 WSL 命令、設定Visual Studio Code或Visual Studio、Git、Windows認證管理員、MongoDB、Postgres 或 MySQL 等資料庫、設定 GPU 加速、執行 GUI 應用程式等。
開始使用 Windows 子系統 Linux 版隨附Windows作業系統,但您必須啟用它並安裝 Linux 發行版本,才能開始使用。
若要使用簡化的 --install 命令,您必須執行最新組建 Windows (Build 20262+) 。 若要檢查您的版本及組建號碼,請選取 [Windows 標誌鍵 + R]、輸入 winver,然後選取 [確定]。 您可以使用[設定] 功能表或Windows Update小幫手進行更新。
如果您想要安裝 Ubuntu 以外的 Linux 發行版本,或想要手動完成這些步驟,請參閱 WSL 安裝頁面 以取得詳細資料。
開啟 PowerShell (或Windows命令提示字元) ,然後輸入:
PowerShell
複製 wsl --install --install 命令會執行下列動作:
啟用選用的 WSL 和虛擬機器平台元件 下載並安裝最新的 Linux 核心 將 WSL 2 設定為預設值 可能需要下載並安裝 Ubuntu Linux 發行版本 (重新開機) 您必須在此安裝程式期間重新開機電腦。
PowerShell command line running wsl --install
如果您遇到任何問題,請查看 疑難排解安裝 文章。
設定 Linux 使用者名稱和密碼 使用 WSL 安裝 Linux 發行版本的程式完成後,預設會使用) [開始] 功能表 開啟 Ubuntu (Ubuntu 散發套件。 系統會要求您為 Linux 發行版本建立使用者名稱和密碼。
此使用者名稱和密碼是每個各自 Linux 發行版本專屬,不會影響您的 Windows 使用者名稱。
一旦您建立使用者名稱和密碼,帳戶就會是您散發套件的預設使用者,而且會在啟動時自動登入。
此帳戶將會被視為 Linux 系統管理員,並且能夠執行 sudo (超級使用者執行) 系統管理命令。
在 WSL 上執行的每個 Linux 發行版本都有自己的 Linux 使用者帳戶和密碼。 每當您新增散發套件、重新安裝或重設時,都必須設定 Linux 使用者帳戶。
介紹 數據競爭是並發系統中最常見和最難調試的錯誤類型之一。當兩個 goroutine 同時訪問同一個變量並且至少其中一個訪問是寫入時,就會發生數據競爭。有關詳細信息,請參閱Go 內存模型。
以下是可能導致崩潰和內存損壞的數據競爭示例:
func main() {
c := make(chan bool)
m := make(map[string]string)
go func() {
m["1"] = "a" // First conflicting access.
c <- true
}()
m["2"] = "b" // Second conflicting access.
<-c
for k, v := range m {
fmt.Println(k, v)
}
}
用法 為了幫助診斷此類錯誤,Go 包含一個內置的數據競爭檢測器。要使用它,請將-race標誌添加到 go 命令中:
$ go test -race mypkg // to test the package
$ go run -race mysrc.go // to run the source file
$ go build -race mycmd // to build the command
$ go install -race mypkg // to install the package
號誌(英語:semaphore)又稱為旗號,是一個同步物件,用於保持在0至指定最大值之間的一個計數值。當執行緒完成一次對該semaphore物件的等待(wait)時,該計數值減一;當執行緒完成一次對semaphore物件的釋放(release)時,計數值加一。當計數值為0,則執行緒等待該semaphore物件不再能成功直至該semaphore物件變成signaled狀態。semaphore物件的計數值大於0,為signaled狀態;計數值等於0,為nonsignaled狀態。
號誌的概念是由荷蘭電腦科學家艾茲赫爾·戴克斯特拉(Edsger W. Dijkstra)發明的[1],廣泛的應用於不同的作業系統中。在系統中,給予每一個行程一個號誌,代表每個行程目前的狀態,未得到控制權的行程會在特定地方被強迫停下來,等待可以繼續進行的訊號到來。如果號誌是一個任意的整數,通常被稱為計數號誌(Counting semaphore),或一般號誌(general semaphore);如果號誌只有二進位的0或1,稱為二進位號誌(binary semaphore)。
多工處理(英語:Computer multitasking)是指電腦同時執行多個程式的能力。多工的一般方法是執行第一個程式的一段代碼,儲存工作環境;再執行第二個程式的一段代碼,儲存環境;……恢復第一個程式的工作環境,執行第一個程式的下一段代碼……現代的多工,每個程式的時間分配相對平均。
電腦的早期,多工被稱作多道程式(multiprogramming)。多道程式是令CPU一次讀取多個程式放入記憶體,先執行第一個程式直到它出現了IO操作。因為IO操作慢,CPU需要等待。為了提高CPU利用率,此時執行第二個程式。即,第n+1個程式得以執行的條件是第n個程式進行IO操作或已經執行完畢。這種方式每個程式的時間分配是不均等的,很可能第一個程式執行了幾個小時而不出現IO操作,故第二個程式沒有執行。
在當初,這種情況是令人接受的。人們一次指定執行多個程式,過幾個小時或一天後來看執行結果或拿走列印出來的檔案。人們不需要即時獲得每個程式的執行情況,只關心執行結果。
在類UNIX系統中,殭屍進程是指完成執行(通過exit系統調用,或運行時發生致命錯誤或收到終止信號所致),但在作業系統的進程表中仍然存在其進程控制塊,處於"終止狀態"的進程。這發生於子進程需要保留表項以允許其父進程讀取子進程的退出狀態:一旦退出態通過wait系統調用讀取,殭屍進程條目就從進程表中刪除,稱之為"回收"(reaped)。正常情況下,進程直接被其父進程wait並由系統回收。進程長時間保持殭屍狀態一般是錯誤的並導致資源泄漏。
英文術語zombie process源自喪屍——不死之人,隱喻子進程已死但仍然沒有被回收。與正常進程不同,kill命令對殭屍進程無效。孤兒進程不同於殭屍進程,其父進程已經死掉,但孤兒進程仍能正常執行,但並不會變為殭屍進程,因為被init(進程ID號為1)收養並wait其退出。
子進程死後,系統會發送SIGCHLD信號給父進程,父進程對其默認處理是忽略。如果想響應這個消息,父進程通常在信號事件處理程序中,使用wait系統調用來響應子進程的終止。
殭屍進程被回收後,其進程號與在進程表中的表項都可以被系統重用。但如果父進程沒有調用wait,殭屍進程將保留進程表中的表項,導致了資源泄漏。某些情況下這反倒是期望的:父進程創建了另外一個子進程,並希望具有不同的進程號。如果父進程通過設置事件處理函數為SIG_IGN顯式忽略SIGCHLD信號,而不是隱式默認忽略該信號,或者具有SA_NOCLDWAIT標誌,所有子進程的退出狀態信息將被拋棄並且直接被系統回收。
UNIX命令ps列出的進程的狀態("STAT")欄標示為 "Z"則為殭屍進程。[1]
收割殭屍進程的方法是通過kill命令手工向其父進程發送SIGCHLD信號。如果其父進程仍然拒絕收割殭屍進程,則終止父進程,使得init進程收養殭屍進程。init進程周期執行wait系統調用收割其收養的所有殭屍進程。
為避免產生殭屍進程,實際應用中一般採取的方式是:
將父進程中對SIGCHLD信號的處理函數設為SIG_IGN(忽略信號); fork兩次並殺死一級子進程,令二級子進程成為孤兒進程而被init所「收養」、清理[2]。
fork炸彈(英語:fork bomb),在電腦領域中是一種利用系統調用fork(或其他等效的方式)進行的阻斷服務攻擊[1]。與病毒與蠕蟲不同的是,fork炸彈沒有傳染性,而且fork炸彈會使有行程/程式限制的系統無法開起新工作階段,對於不限制行程數的系統則使之停止回應[2]。以fork炸彈為代表的自我複製程式有時亦被稱為wabbit。
fork炸彈以極快的速度建立大量行程(行程數呈以2為底數的指數增長趨勢),並以此消耗系統分配予行程的可用空間使行程表飽和,而系統在行程表飽和後就無法執行新程式,除非行程表中的某一行程終止;但由於fork炸彈程式所建立的所有實例都會不斷探測空缺的行程槽並嘗試取用以建立新行程,因而即使在某行程終止後也基本不可能執行新行程。fork炸彈生成的子程式在消耗行程表空間的同時也會占用CPU和記憶體,從而導致系統與現有行程執行速度放緩,回應時間也會隨之大幅增加,以致於無法正常完成任務,從而使系統的正常運作受到嚴重影響[3]。
除了惡意觸發fork炸彈破壞的情況外,軟體開發中有時也會不慎在程式中嵌入fork炸彈,如在用於監聽網路通訊端並列使客戶端-伺服器結構系統中伺服器端職責的應用程式中可能需要無限地進行迴圈(loop)與衍生(fork)操作(類似下節範例程式所示),而在這種情況下原始碼內的細微錯誤就可能在測試中「引爆」fork炸彈。
https://go.dev/doc/articles/race_detector
https://docs.microsoft.com/zh-tw/windows/wsl/setup/environment
https://zh.wikipedia.org/zh-tw/%E4%BF%A1%E5%8F%B7%E9%87%8F
https://zh.wikipedia.org/zh-tw/%E5%A4%9A%E4%BB%BB%E5%8A%A1%E5%A4%84%E7%90%86
https://zh.wikipedia.org/zh-tw/%E5%83%B5%E5%B0%B8%E8%BF%9B%E7%A8%8B