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