當前位置:首頁 » 操作系統 » linux進程存在

linux進程存在

發布時間: 2023-03-25 16:01:16

linux進程的幾種狀態

Linux中進程分類

①交互進程:由一個shell啟動的進程,交互進程既可以在前台運行,也可以在後台運行。

②批處理進程:這種進程和終端沒有聯系,是一個進程序列。

③監控進程:也稱守護進程,是一個在後台運行且不受任何終端控制的特殊進程,用於執行特定的系統任務。

進程的狀態

①可運行狀態:此時進程正在運行或者正在運行隊列中等待准備運行。

②等待狀態:此時進程在等待一個事件的發生或某種系統資源。在Linux系統中等待狀態又細分為兩種等待狀態:可中斷的等待狀態和不可中斷的等待狀態。

③暫停狀態:處於暫停狀態的進程被暫停運行。

④僵死狀態:每個進程在運行結束後都會處於僵死狀態,等待父進程調用進而釋放系統資源,處於該狀態的進程已經運行結束,但是它的父進程還沒有釋放其系統資源。

㈡ linux shell 判斷進程是否存在

如果你是通過一個進程的名字作為關鍵詞來查找進程是否存在的話,可使用
ps
-ef
|
grep
"<關鍵詞>"
|
wc
-l
輸出為0表示不存在,輸出大於0,表示存在,且數字就是這個關鍵詞進程的個數;
如果你是通過進程號PID來查找進程是否存在,可以使用
ps
--no-heading
|
wc
-l
同樣,
輸出為0表示不存在,輸出=1,表示存在,因為進程號不可能重復,所以輸出肯定非0即1

㈢ Linux啟動一個進程的過程

Linux 中的每個進程都存在於「進程樹」中。你可以通過運行 pstree 命令查看進程樹。樹的根是 init,進程號是 1。每個進程(init 除外)都有一個父進程,一個進程都可以有很多子進程。

所以,假設我要啟動一個名為 ls 的進程來列出一個目錄。我是不是只要發起一個進程 ls 就好了呢?不是的。

我要做的是,創建一個子進程,這個子進程是我(me)本身的一個克隆,然後這個子進程的「腦子」被吃掉了,變成 ls。

開始是這樣的:

然後運行 fork(),生成一個子進程,是我(me)自己的一份克隆:

然後我讓該子進程運行 exec("ls"),變成這樣:

當 ls 命令結束後,我幾乎又變回了我自己:

在這時 ls 其實是一個僵屍進程。這意味著它已經死了,但它還在等我,以防我需要檢查它的返回值(使用 wait 系統調用)。一旦我獲得了它的返回值,我將再次恢復獨自一人的狀態。

上文提到的「腦子被吃掉」是什麼意思呢?
進程有很多屬性:

當你運行 execve 並讓另一個程序吃掉你的腦子的時候,實際上幾乎所有東西都是相同的! 你們有相同的環境變數、信號處理程序和打開的文件等等。

唯一改變的是,內存、寄存器以及正在運行的程序,這可是件大事。

為何 fork 並非那麼耗費資源(寫入時復制)
你可能會問:「如果我有一個使用了 2GB 內存的進程,這是否意味著每次我啟動一個子進程,所有 2 GB 的內存都要被復制一次?這聽起來要耗費很多資源!」

事實上,Linux 為 fork() 調用實現了寫時復制 on write,對於新進程的 2GB 內存來說,就像是「看看舊的進程就好了,是一樣的!」。然後,當如果任一進程試圖寫入內存,此時系統才真正地復制一個內存的副本給該進程。如果兩個進程的內存是相同的,就不需要復制了

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

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

㈣ 22. Linux的進程管理

1.1 在Linux中,每個執行的程序都稱為一個進程,每一個進程都分配一個ID號(pid,進程號)。

1.2 每個進程都可能以兩種方式存在,前台和後台。

1.2.1 前台進程:用戶目前的屏幕上可以進行操作的,占據了屏幕的進程,例如vim

1.2.2 後台進程:實際上在鎮孫操作,但屏幕上無法看到的進程,例如mysql服務、ssh等

1.3 一般來說,系統服務都是以後台方式存在,且常駐系統,直到關機才結束。

ps命令用來查看目前系統中,有哪些正在執行,以及它們執行的情況。可以不加任何參數。

PID:進程識別號

TTY:終端機號

TIME:此進程所消耗的CPU時間

CMD:正在執行御和鏈的命令或進程名

ps -a 顯示當前終端的所有進程信息

