linux小知識記錄

2021-06-19 12:33:03 字數 1829 閱讀 7674

1、linux的程序和執行緒

程序建立通常呼叫fork實現。建立後子程序和父程序指向同一記憶體區域,僅當子程序有write發生時候,才會把改動的區域copy到子程序新的位址空間,這就是copy-on-write技術,它極大的提高了建立程序的速度。

linux執行緒是通過程序來實現。linux kernel為程序建立提供乙個clone()系統呼叫,clone的引數包括如 clone_vm, clone_files, clone_sighand 等。通過clone()的引數,新建立的程序,也稱為lwp(lightweight process)與父程序共享記憶體空間,檔案控制代碼,訊號處理等,從而達到建立執行緒相同的目的。

linux 2.6的執行緒庫叫nptl(native posix thread library)。posix thread(pthread)是乙個程式設計規範,通過此規範開發的多執行緒程式具有良好的跨平台特性。儘管是基於程序的實現,但新版的nptl建立執行緒的效率非常高。一些測試顯示,基於nptl的核心建立10萬個執行緒只需要2秒,而沒有nptl支援的核心則需要長達15分鐘。

在linux 2.6之前,linux kernel並沒有真正的thread支援,一些thread library都是在clone()基礎上的一些基於user space的封裝,因此通常在訊號處理、程序排程(每個程序需要乙個額外的排程執行緒)及多執行緒之間同步共享資源等方面存在一定問題。為了解決這些問題,當年ibm曾經開發一套ngpt(next generation posix threads), 效率比 linuxthreads有明顯改進,但由於nptl的推出,ngpt也完成了相關的歷史使命並停止了開發。

nptl的實現是在kernel增加了futex(fast userspace mutex)支援用於處理執行緒之間的sleep與wake。futex是一種高效的對共享資源互斥訪問的演算法。kernel在裡面起仲裁作用,但通常都由程序自行完成。

nptl是乙個1×1的執行緒模型,即乙個執行緒對於乙個作業系統的排程程序,優點是非常簡單。而其他一些作業系統比如solaris則是mxn的,m對應建立的執行緒數,n對應作業系統可以執行的實體。(n

2、殭屍程序

a、產生

在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體。但是仍然保留了一些資訊(如程序號pid 退出狀態 執行時間等)。這些保留的資訊直到程序通過呼叫wait/waitpid時才會釋放。這樣就導致了乙個問題,如果沒有呼叫wait/waitpid的話,那麼保留的資訊就不會釋放。比如程序號就會被一直占用了。但系統所能使用的程序號的有限的,如果產生大量的殭屍程序,將導致系統沒有可用的程序號而導致系統不能建立程序。所以我們應該避免殭屍程序。(但如果子程序後結束,即父程序先結束了,因為每個程序結束時,系統都會掃瞄當前系統中執行的所有程序,看看有沒有哪個程序是剛剛結束的這個程序的子程序,如果有,就由init來接管它,成為它的父程序。

)b、避免產生殭屍程序的方法一般有:

1. fork兩次,使得孫子程序的父親為init,孫子程序去執行job;(第一次fork後子程序立即fork,子程序立即exit(被父程序wait),孫子程序執行job)

2. 制定自己的sigchld訊號處理函式,在這個訊號處理函式中呼叫wait();

3. 通過sigaction系統呼叫指定訊號sigchld處理動作中的sa_flags為sa_nocldwait。

3、守護程序

程序屬於乙個程序組,程序組號(gid)就是程序組長的程序號(pid)。登入會話可以包含多個程序組(會話組長是建立會話的程序)。這些程序組共享乙個控制終端。這個控制終端通常是建立程序的登入終端。 

fork()一次即可,fork()兩次更安全,防止重新獲得終端(第一次fork,是會話組長不能呼叫setsid,所以先fork一次;第二次fork後父程序終止,子程序就不是會話組長,也就不可能再獲得終端了)。

小知識記錄

清除浮動 新增子元素,左右都不允許出現浮動元素。清除a的下劃線 text decoration none 清除li前的小圓點 li 聖杯布局 negative margin 關於文件流,浮動流和position input標籤的型別 color,date,email 可使用偽類 或 元素。style...

css小知識記錄

前端展示 時,有些列文字過多會導致換行,使得 行之間間距變大不美觀,解決辦法是強制不換行,在行標籤中加 tr style white space nowrap js動態控制控制項的顯示和隱藏 方式一 document.getelementbyid 控制項id style.display none d...

js 小知識記錄(一)

1 選擇 map object 字面量,而不是switch語句 特別適合vue裡面的filter過濾 function test color 測試結果 test null test yellow 另兩種寫法更直觀 const fruitcolor function test color const ...