进程相关概念、C程序的空间分配
進程的定義:
“進程”是操作系統的最基本、最重要的概念之一。但迄今為止對這一概念還沒有一個確切的統一的描述。下面給出幾種對進程的定義描述。
進程是程序的一次執行。進程是可以并行執行的計算。進程是一個程序與其使用的數據在處理機上順序執行時發生的活動。進程是程序在一個數據集合上的運行過程。它是系統進行資源分配和調度的一個獨立單位。
進程的特征:
- 動態性:是程序的一次執行;
- 發性:進程是可以并發執行;
- 獨立性:是系統進行資源分配和調度的一個獨立單位;
- 異步性:進程間的相互制約,使進程執行具有間隙;
- 結構性:進程是具有結構的。
進程與程序的主要區別:
(1)程序是永存的;進程是暫時的,是程序在數據集上的一次執行,有創建有撤銷,存在是暫時的;
(2)程序是靜態的觀念,進程是動態的觀念;
(3)進程具有并發性,而程序沒有;
(4)進程是競爭計算機資源的基本單位,程序不是。
(5)進程和程序不是一一對應的: 一個程序可對應多個進程即多個進程可執行同一程序; 一個進程可以執行一個或幾個程序。
進程概念和程序概念最大的不同之處在于:
(1)進程是動態的,而程序是靜態的。
(2)進程有一定的生命期,而程序是指令的集合,本身無“運動”的含義。沒有建立進程的程序不能作為1個獨立單位得到操作系統的認可。
(3)1個程序可以對應多個進程,但1個進程只能對應1個程序。進程和程序的關系猶如演出和劇本的關系。
如何查看系統中有哪些進程:
使用ps指令查看,在實際工作中,配合grep來查找程序中是否存在某一個進程。
ps命令:
ps命令用于查看系統中的進程狀態,格式為“ps [參數]”。
ps命令的參數以及作用:
| -a | 顯示所有進程(包括其他用戶的進程) |
| -u | 用戶以及其他詳細信息 |
| -x | 顯示沒有控制終端的進程 |
Linux系統中時刻運行著許多進程,如果能夠合理地管理它們,則可以優化系統的性能。在Linux系統中,有5種常見的進程狀態,分別為運行、中斷、不可中斷、僵死與停止,其各自含義如下所示。
R(運行):進程正在運行或在運行隊列中等待。
當執行ps aux命令后通常會看到如表2-7所示的進程狀態,表2-7中只是列舉了部分輸出值,而且正常的輸出值中不包括中文注釋。
top命令:
top命令用于動態地監視進程活動與系統負載等信息,其格式為top。
top命令相當強大,能夠動態地查看系統運維狀態,完全將它看作Linux中的“強化版的Windows任務管理器”。
ps -aux|grep 加所要查找的進程相關信息
其中|相當于管道,grep相當于濾網,信息從管道流下經過濾網查找自己想要的信息。
以下是使用ps查看進程: fhn@ubuntu:~/jincheng$ psPID TTY TIME CMD13580 pts/0 00:00:00 bash13757 pts/0 00:00:00 psfhn@ubuntu:~/jincheng$ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 225324 6108 ? Ss Jun27 0:30 /sbin/init auto noprompt root 2 0.0 0.0 0 0 ? S Jun27 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< Jun27 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< Jun27 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< Jun27 0:00 [kworker/0:0H-kb] root 9 0.0 0.0 0 0 ? I< Jun27 0:00 [mm_percpu_wq] root 10 0.0 0.0 0 0 ? S Jun27 0:01 [ksoftirqd/0] root 11 0.0 0.0 0 0 ? I Jun27 1:17 [rcu_sched] root 12 0.0 0.0 0 0 ? S Jun27 0:01 [migration/0] root 13 0.0 0.0 0 0 ? S Jun27 0:00 [idle_inject/0] root 14 0.0 0.0 0 0 ? S Jun27 0:00 [cpuhp/0] root 15 0.0 0.0 0 0 ? S Jun27 0:00 [cpuhp/1] root 16 0.0 0.0 0 0 ? S Jun27 0:00 [idle_inject/1] root 17 0.0 0.0 0 0 ? S Jun27 0:01 [migration/1] root 18 0.0 0.0 0 0 ? S Jun27 0:00 [ksoftirqd/1] root 20 0.0 0.0 0 0 ? I< Jun27 0:00 [kworker/1:0H-kb] root 21 0.0 0.0 0 0 ? S Jun27 0:00 [cpuhp/2] root 22 0.0 0.0 0 0 ? S Jun27 0:00 [idle_inject/2] root 23 0.0 0.0 0 0 ? S Jun27 0:01 [migration/2] root 24 0.0 0.0 0 0 ? S Jun27 0:00 [ksoftirqd/2] root 26 0.0 0.0 0 0 ? I< Jun27 0:00 [kworker/2:0H-kb] root 27 0.0 0.0 0 0 ? S Jun27 0:00 [cpuhp/3] root 28 0.0 0.0 0 0 ? S Jun27 0:00 [idle_inject/3]什么是進程標識符:
系統給每個進程定義了一個唯一標識該進程的非負正數,稱作進程標識符。進程標識符可以簡單的表示為主進程表中的一個索引。當某一進程終止后,其標識符可以重新用作另一進程的標識符。不過,在任何時刻,一個標識符所代表的進程是唯一的。系統把標識符 0 和 1 保留給系統的兩個重要進程。進程 0 是調度進程,它按一定的原則把處理機分配給進程使用。進程 1 是初始化進程,它是程序/sbin/init 的執行。進程 1 是 UNIX 系統那其它進程的祖先,并且是進程結構的最終控制者。
進程屬性-標識符:
每個進程都有6個重要的ID:進程ID、父進程ID、有效用戶ID、有效組ID、實際用戶ID和實際組ID。這6個標識符保存在進程的PCB中。
什么叫父進程和子進程:
- 父進程:指已創建一個或多個子進程的進程。在UNIX里,除了進程0以外的所有進程都是由其他進程使用系統調用fork創建的,這里調用fork創建新進程的進程即為父進程,而相對應的為其創建出的進程則為子進程,因而除了進程0以外的進程都只有一個父進程,但一個進程可以有多個子進程。
- 子進程:指的是由另一進程(對應稱之為父進程)所創建的進程。子進程繼承了對應的父進程的大部分屬性,如文件描述符。在Unix中,子進程通常為系統調用fork的產物。在此情況下,子進程一開始就是父進程的副本,而在這之后,根據具體需要,子進程可以借助exec調用來鏈式加載另一程序。
C程序的存儲空間是如何分配的?
大佬博客:堆和棧詳解
程序運行時的內存分區主要分為BSS段、數據段、代碼段、堆、棧
- BSS段:Block Started by Symbol,一般是指存放程序中未初始化的全局變量的一塊內存區域。BSS段屬于靜態內存分配。
- 數據段:data segment,一般是指用來存放程序中已初始化的全局變量的一塊內存區域。 static 意味著 在數據段中 存放變量,數據段屬于靜態內存分配。
- 代碼段:code segment/text segment,通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,并且內存區域通常屬于只讀,某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些 只讀的常數變量 ,例如字符串常量等。程序段為程序代碼在內存中的映射。一個程序可以在內存中有多個副本。
- 堆:heap,堆是用于存放進程運行中被動態分配的內存段,它的大小并不固定,可動態擴張或縮減。當進程調用malloc/free等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張)/釋放的內存從堆中被剔除(堆被縮減)。
- 棧:stack,棧又稱堆棧,存放程序的局部變量(但不包括static聲明的變量, static 意味著 在數據段中 存放變量)。除此以外,在函數被調用時,棧用來傳遞參數和返回值。由于棧的先進后出特點,所以棧特別方便用來保存/恢復調用現場。儲動態內存分配,需要程序員手工分配,手工釋放。
如上圖所示:紅色箭頭指向的是代碼段,粉色箭頭指向的在函數外被初始化過的變量,我們叫做數據段(main函數里面初始化的變量屬于局部變量,其生命周期和全局變量一樣,所以上方圖片int a=0屬于數據段,圖片有點錯誤),黃色箭頭指向的在函數外沒有被初始化的變量(BSS段),自己編寫好的C代碼編譯后會生成一個可執行文件,當我們運行這個可執行文件是操作系統會給程序劃分一段內存空間,這段內存空間就相當于左邊那副黃色的圖所示,從高地址到低地址會把代碼文件里面的代碼段載入到對應的地址,其中malloc申請的空間是在堆上面,棧存放的內容是:函數調用返回的地址、相關參數、函數里面的局部變量和寄存器內容等。自動變量(也就是局部變量)以及每次函數調用所需要的保存的信息都存放在此段中,每次函數調用時,其返回地址以及調用者的環境信息(例如某些機器寄存器的值)都存放在棧中。然后最近被調用的函數在棧上為其自動和臨時變量分配存儲空間,通過這種方式使用棧可以遞歸調用C函數,遞歸函數每次調用自身時,就使用一個新的棧幀,因此函數調用實例中的變量不會影響到另一個函數調用實例中的變量。左圖中:最上面是命令行和環境變量也就是argc和argv這些東西。
總結
以上是生活随笔為你收集整理的进程相关概念、C程序的空间分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像基本运算概述型
- 下一篇: linux 与 windows操作系统的