ps -u 以用戶的格式顯示進程信息

ps -x 顯示後台進程運行的參數

USER:進程執行用戶

PID:進程號

%CPU:佔用CPU的百分比

%MEM:佔用物理內存的百分比

VSZ:佔用虛擬內存的大小,單位KB

RSS:佔用物理內存的大小,單位KB

TTY:終端

STAT:當前運行狀態

    S(大寫)表示休眠,即sleep

    R(大寫)表示正在運行

    D(大寫)表示短期等待

    Z(大寫)表示僵死進程

START:進程執行的開始時間

TIME:這個進程佔用CPU的時間

COMMAND:進程的名字,也可以理解為執行該進程的指令

ps -ef 可以以全格式顯示當前所有進程

-e顯示所有進程

-f以全格式顯示,如下面兩幅圖所示。

可以看到,/usr/sbin/sshd的進程號為7092,其父進程為1號進程,1號進程是systemd進程,而systemd進程的父進程為0號,也就是沒有父進程。即,系統啟動後的第一個進程就是systemd進程,systemd進程會啟動sshd進程。

再仔細看,sshd: root@pts/1是xshell登陸root用戶後的進程,進程號為7183,父進程為7092,也即sshd進程。繼續用其他用戶遠程登陸linux,就會增加7092進程的子進程。

當某個進程執行過程中需要停止,或者已經消耗了太多的系統資源時,可以考慮停止這個進程,使用kill命令。

kill [選項] 進程號

killall 進程名稱 這個命令通過進程名稱殺死進程,支持通配符,當系統因負載過大而很慢時,這個指令就很有用了。假如abc進程有3個子進程,killall abc就會把abc停止,並且停止其所有3個子進程。

常用選項,

    -9 強迫進程立即停止

示例,

4.1 踢掉某個用戶

ps -aux | grep sshd

kill 17204 (因為在我這里查到,17204是該用戶ssh登陸linux的進程)

4.2 終止遠程登陸服務sshd,在適當時候再次重啟sshd服務

kill sshd對棚兄應的進程號PID

/bin/systemctl start sshd.service

4.3 終止多個gedit,演示killall

比如用gedit打開多個文本文件,然後進程中會出現gedit

killall gedit就會殺掉gedit進程,同時看到文本文檔編輯頁面被關掉了。

4.4 強制殺掉一個終端

kill -9 10487 強制殺掉10487進程(比如terminal這樣的進程,如果不加-9是不可以殺掉的)

pstree [選項] 這條指令可以更加直觀的查看進程信息

常用選項,

-p 顯示進程的PID

-u 顯示進程的所屬用戶

示例,

5.1 以樹狀的形式顯示進程的PID

pstree -p

5.2 以樹狀的形式顯示進程的用戶id

pstree -u

㈤ linux進程內存相關

3種地址:虛擬地址、物理地址、邏輯地址
物理寬坦地址:內存的電路地址,對應內存地址線上的高低電平,物理可見的。
虛擬地址: 分頁機制 的產物,也叫線性地址,是進程能看見的地址。
邏輯地址: 分段機制 的產物,屬於inter cpu的歷史遺留問判巧李題,linux可以當做不存在。
3種地址的轉換:進程訪問邏輯地址,linux內核根據分段機制裝換成虛擬地址,然後把進程的頁表和虛擬地址都告訴cpu,cpu就可以根據分頁機制將虛擬地址裝換成物理地址,然後訪問內存。
linux內核中巧妙地屏蔽里分段機制,就是邏輯地址等於虛擬地址,訪問內存只需要利用分頁機制把虛擬地址轉換成物理地址。

linux會為每個進程創建自己的虛擬地址空間,就是進程地址空間,64位系統就是128T的內存空間。需要注意的是,虛擬地址就是假的,一開始不和物理地址對應,也就是說不佔用物理內存,只有當虛擬地址有寫入操作是,內核會觸發缺頁,分配真實的物理地址給虛擬地址。物理地址的管理可參考 內核內存管理

從進程空間看,用戶態閑置內存有3塊,Stack、Memory Mapping Region、Heap,Stack是程序函數調用運行時需要的,不可控,能自由分配的內存就剩Memory Mapping Region、Heap了,linux系統提供的內存分配函數就是針對這兩個區域的。
Heap操作函數:int brk(void *addr)、void *sbrk(intptr_t increment)
Memory Mapping Region操作函數:mmap()、munmap()

