日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1-3_基本概念_程序进程

發布時間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1-3_基本概念_程序进程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序

  程序通常以兩種面目示人。其一為源碼形式,由使用編程語言(比如,C語言)寫成的一系列語句組成,是人類可以閱讀的文本文件。想要執行程序,則需將源碼轉換為第二種形式——計算機可以理解的二進制機器語言指令。(這與腳本形成了鮮明對照,腳本是包含命令的文本文件,可以有shell或其他命令解釋器之類的程序直接處理。)一般認為,術語“程序”的上述兩種含義幾近相同,因為經過編譯和鏈接處理,會將源碼轉換為語義相同的二進制機器碼。

過濾器

  從stdin讀取輸入,加以轉換,再將轉換后的數據輸出到stdout,常常將擁有上述行為的程序稱為過濾器,cat、grep、tr、sort、wc、sed、awk均在其列。

命令行參數

  C語言程序可以訪問命令行參數,及程序運行時在命令行中輸入的內容。要訪問命令行參數,程序的main()函數需作出如下聲明:

  int main(int argc, char* argv[])

  argc變量包含命令行參數的總個數,argv指針數組的成員指針則逐一指向每個命令行參數字符串。收個字符串argv[0],標識程序名本身。

進程(process)

  進程是正在執行的程序實例。執行程序時,內核會將程序代碼載入虛擬內存,為程序變量分配空間,簡歷內核記賬(bookkeeping)數據結構,以記錄與進程有關的各種信息(比如,進程ID、用戶ID、組ID以及種植狀態等)。

  從內核來看,進程是一個個實體,內核必須在他們之間共享各種計算機資源。對于像內存這樣的受限資源來說,內核一開始會為進程分配一定數量的資源,并在進程的生命周期內,統籌該進程和整個系統對資源的需求,對這一分配進行調整。程序終止時,內核會釋放所有此類資源,供其他進程重新使用。其他資源(如CPU、網絡帶寬等)都屬于可再生資源,但必須在所有進程間平等共享。

進程的內存布局

  邏輯上將一個進程劃分為以下幾部分(也稱為段)

  1、文本:程序的指令

  2、數據:程序使用的靜態變量

  3、堆:程序可從該區域動態分配額外內存

  4、棧:隨函數調用、返回而增減的一片內存,用于為局部變量和函數調用鏈接信息分配存儲空間。

創建進程和執行程序

  進程可使用系統調用fork()來創建一個新進程。調用fork()的進程被稱為父進程,新創建的進程被稱為子進程。內核通過對父進程的復制來創建子進程。子進程從父進程處繼承數據段、棧段以及堆段的副本后,可以修改這些內容,不會影響父進程“原版”內容。(在內存中被標記為只讀的程序文本段則由父、子進程共享。)

  然后,子進程要么去執行與父進程共享代碼段中的另一組不同函數,或者,更為常見的情況是使用系統調用execve()去加載并執行一個全新程序。execve()會銷毀現有的文本段、數據段、棧段及堆段,并根據新程序的代碼,創建新段來替代他們。

進程ID和父進程ID

  每一個進程都有一個唯一的整數型進程標識符(PID)。此外,每一個進程還具有一個父進程標識符(PPID)屬性,用以標識請求內核創建自己的進程。

進程終止和終止狀態

  可使用以下兩種方式之一來終止一個進程:

  其一,進程可使用_exit()系統調用(或相關的exit()庫函數),請求退出。

  其二,向進程傳遞信號,將其“殺死”。

  無論以何種方式退出,進程都會生成“終止狀態”,一個非負小整數,可供父進程的wait()系統調用檢測。

  在調用_exit()的情況下,進程會指明自己的終止狀態。若由信號來“殺死”進程,則會根據導致進程“死亡”的信號類型來設置進程的終止狀態。根據慣例,終止狀態為0表示進程“功成身退”,非0則表示有錯誤發生。大多數shell會將前一執行程序的終止狀態保存于shell變量$?中。

