【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)
上一篇文章學(xué)了堆,棧以及靜態(tài)存儲(chǔ)區(qū)。它們實(shí)際上都是針對(duì)進(jìn)程來(lái)說(shuō)的。那么程序與進(jìn)程有什么區(qū)別呢?
本文不細(xì)講程序與進(jìn)程。
1 程序與進(jìn)程
1.1 什么是程序
寫(xiě)完的.c文件是源文件。也叫源代碼。
將源代碼編譯后,會(huì)生成可執(zhí)行文件程序(Linux下是.out,windows下是.exe)。這個(gè)文件就是程序。也叫作可執(zhí)行代碼。
比如下面的源代碼對(duì)應(yīng)的可執(zhí)行文件的內(nèi)容:
那么程序文件中,各個(gè)段的作用是什么?
- 堆和棧是在程序運(yùn)行開(kāi)始后才正式存在。是程序運(yùn)行的基礎(chǔ)
- .bss段存放的是未初始化的全局變量和靜態(tài)局部變量(初始化為0的也算未初始化這里)
- .text段存放的是程序中的可執(zhí)行代碼
- .data段存放的是已經(jīng)初始化了的全局變量和局部靜態(tài)變量.
- .rodata段存放的是程序中的常量值。如字符串字面量。
上述圖中,程序中的函數(shù)的局部變量是在程序運(yùn)行開(kāi)始后才在棧空間分配內(nèi)存。那么在可執(zhí)行文件中,局部變量是怎么記錄的?
實(shí)際上在可執(zhí)行文件中有一個(gè)符號(hào)表,這個(gè)符號(hào)表記錄了所有符號(hào)(變量和函數(shù)名)的信息。當(dāng)程序加載到內(nèi)存的時(shí)候,加載器根據(jù)符號(hào)表里記錄的關(guān)于局部變量的信息來(lái)為局部變量分配棧空間。
1.2 什么是進(jìn)程
程序是可執(zhí)行文件。那么將可執(zhí)行文件加載到內(nèi)存中去運(yùn)行就形成了進(jìn)程。進(jìn)程的內(nèi)存布局與可執(zhí)行程序文件的布局的關(guān)系大致如下(不夠細(xì)致,這里只是籠統(tǒng)的講解它們的區(qū)別):
可以看到進(jìn)程中是沒(méi)有File Header字段的。
1.3 程序與進(jìn)程的不同點(diǎn)
- 程序是靜態(tài)的概念。表現(xiàn)形式為一個(gè)可執(zhí)行文件
- 進(jìn)程是動(dòng)態(tài)的概念。由操作系統(tǒng)加載程序運(yùn)行后變?yōu)檫M(jìn)程
- 每個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程
- 每個(gè)進(jìn)程只能對(duì)應(yīng)一個(gè)進(jìn)程
1.4 程序術(shù)語(yǔ)的對(duì)應(yīng)關(guān)系
- 靜態(tài)存儲(chǔ)區(qū)通常指進(jìn)程(或者程序也一樣)中的:.data,.bss,段
- 只讀存儲(chǔ)區(qū)通常指進(jìn)程中的:.rodata段
- 局部非靜態(tài)變量所占空間為棧空間 .是進(jìn)程里的
- 動(dòng)態(tài)空間為堆中的空間 ,也是進(jìn)程里的
- 程序的可執(zhí)行代碼存在于.text段。是只讀的。
2 總結(jié)
- 熟練的區(qū)分程序與進(jìn)程的一些概念。概念很容易說(shuō)錯(cuò)。
總結(jié)
以上是生活随笔為你收集整理的【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多普勒效应及多普勒频移的简单推导
- 下一篇: Java常用设计模式的实例学习系列-绪论