當然進程可以直接使用系統調用去申請內存,但是如果不管理的話,經過大量的申請和釋放,會把進程空間切割的亂七八糟,導致不能申請大塊的連續空間,為此就出現了內存管理模塊,封裝了系統調用,對進程提供malloc和free等高級函數。實際上,除了一些特殊程序,我們也很少用系統調用,一般都是使用內存管理模塊提供的malloc和free,關系如下圖:

內存管理模塊用各種好處,例如不會每次操作都去執行系統調用,減少內存碎片的產生等等。
當然也有很多實現方式,例如常用的glibc的Ptmalloc,google的tcmalloc,facebook的jemalloc等。各有各的應用場景,blablabla....
使用時,gcc默認會鏈接glibc的,如果想使用其他lib,gcc鏈接時指定就能覆掘遲蓋掉glibc的。

我們重點講Ptmalloc,從而啟發程序員在寫程序時多考慮下內存分配情況,可以選擇或自己實現適合自己程序的內存管理lib。
Ptmalloc的歷史發展,blablabla......,Ptmalloc採取內存池管理,進程malloc時,通過brk(小於128K的內存)、mmap(大內存)從系統獲取地址空間,給進程使用,進程free時,不會立即通過brk、munmap將地址空間還給系統,會自己維護起來,叫做空閑內存,這些空閑內存在進程再次malloc時,還會被分出去,並且空閑內存會在特定條件下合並起來還給系統。

內存分配區,管理了一片內存,對外分發和回收,可以理解為一個內存池,分main arena和non main arena。
main arena:最早的分配區,管理著所有可分配的內存,通過brk,mmap等系統調用向系統申請內存。注意只有main arena可以操作Heap。
non main arena:由於多線程的出現,如果多有線程都操作main arena就會有競爭,需要加鎖控制,所以出現了non main arena,通過mmap向main arena申請一大塊內存,然後自己管理,可以理解為內存分銷商。
只有主線程在main arena上申請內存,子線程在non main arena上,non main arena的個數是有上限的,所以non main arena允許多個子線程共用,這樣就涉及到加鎖,所以程序涉及應避免子線程個數太多。

進程申請到的一塊內存叫做一個內存片,arena內部使用chunk數據結構來描述內存片,包括進程正在使用的內存片,和進程free掉的空閑內存片

A:是否main arena內存
M:使用mmap內存
P:上一塊是否被使用
size of previous chunk:上一塊沒有被使用時,表示上塊長度,被使用時是上塊用來存User data的。
Size of chunk:就是下一塊的size of previous chunk,釋放時填上本塊長度,供下塊合並用。

分給進程的內存片arena可以不管,但是進程free回來的,arena需要通過一定方式組織起來,方便進程再次使用。組織方式有下面幾種:

bins是個數組,包含128個bin,每個bin是個鏈表,分small bin和large bin兩種,各64個,small bin中chunk大小固定,兩個相鄰的small bin中的chunk大小相差8bytes,large bin中chunk大小是一定范圍內的,其中的chunk按大小排列。
空閑chunk按大小選擇合適的bin,按新舊順序掛到鏈表上,優先分配舊的chunk。

不大於max_fast (默認值為64B)的chunk被釋放後,首先會被放到fast bins 中,fast bins中的chunk並不改變它的使用標志P。這樣也就無法將它們合並,當需要給用戶分配的chunk小於或等於max_fast時,ptmalloc首先會在fast bins中查找相應的空閑塊。在特定的時候,ptmalloc會遍歷fast bins中的chunk,將相鄰的空閑chunk進行合並,並將合並後的chunk加入unsorted bin中。

進行malloc時,如果在fast bins中沒有找到合適的chunk,則ptmalloc會先在unsorted bin中查找合適的空閑chunk,如果unsorted bin不能滿足分配要求。malloc便會將unsorted bin中的chunk加入bins中。然後再從bins中繼續進行查找和分配過程。從這個過程可以看出來,unsorted bin可以看做是bins的一個緩沖區,增加它只是為了加快分配的速度。

前面的bin中都是回收回來的內存,top chunk才是內存的初始來源,每個arena都有一個top chunk,用來管理Heap的,Heap會在arena第一次分配內存時初始化,會分配一塊(chunk_size + 128K) align 4K的空間(132K)作為初始的Heap,top chunk占據整個空間,每次分配會在低地址出切出一片,如下圖:

回收時,只有和top chunk相連的內存才能和top chunk合並,才能進而還給系統。

