精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何創建一個進程 程序和進程的區別

Linux愛好者 ? 來源:未知 ? 作者:工程師李察 ? 2018-10-06 11:53 ? 次閱讀

計算機實際上可以做的事情實質上非常簡單,比如計算兩個數的和,再比如在內存中尋找到某個地址等等。這些最基礎的計算機動作被稱為指令(instruction)。所謂的程序(program),就是這樣一系列指令的所構成的集合。通過程序,我們可以讓計算機完成復雜的操作。程序大多數時候被存儲為可執行的文件。這樣一個可執行文件就像是一個菜譜,計算機可以按照菜譜作出可口的飯菜。

那么,程序和進程(process)的區別又是什么呢?

進程是程序的一個具體實現。只有食譜沒什么用,我們總要按照食譜的指點真正一步步實行,才能做出菜肴。進程是執行程序的過程,類似于按照食譜,真正去做菜的過程。同一個程序可以執行多次,每次都可以在內存中開辟獨立的空間來裝載,從而產生多個進程。不同的進程還可以擁有各自獨立的IO接口

操作系統的一個重要功能就是為進程提供方便,比如說為進程分配內存空間,管理進程的相關信息等等,就好像是為我們準備好了一個精美的廚房。

看一眼進程

首先,我們可以使用$ps命令來查詢正在運行的進程,比如$ps -eo pid,comm,cmd,下圖為執行結果:

(-e表示列出全部進程,-o pid,comm,cmd表示我們需要PID,COMMAND,CMD信息)

每一行代表了一個進程。每一行又分為三列。第一列PID(process IDentity)是一個整數,每一個進程都有一個唯一的PID來代表自己的身份,進程也可以根據PID來識別其他的進程。第二列COMMAND是這個進程的簡稱。第三列CMD是進程所對應的程序以及運行時所帶的參數

(第三列有一些由中括號[]括起來的。它們是內核的一部分功能,被打扮成進程的樣子以方便操作系統管理。我們不必考慮它們。)

我們看第一行,PID為1,名字為init。這個進程是執行/bin/init這一文件(程序)生成的。當Linux啟動的時候,init是系統創建的第一個進程,這一進程會一直存在,直到我們關閉計算機。這一進程有特殊的重要性,我們會不斷提到它。

如何創建一個進程

實際上,當計算機開機的時候,內核(kernel)只建立了一個init進程。Linux內核并不提供直接建立新進程的系統調用。剩下的所有進程都是init進程通過fork機制建立的。新的進程要通過老的進程復制自身得到,這就是fork。fork是一個系統調用。進程存活于內存中。每個進程都在內存中分配有屬于自己的一片空間 (address space)。當進程fork的時候,Linux在內存中開辟出一片新的內存空間給新的進程,并將老的進程空間中的內容復制到新的空間中,此后兩個進程同時運行。

老進程成為新進程的父進程(parent process),而相應的,新進程就是老的進程的子進程(child process)。一個進程除了有一個PID之外,還會有一個PPID(parent PID)來存儲的父進程PID。如果我們循著PPID不斷向上追溯的話,總會發現其源頭是init進程。所以說,所有的進程也構成一個以init為根的樹狀結構。

如下,我們查詢當前shell下的進程:

root@vamei:~# ps -o pid,ppid,cmdPID PPID CMD169353101sudo -i1693916935-bash2377416939ps -o pid,ppid,cmd

我們可以看到,第二個進程bash是第一個進程sudo的子進程,而第三個進程ps是第二個進程的子進程。

還可以用$pstree命令來顯示整個進程樹:

init─┬─NetworkManager─┬─dhclient  │        └─2*[{NetworkManager}]  ├─accounts-daemon───{accounts-daemon}  ├─acpid  ├─apache2─┬─apache2  │     └─2*[apache2───26*[{apache2}]]  ├─at-spi-bus-laun───2*[{at-spi-bus-laun}]  ├─atd  ├─avahi-daemon───avahi-daemon  ├─bluetoothd  ├─colord───2*[{colord}]  ├─console-kit-dae───64*[{console-kit-dae}]  ├─cron  ├─cupsd───2*[dbus]  ├─2*[dbus-daemon]  ├─dbus-launch  ├─dconf-service───2*[{dconf-service}]  ├─dropbox───15*[{dropbox}]  ├─firefox───27*[{firefox}]  ├─gconfd-2  ├─geoclue-master  ├─6*[getty]  ├─gnome-keyring-d───7*[{gnome-keyring-d}]  ├─gnome-terminal─┬─bash  │        ├─bash───pstree  │        ├─gnome-pty-helpe  │        ├─sh───R───{R}  │        └─3*[{gnome-terminal}]

fork通常作為一個函數被調用。這個函數會有兩次返回,將子進程的PID返回給父進程,0返回給子進程。實際上,子進程總可以查詢自己的PPID來知道自己的父進程是誰,這樣,一對父進程和子進程就可以隨時查詢對方。

通常在調用fork函數之后,程序會設計一個if選擇結構。當PID等于0時,說明該進程為子進程,那么讓它執行某些指令,比如說使用exec庫函數(library function)讀取另一個程序文件,并在當前的進程空間執行 (這實際上是我們使用fork的一大目的: 為某一程序創建進程);而當PID為一個正整數時,說明為父進程,則執行另外一些指令。由此,就可以在子進程建立之后,讓它執行與父進程不同的功能。