進程的用戶和組標識符(憑證)

  每個進程都有一組與之相關的用戶ID(UID)和組ID(GID)。

  真實用戶ID和組ID:用來標識進程所屬的用戶和組。新進程從其父進程處繼承這些ID。登錄shell則會從系統密碼文件的相應字段中獲取其真實用戶ID和組ID。

  有效用戶ID和組ID:進程在訪問受保護資源(比如,文件和進程間通信對象)時,會使用這兩個ID(并結合下述的補充組ID)來確定訪問權限。一般情況下,進程的有效ID與相應的真實ID值相同。改變進程的有效ID實為一種機制,可使進程具有其他用戶或組的權限。

  補充組ID:用來標識進程所屬的額外組。新進程從其父進程處繼承補充組ID。登錄shell則從系統組文件中獲取其補充組ID。

特權進程

  就傳統意義而言,特權進程是指有效用戶ID為0(超級用戶)的進程。通常由內核所施加的權限限制對此類進程無效。

  由某一特權進程創建的進程,也可以是特權進程。

能力

  Linux把傳統上賦予超級用戶的權限劃分為一組相互獨立的單元(稱之為“能力”)。每次特權操作都與特定的能力相關,僅當進程具有特定能力時,才能執行相應操作。傳統意義上的超級用戶進程則相應開啟了所有能力。

  賦予某進程部分能力,使得其既能執行某些特權級操作,又防止其執行其他特權級操作。

init進程

  系統引導時,內核會創建一個名為init的特殊進程,即“所有進程之父”,該進程的相應程序文件為/sbin/init。系統的所有進程不是由init(使用fork())“親自”創建,就是由其后代進程創建。init進程號總為1,且總是以超級用戶權限運行。

  任何人(包括超級用戶)都不能“殺死”init進程,只有關閉系統才能終止該進程。init的主要任務是創建并監控系統運行所需的一系列進程。

守護進程

  守護進程指的是具有特殊用途的進程,系統創建和處理此類進程的方式與其他進程相同,但以下特征是其所獨有的:

  1、“長生不老”。守護進程通常在系統引導時啟動,直至系統關閉前,會一直“健在”。

  2、守護進程在后臺運行,且無控制終端供其讀取或寫入數據。

環境列表

  每個進程都有一份環境列表,即在進程用戶空間內存中維護的一組環境變量。這份列表的每一元素都由一個名稱及其相關值組成。由fork()創建的新進程,會繼承父進程的環境副本。這也為父子進程間通信提供了一種機制。當調用exec()替換當前正在運行的程序時,新程序要么繼承老程序的環境,要么在exec()調用的參數中制定新環境并加以接收。

  在絕大多數shell中,可使用export命令來創建環境變量(C shell使用setenv命令),例如

  $ export MYVAR='Hello world'

  C語言程序可使用外部變量(char **environ)來訪問環境,而庫函數也允許進程去獲取或修改自己環境中的值。

  shell定義并使用了一系列變量,供shell執行的腳本和程序訪問。其中包括:變量HOME(明確定義了用戶登錄目錄的路徑名)、變量PATH(指明了用戶輸入命令后,shell查找與之相應程序時所搜索的目錄列表)。

資源限制

  每個進程都會消耗諸如打開文件、內存以及CPU時間之類的資源。使用系統調用setrlimit(),進程可為自己消耗的各類資源設定一個上線。此類資源限制的每一項均有兩個相關值:軟限制(soft limit)限制了進程可以消耗的資源總量,硬限制(hard limit)軟限制的調整上限。非特權進程在針對特定資源調整軟限制值時,可將其設置為0到相應硬限制值之間的任意值,但硬限制則只能調低,不能調高。

  fork()創建的新進程,會繼承其父進程對資源限制的設置。

  使用ulimit命令(在C shell中為limit)可調整shell的資源限制。shell為執行命令創建的子進程會繼承上述資源設置。

?

轉載于:https://www.cnblogs.com/Bird-of-Paradise/p/6797071.html

總結

以上是生活随笔為你收集整理的1-3_基本概念_程序进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。