子線程Heap:在main arena中mmap出64M的空間,叫做sub-heap,再在sub-heap上初始化Heap。
主線程的Heap才是真Heap,使用進程Heap,使用brk申請內存。

子線程的heap不夠用時,會在申請新的sub-heap,和老的sub-heap單向鏈表連起來,top chunk會搬到新sub-heap上。

描述mmap出來的內存,單獨管理,free時按閾值來決定是否munmap,有動態調整閾值功能,防止太頻繁的mmap和munmap。本文不關注。

即最後一次small request中因分割而得到的剩餘部分,它有利於改進引用局部性,也即後續對 small chunk 的 malloc 請求可能最終被分配得彼此靠近。
當用戶請求 small chunk而無法從small bin和unsorted bin得到時,會在large bin中找最合適的chunk,然後做切割,返回給用戶的User chunk,剩下的是Remainder chunk添加到unsorted bin中。這一Remainder chunk就將成為last remainder chunk。

下一塊為高地址,前一塊為低地址。

Glibc內存管理 華庭(庄明強)

㈥ 「圖文結合」Linux 進程、線程、文件描述符的底層原理

開發十年經驗總結,阿里架構師的手寫Spring boot原理實踐文檔

阿里架構師的這份:Redis核心原理與應用實踐,帶你手撕Redis

Tomcat結構原理詳解

說到進程,恐怕面試中最常見的問題就是線程和進程的關系了,那麼先說一下答案: 在 Linux 系統中啟瞎,進程和線程幾乎沒有區別

Linux 中的進程其實就是一個數據結構,順帶可以理解文件描述符、重定向、管道命令的底層工作原理,最後我們從操作系統的角度看看為什麼說線程和進程基本沒有區別。

首先,抽象地來說,我們的計算機就是這個東西:

這個大的矩形表示計算機的 內存空間 ,其中的小矩形代表 進程 ,左下角的圓形表示 磁碟 ,右下角的圖形表示一些 輸入輸出設備 ,比如滑鼠鍵盤顯示器等等。另外,注意到內存空間被劃分為了兩塊,上半部分表示 用戶空間 ,下半部分表示 內核空間

用戶空間裝著用戶進程需要使用的資源,比如你在程序代碼里開一個數迅盯組,這個數組肯定存在用戶空間;內核空間存放內核進程需要載入的系統資源,這一些資源一般是不允許用戶訪問的。但是注意有的用戶進程會共享一些內核空間的資源,比如一些動態鏈接庫等等。

我們用 C 語言寫一個 hello 程序,編譯後得到一個可執行文件,在命令行運行就可以列印出一句 hello world,然後程序退出。在操作系統層面,就是新建了一個進程,這個進程將我們編譯出來的可執行文件讀入內存空間,然後執行,最後退出。

你編譯好的那個可執行程序只是一個文件,不是進程,可執行文件必須要載入內存,包裝成一個進程才能真正跑起來。進程是要依靠操作系統創建的,每個進程都有它的固有屬性,比如進程號(PID)、進程狀態、打開的文件等等,進程創建好之後,讀入你的程序,你的程序才被系統執行。

那麼,操作系統是如何創建進程的呢? 對於操作系統,進程就是一個數據結構 ,我們直接來看 Linux 的源碼

task_struct 就是 Linux 內核對於一個進程的描述,也可以稱為「進程描述符」。源碼比較復雜,我這里就截取了一小部分比較常見的。

我們主要聊聊 mm 指針和 files 指針。 mm 指向的是進程的虛擬內存,也就是載入資源和可執行文件的地方; files 指針指向一個數組,這個數組里裝著所有該進程打開的文件的指針。

先說 files ,它是一個文件指針數組。一般來說,一個進程會從 files[0] 讀取輸入,將輸出寫入 files[1] ,將錯誤信息寫入 files[2] 。

舉個例子,以我們的角度 C 語言的 printf 函數是向命令行列印字元,但是從進程的角度來看,就是向 files[1] 寫入數據;同理, scanf 函數就是進程試圖從 files[0] 這個文件中讀取數據。

每個進程被創建時, files 的前三位被填入默認值,分別指向標准輸入流、標准輸出流、標准錯誤流。我們常悄昌空說的「文件描述符」就是指這個文件指針數組的索引 ,所以程序的文件描述符默認情況下 0 是輸入,1 是輸出,2 是錯誤。

我們可以重新畫一幅圖:

對於一般的計算機,輸入流是鍵盤,輸出流是顯示器,錯誤流也是顯示器,所以現在這個進程和內核連了三根線。因為硬體都是由內核管理的,我們的進程需要通過「系統調用」讓內核進程訪問硬體資源。

