linux中建立乙個程序需要乙個老的程序呼叫fork這個系統呼叫來實現,老的程序叫父程序(parent process),新的程序叫子程序(child process)。
先拷貝,再修改。
父程序呼叫fork建立程序的時候,子程序將各個子系統為父程序建立的資料結構也全部拷貝乙份,對於fork系統呼叫的返回值,如果當前程序是子程序就返回0;如果當前程序是父程序,就返回子程序的程序號。
根據返回值的不同,做不同的事情,父程序繼續做,子程序請求另乙個系統呼叫execve來執行另乙個程式。
系統呼叫waitpid 父程序可以通過它來獲取子程序的狀態。
記憶體空間中,存放程式**的稱為**段。
存放執行中產生的資料被稱為 資料段:
區域性變數的部分,在當前函式執行的起作用,進入另乙個函式時這個變數就釋放了;
也有動態分配的,存較長時間,指明才銷毀的,叫堆。(heap)
程序要去使用部分部分記憶體時,才會使用記憶體管理系統用來登記,說需要部分記憶體使用。
只有真正寫入資料時,發現沒有對應的物理記憶體,才會觸發乙個中斷,先分配物理記憶體。
記憶體分配
brk 和 mmap :2個堆裡面分配記憶體的系統呼叫
分配的記憶體數量比較小的時候,使用brk,會和之前的堆的資料在一起,就像多分配了兩三個工位,多搬幾把椅子就可以了。
分配記憶體比較大的時候,使用mmap,會重新劃分一塊區域。當辦公空間需要太多的時候,索性來個一整塊。
檔案管理:
linux 中一切皆檔案:
每個檔案,linux都會分配乙個檔案描述符(file descriptor)這是乙個整數,有了檔案描述符,就可以使用系統呼叫,檢視或者干預程序執行的方方面面。
當專案遇到異常情況,例如專案中斷,需要傳送乙個訊號(signal)給專案組,經常遇到的訊號有以下幾種:
重要的訊號不能忽略,不重要的訊號可以忽略。
sigkill (使用者終止乙個程序的訊號)和sigstop(使用者中止乙個程序的訊號)。
每種訊號都定義了預設的動作,例如硬體故障,預設終止。也可以提供訊號處理函式,可以通過sigaction系統呼叫,註冊乙個訊號處理函式。
提供了訊號處理服務,專案執行過程中一旦有變動,就可以及時處理了。
當專案比較大的時候,會分成多個專案組,專案組間需要溝通,溝通的方式有很多種:
1、就是發個訊息不需要一段很長的資料,這種方式稱為訊息佇列(message queue)。 乙個公司的多個專案組溝通時,這個訊息在核心裡,可以通過msgget建立乙個新的佇列,msgsend將訊息傳送到訊息佇列,接收方使用msgrcv從佇列中取訊息。
2、當2個專案組需要互動的資訊比較大的時候,可以使用共享記憶體的方式,即2個專案組共享乙個會議室(這樣就不需要資料拷貝來拷貝去),大家都到這個會議室就可以完成溝通了。
這個時候可以通過shmget 建立乙個共享記憶體塊,通過shmat將共享記憶體對映到z自己的記憶體空間,然後就可以讀寫了。
但是如果同時修改一塊資料咋辦,這就需要一種方式能夠排他的訪問,這就是訊號量機制 semaphore.
對於只允許乙個人訪問的場景,設定訊號量為1。
當a訪問的時候先呼叫 sem_wait ,如果沒人訪問,則占用這個訊號量,他就是可以開發訪問了,如果這個時候b 也訪問,也會呼叫 sem_wait 由於前乙個人已經占用了1個訊號量,必須等訊號量釋放了才能訪問。
a 使用結束後呼叫sem_post 將訊號量釋放,這個時候b 就可以訪問了。
跨機器之間的溝通,就需要網路通訊了。都需要遵循相同的網路協議,tcp/ip 網路協議棧。linux 有對網路協議棧的實現,如果暴露出服務給專案組使用呢。
網路服務是通過套接字socket(插口,插槽)來提供服務的。
想象成一根網線,一頭插在客戶端,一頭插在服務端然後進行通訊。因此在通訊之前,雙方要建立乙個socket。
我們可以通過socket 系統呼叫建立乙個 socket,socket也是乙個檔案,也有乙個檔案描述符,也可以通過讀寫函式進行通訊。
linux核心源**官網
上面說的和平時的開發都不太一樣,因為工作中沒有直接呼叫系統呼叫。
為了對使用者友好,可以使用中介 glibc ,它會幫你轉成系統呼叫。
glibc 是linux 下使用的開源的標準c庫,它是gnu 發布的libc 庫。它為程式設計師提供了豐富的api,例如字串處理,數**算等使用者態服務之外,最重要的是封裝了作業系統提供的系統服務,即系統呼叫的封裝。
glibc和系統呼叫的對應關係是靈活的。
strace 常用來跟蹤程序執行時系統呼叫和所接收的訊號。
趣談Linux作業系統 05 系統呼叫
建立程序的系統呼叫叫fork。這個名字很奇怪,中文叫 分支 為啥啟動乙個新程序叫 分支 呢?在 linux 裡,要建立乙個新的程序,需要乙個老的程序呼叫 fork 來實現,其中老的程序叫作父程序 parent process 新的程序叫作子程序 child process 當父程序呼叫 fork 建...
05系統函式
1.length 獲取引數值的位元組個數 select length john 2.concat 拼接字串 select concat hello world 3.改變大小寫 select upper john select lower john 4 擷取從指定索引處後面所有字元 select su...
必須學會的幾個網路測試命令
必須學會的幾個網路測試命令 了解和掌握下面幾個命令將會有助於您更快地檢測到網路故障所在,從而節省時間,提高效率。ping ping是測試網路聯接狀況以及資訊包傳送和接收狀況非常有用的工具,是網路測試最 常用的命令。ping向目標主機 位址 傳送乙個回送請求資料報,要求目標主機收到請求後給予答覆,從而...