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