PS:不要忘了,Linux 中一切都被抽象成文件,設備也是文件,可以進行讀和寫。

如果我們寫的程序需要其他資源,比如打開一個文件進行讀寫,這也很簡單,進行系統調用,讓內核把文件打開,這個文件就會被放到 files 的第 4 個位置,對應文件描述符 3:

明白了這個原理, 輸入重定向 就很好理解了,程序想讀取數據的時候就會去 files[0] 讀取,所以我們只要把 files[0] 指向一個文件,那麼程序就會從這個文件中讀取數據,而不是從鍵盤:

同理, 輸出重定向 就是把 files[1] 指向一個文件,那麼程序的輸出就不會寫入到顯示器,而是寫入到這個文件中:

錯誤重定向也是一樣的,就不再贅述。

管道符其實也是異曲同工,把一個進程的輸出流和另一個進程的輸入流接起一條「管道」,數據就在其中傳遞,不得不說這種設計思想真的很巧妙:

到這里,你可能也看出「Linux 中一切皆文件」設計思路的高明了,不管是設備、另一個進程、socket 套接字還是真正的文件,全部都可以讀寫,統一裝進一個簡單的 files 數組,進程通過簡單的文件描述符訪問相應資源,具體細節交於操作系統,有效解耦,優美高效。

首先要明確的是,多進程和多線程都是並發,都可以提高處理器的利用效率,所以現在的關鍵是,多線程和多進程有啥區別。

為什麼說 Linux 中線程和進程基本沒有區別呢,因為從 Linux 內核的角度來看,並沒有把線程和進程區別對待。

我們知道系統調用 fork() 可以新建一個子進程,函數 pthread() 可以新建一個線程。 但無論線程還是進程,都是用 task_struct 結構表示的,唯一的區別就是共享的數據區域不同 。

換句話說,線程看起來跟進程沒有區別,只是線程的某些數據區域和其父進程是共享的,而子進程是拷貝副本,而不是共享。就比如說, mm 結構和 files 結構在線程中都是共享的,我畫兩張圖你就明白了:

所以說,我們的多線程程序要利用鎖機制,避免多個線程同時往同一區域寫入數據,否則可能造成數據錯亂。

那麼你可能問, 既然進程和線程差不多,而且多進程數據不共享,即不存在數據錯亂的問題,為什麼多線程的使用比多進程普遍得多呢 ?

因為現實中數據共享的並發更普遍呀,比如十個人同時從一個賬戶取十元,我們希望的是這個共享賬戶的余額正確減少一百元,而不是希望每人獲得一個賬戶的拷貝,每個拷貝賬戶減少十元。

當然,必須要說明的是, 只有 Linux 系統將線程看做共享數據的進程 ,不對其做特殊看待 ,其他的很多操作系統是對線程和進程區別對待的,線程有其特有的數據結構,我個人認為不如 Linux 的這種設計簡潔,增加了系統的復雜度。

在 Linux 中新建線程和進程的效率都是很高的,對於新建進程時內存區域拷貝的問題,Linux 採用了 -on-write 的策略優化,也就是並不真正復制父進程的內存空間,而是等到需要寫操作時才去復制。 所以 Linux 中新建進程和新建線程都是很迅速的

㈦ linux查看某個進程是否存在

使用 ps 命令,比如:
ps -au 看的是所有用戶進程
ps -aux 會看到所有的後台進程,包括一些系統的進程,就很多了
如果你只想找到某個指定進程
ps -ef | grep python 就會看到所有跟python有關的進程,其它進程,你換個名字就好了,
搜到有,那這個進程就存在,沒有也有搜索不到

㈧ Linux進程詳解

ps是Linux 中最基礎的瀏覽系統中的進程的命令。能列出系統中運行的進程,包括進程號、命令、CPU使用量、內存使用量等。接下來解讀一下Linux操作系統的進程和Windows「Ctrl+Alt+delete」直接的差異。

在進行了解進程命令之前需要知道進程的一些狀態

ps工具標識進程的5種狀態碼:

Linux操作系統進程執行的狀態轉換圖如圖所示:

下面來看一下 ps命令
ps --help命令可以查看ps命令的使用說明

或者使用 man ps命令 查詢ps的詳細說明

在 man手冊 關於ps的解讀中,總結了一下幾個參數的含義:

以上的參數是可以拼接使用的,那就了解一些常用的參數組合
ps aux命令

ps -ef命令