子進程的終結(termination)

當子進程終結時,它會通知父進程,并清空自己所占據的內存,并在內核里留下自己的退出信息(exit code,如果順利運行,為0;如果有錯誤或異常狀況,為>0的整數)。在這個信息里,會解釋該進程為什么退出。父進程在得知子進程終結時,有責任對該子進程使用wait系統調用。這個wait函數能從內核中取出子進程的退出信息,并清空該信息在內核中所占據的空間。但是,如果父進程早于子進程終結,子進程就會成為一個孤兒(orphand)進程。孤兒進程會被過繼給init進程,init進程也就成了該進程的父進程。init進程負責該子進程終結時調用wait函數。

當然,一個糟糕的程序也完全可能造成子進程的退出信息滯留在內核中的狀況(父進程不對子進程調用wait函數),這樣的情況下,子進程成為僵尸(zombie)進程。當大量僵尸進程積累時,內存空間會被擠占。

進程與線程(thread)

盡管在UNIX中,進程與線程是有聯系但不同的兩個東西,但在Linux中,線程只是一種特殊的進程。多個線程之間可以共享內存空間和IO接口。所以,進程是Linux程序的唯一的實現方式。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11123

    瀏覽量

    207908
  • 程序
    +關注

    關注

    115

    文章

    3720

    瀏覽量

    80357
  • 進程
    +關注

    關注

    0

    文章

    197

    瀏覽量

    13928

原文標題:Linux 進程基礎

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    進程和線程的區別

    系統對應用的并發性。進程和線程的區別在于:簡而言之,程序至少有
    發表于 12-12 09:28

    怎么區別進程和子進程

    怎么區別進程和子進程? 各位大神
    發表于 01-11 17:15

    線程、進程程序區別

    ,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是
    發表于 03-23 13:09

    什么是僵尸進程和孤兒進程

    在UNIX里,除了進程0(即PID=0的交換進程,Swapper Process)以外的所有進程都是由其他進程使用系統調用fork創建的,這
    發表于 08-02 08:36

    進程是什么?進程程序區別在哪

    進程是什么?進程程序區別在哪?進程的狀態有哪幾種?
    發表于 12-23 06:27

    Linux下進程創建、執行和終止

    ()和exec函數族。首先,fork()函數通過復制當前進程創建進程,子進程與父
    發表于 06-11 09:21 ?585次閱讀

    進程和線程分別是什么,它們的區別是什么

    程和線程的區別是什么?有什么關系?相信大家對于進程都很熟悉了吧,而線程相對于進程而言,是更加接近于執行體的概念,為了讓大家更好的了解
    發表于 03-24 17:26 ?9284次閱讀
    <b class='flag-5'>進程</b>和線程分別是什么,它們的<b class='flag-5'>區別</b>是什么

    你們知道Linux的進程是怎樣創建的嗎

    顆樹的結構。就像下面這樣: ? ? 在Linux中,為了創建進程,父進程用系統調用for
    的頭像 發表于 11-09 10:46 ?3186次閱讀
    你們知道Linux的<b class='flag-5'>進程</b>是怎樣<b class='flag-5'>創建</b>的嗎

    探討進程創建與終止

    在啟動進程時(好像會創建空轉進程),通常會創建若干進程
    的頭像 發表于 08-17 17:59 ?2292次閱讀
    探討<b class='flag-5'>一</b>下<b class='flag-5'>進程</b>的<b class='flag-5'>創建</b>與終止

    如何區分程序進程

    到目前為止,你肯定已經見過很多次這兩詞了,“程序”“進程”。那程序進程到底有什么區別呢。
    的頭像 發表于 02-24 14:17 ?1070次閱讀
    如何區分<b class='flag-5'>程序</b>與<b class='flag-5'>進程</b>

    Linux應用開發之進程程序

    進程可執行程序的實例,程序包含了系列信息文件,這些信息描述了如何在運行期間
    的頭像 發表于 06-04 16:35 ?607次閱讀
    Linux應用開發之<b class='flag-5'>進程</b>和<b class='flag-5'>程序</b>

    程序進程和線程的區別

    什么是進程 1、進程和線程的區別 進程是指正在運行的程序,它擁有獨立的內存空間和系統資源,不同進程
    的頭像 發表于 06-22 11:39 ?533次閱讀
    <b class='flag-5'>程序</b>中<b class='flag-5'>進程</b>和線程的<b class='flag-5'>區別</b>

    進程和線程的區別以及優缺點

    進程與線程 1、什么是進程、線程,有什么區別進程是資源(CPU、內存等)分配的基本單位,線程是 CPU 調度和分配的基本單位(程序執行的
    的頭像 發表于 07-21 11:02 ?1219次閱讀

    PCB進程創建和終止過程

    PCB進程控制塊 獨立運行基本單位的標志:創建進程創建PCB,進程結束時回PCB,進程隨之消亡
    的頭像 發表于 10-08 15:36 ?972次閱讀

    mcu線程和進程區別是什么

    程序執行的基本單位,它是進程中的實體,是進程內的條執行路徑。線程是CPU調度的最小單位,
    的頭像 發表于 01-04 10:45 ?564次閱讀