簡單的說,每個應用在執行時就會產生乙個程序,這個程序就對這個應用負責,掌握這個應用的執行狀態。
可是為什麼還要用乙個程序來控制乙個應用呢,下面將會簡單的解釋一下。
現在的應用對於資源的要求都是獅子大開口,開口就是幾個g,一台電腦的記憶體一般也就幾個g,總不能一台電腦就跑這乙個應用吧。為了解決這個問題,作業系統就使用了虛擬記憶體,讓每個程序代表乙個應用,給每個程序一種自己獨霸整台電腦的假象,然後作業系統進行上下文切換,只把這個程序正好需要使用的資源放進記憶體;這樣每個程序都有自己獨有的資源。
建立程序需要乙個系統呼叫fork(),fork可以建立乙個和當前程序映像一樣的程序;成功時建立子程序並返回子程序的pid,失敗時不會建立子程序,返回-1並設定相應的errno。
順便介紹一下pid,pid是程序的id,資料型別是pid_t,在linux中被定義為int。可以呼叫getpid()來獲得呼叫程序的pid,還可以通過呼叫getppid()來獲得呼叫程序的父程序的pid。
執行程序需要呼叫exec系統呼叫,但是不存在單一的exec函式,他是由一系列的exec函式組成的。
以乙個最簡單的呼叫execl()為例:
終止程序使用的是exit()系統呼叫,引數用於表示程序的推出狀態,exit_success和exit_failure這兩個可移植的巨集分別表示成功和失敗(也可以使用0和非0值來表示,不過可移植性就差了)。
簡單的表示成功退出就使用
exit(exit_success);
這個系統呼叫會先完成在使用者空間需要做的事,再呼叫_exit()再處理核心中的事。
在使用者空間做的事
核心會清理程序所建立的 不再使用的所有資源這包括但不侷限於:分配記憶體 開啟檔案和system ⅴ的訊號量。清理完成後,核心會摧毀程序,並告知父程序其子程序已經終止。
建立和執行執行緒
thread thread new thread thread.setname t1 thread.start log.debug running 建立任務物件 runnable runnable new runnable 引數 1 是任務物件 引數 2 是執行緒名字,推薦 thread t1 ne...
程序的建立和程序狀態
程序 程序是乙個程式在記憶體中執行的過程。程序由程式 資料和程序控制塊 簡稱pcb 組成 程序控制塊 pcb linux中的pcb是乙個名叫task struct 的結構體,其中有一下幾個內容 識別符號 用來區別於其他的程序的識別符號。狀態 任務狀態,退出 退出訊號等。優先順序 程序的優先順序。程式...
Linux程序建立和結束
在linux 中,程序的建立由系統呼叫fork 和vfork 完成。它們生成乙個子程序並且子程序是父程序的乙個複製品。fork 系統呼叫對應的kernel 函式是sys fork 此函式簡單的呼叫kernel 函式do fork 乙個簡化版的do fork 執行如下 1 alloc pid 給新的程...