查看進程狀態這兩個是命令是最常用的,使用 ps aux 可以查看進程的詳細運行狀態等。使用 ps -ef 不僅可以顯示自身的PID,也可以顯示PPID(父進程)。但是顯示不了進程的運行狀態

top命令
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器

man手冊關於top的解釋

關閉進程,重啟進程
在上一片文章中 linux的目錄結構 裡面說過,在目錄/etc/init.d/目錄下包含許多系統各種服務的啟動和停止腳本。假設進程佔用內存較大或者進程異常,我們是重啟這個進程restart。如下圖所示:

我們重啟了mysqld這個進程,可以看出進程號已經改變(從15743到15964),說明進程已經重啟。

Linux下有3個特殊的進程,idle進程(PID=0), init進程(PID=1)和kthreadd(PID=2)

我們來看一下進程狀態[下面是刪減版,進程數量太多,列舉一部分]

可以看到很多進程的PPID號是1和2。也就是init進程和kthreadd進程。

在使用Windows系統的過程中,都碰到過應用程序卡死的情況。應對此問題,我們一般都是等待失去響應的程序恢復,或者是直接使用任務管理器將其強制關閉,然後再重新打開。

在Linux中,遇到特別耗費資源的進程,當然需要使用 top命令 查看進程佔用率高的進程。或者使用 free -m命令 查看內存剩餘。假設需要強殺進程來釋放空間。我們涉及到Linux中信號📶的知識,在這里簡單的描述一下,信號的詳解會在接下來的文章裡面敘述。
free -m命令查看內存空間

在linux中存在著64種信號
使用 kill -l命令 查看信號列表

在前面說過進程會被這些個信號> (進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號強制停止運行) 那問題就在於如何發信號給這些個進程。
使用kill命令發信號

我們從上面可以看到 mysqld進程被重啟了 。

關於Linux的這一塊進程的知識還有很多,後面的文章跟大家分享僵屍進程,孤兒進程等等知識,以及守護進程(daemon進程).

㈨ linux什麼是進程

您好,方法
linux是一個多用戶多任務的操作系統,多用戶是指多個用戶可以在同一個時間用計算機,多任務是指linux可以同時執行那個多個任務,它可以在還未執行完一個任務時又執行另一個任務。
每當運行一個任務時,系統就會啟動一個進程,進程是一個程序在其自身的虛擬地址空間中的一次執行活動,之所以要創建進程,就是為了使多個程序可以並發的執行。從而提高系統的資源利用率和吞吐量。
程序只是一個靜態的指令集合,兒進程是一個程序的動態執行過程,它具有生命期,是動態的產生和消亡的。
方法2
1、進程是資源申請,調度和獨立運行的單位,它使用系統中的運行資源,而程序不能申請系統資源,不能被系統調度,也不能作為獨立運行的單位,它不佔用系統的運行資源,
2、進程和程序無意義對應的關系,一方面一個程序可以由多個進程公用,即一個程序在運行過程中可以產生多個進程,另一個方面,一個進程在生命期內可以順序的執行若干個程序。
3、在linux系統中總是又很多的進程同時運行,系統根據進程號pid區分不同的進程,系統啟動後的第一個進程是init,它的pid是1,init是唯一一個由系統內核直接運行的進程。
4、新的進程可以用系統調用fork()來產生,就是從一個已經存在的舊進程中分出一個新進程來,舊進程就是新進程的父進程。

㈩ linux怎麼判斷一個進程是否存在

pidof + 進程名
如果進程存在,就會列印出該進程的pid。

熱點內容
如何用計算器刷安卓 發布:2025-05-20 01:09:29 瀏覽:576
移動寬頻密碼重置後怎麼辦 發布:2025-05-20 01:02:04 瀏覽:808
php不是內部命令 發布:2025-05-20 00:41:09 瀏覽:97
淘寶圖片上傳用什麼軟體 發布:2025-05-20 00:40:55 瀏覽:346
mysql64位forlinux 發布:2025-05-20 00:37:25 瀏覽:345
工傷輔助器如何配置 發布:2025-05-20 00:25:13 瀏覽:602
opencv存儲圖片 發布:2025-05-20 00:16:10 瀏覽:953
ug編程鏈輪 發布:2025-05-20 00:14:03 瀏覽:100
手機鎖屏壁紙配置失敗怎麼解決 發布:2025-05-20 00:10:38 瀏覽:757
源碼編譯的軟體怎麼卸載 發布:2025-05-20 00:05:29 瀏覽:489