linux之地址空間

程序:一組指令的有效集合。它是靜態的,不具有任何的運行意義。程序最終轉換為二進制文件。

進程:程序的執行就是進程。可以把它看成獨立的程序,在內存中有其對應的代碼空間和數據空間。一個進程所擁有的數據和代碼只屬于自己。進程是資源分配的基本單位,也是調度運行的基本單位。

進程和程序并不是一一對應的關系,相同的程序運行在不同的數據集上就是不同的進程。

進程還具有并發性和交往性,而程序卻是封閉的。

這節中有幾個重要的問題,我舉個例子給大家看吧~

第一例:


這段代碼是說什么的呢?顯然,它輸出了函數、初始化的變量,未初始化的變量,堆區,棧區的地址,那么,這些地址有什么規律呢?


可以看的出來,它的地址是依次從低地址到高地址。

然而,還有一類特殊的函數---主函數,它的地址是如何分布的呢?


地址為:


顯然,,帶有命令行參數的主函數的地址比前面比較的棧區的地址還要大。

所以就有了如圖的地址空間:(如果地址空間中的數都是連續的,則我們稱之為線性地址空間)


第二例:

父進程和子進程:


運行結果為:


在這里,我們會不會很奇怪一個問題呢?這里將if和else里邊的內容都執行了。然而在我們經常編寫的代碼中,if和else是不能同時執行的。進程卻在這里做到了。

fork():是創建子進程。這里的getpid()是獲取到子進程的pid,getppid()是獲取到父進程的pid(即這里的2677);

我們發現,父進程和子進程指向的是同一塊內存,那么我們也應該想到他們的指向也應該是一樣的,(這只是我們的推測哦),,看個例子我們就知道了。

eg:


結果是什么呢?


看到那個200和100了嗎?它們的值竟然不一樣。

說明它們并不是同一個指向,那么為什么地址一樣呢?這里就引出了我們的虛擬地址。

虛擬地址空間:在一個帶有虛擬存儲器的系統中,cpu從一個有N=2的n次方個地址的地址空間中生成虛擬地址。

如圖所示:


在這里,虛擬地址空間通過頁表和MMU(存儲器管理單元)映射到物理地址中,它們的物理地址是不相等的,所以最后得到的值也不相等。



今天的內容先說到這里嘍。~~~吐舌頭吐舌頭

歡迎來訪,多多提議哦。害羞害羞






本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382896.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言操作符 進階 (常見錯誤及細節)

1.算術操作符- * / % % 只適用于整數類型運算,其余運算符也可用于浮點運算。2.移位操作符 左移:左邊丟棄,右邊補0; 右移:不同編譯器采取的移位方式不同,所有有了“右移”的程序不可移植1.邏輯移位&#xff…

輸出該數二進制表示中1的個數。求取十進制數字元素1的個數 (3種方法)

/* ***求取十進制數字元素1的個數 */int fun(int x) {int count 0;int i, j, k;/***方法2 負數不可計算,需要改進*/while (x ! 0){if (x & 1 1){count;}x x >> 1;}/****方法1*/while (x ! 0){x x&(x - 1);count;}return count; }int main() {in…

C語言隨機數生成超詳解

1.首先來看一段簡單的代碼 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int i;printf(" %6d\n", rand());system("pause"); }printf(" %6d\n", rand());sys…

可變參數列表

一個函數在不同的時候接受不同數目的參數。 stdarg宏可變參數列表是通過宏來實現的&#xff0c;這些宏定義于stdarg.h頭文件中。這個頭文件聲明了一個類型va_list和三個宏---va_start,va_arg,va_end。va_list用于聲明變量的類型。va_start準備訪問可變參數。va_arg用于訪問參數…

完成猜數字游戲 //C語言 猜數字游戲(編寫過程詳解)

int i, j, k;int num 0;/*生成隨機數字*/num rand();printf("%d\n", num); 選擇玩游戲還是退出 void play(int x) {printf("%d\n", x);printf("開始游戲"); } scanf("%d", &k);switch (k){case 1:play(num);case 2:break;} 循環…

靜態順序表

順序表是在計算機內存中以數組的形式保存的線性表&#xff0c;是指用一組地址連續的存儲單元依次存儲數據元素的線性結構。線性表采用順序存儲的方式存儲就稱之為順序表。順序表是將表中的結點依次存放在計算機內存中一組地址連續的存儲單元中。 順序表分為靜態存儲的順序表和動…

C語言 淺談可變參數

1.可變參數產生原因 首先來看一個簡單的例子。 int Add(int x, int y) {return x y; } int main() {int sum 0;sum Add(1, 2);//sum Add(1, 2, 3);//sum Add(1);system("pause");return 0; } 我們可以看到&#xff0c;對于這個代碼只可以計算兩個數的加法。 …

有兩個鏈表a,b,設結點包括學號,姓名。從a鏈表中刪去與b鏈表中有相同學號的那些結點。

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct linknode { int num;char name[20];struct linknode *next; }node; node *creat() { node *h NULL,*s,*t;int d;int i 1; char name1[20];while(1) { printf("輸入第…

C語言模擬實現標準庫函數之strlen()

strlen() strlen所作的僅僅是一個計數器的工作&#xff0c;它從內存的某個位置 &#xff08;可以是字符串開頭&#xff0c;中間某個位置&#xff0c;甚至是某個不確定的內存區域&#xff09; 開始掃描&#xff0c;直到碰到第一個字符串結束符\0為止&#xff0c;然后返回計數…

C語言模擬實現標準庫函數之strcpy()

strcpy(dest,src) strcpy是一種C語言的標準庫函數&#xff0c;strcpy把從src地址開始且含有\0結束符的字符串復制到以dest開始的地址空間&#xff0c;返回值的類型為char*。 char * my_strcpy(char *str2, char *str1) {assert(*str2);assert(*str1);while(*str1!0){ *str2 …

C語言模擬實現標準庫函數之strcat()

strcat() strcat用于將兩個char類型鏈接的函數。 char * my_strcat(char *str1, char *str2) {assert(str2);assert(str1);char * p str1;while (*str1 ! 0){str1;}while (*str1 *str2){;}return p; } int main() {char str1[10] "abc";char str2[10] "de…

模板

模板是泛型編程的基礎&#xff0c;即與類型無關的邏輯代碼。 利用模板機制可以顯著減少冗余信息&#xff0c;能大幅度地節約程序代碼&#xff0c;進一步提高面向對象程序的可重用性和可維護性。 模板是實現代碼重用機制的一種工具&#xff0c;它可以實現類型參數化&#xff1b;…

C語言模擬實現標準庫函數之strstr()

strstr() strstr(str1,str2) 函數用于判斷字符串str2是否是str1的子串。如果是&#xff0c;則該函數返回str2在str1中首次出現的地址&#xff1b;否則&#xff0c;返回NULL。 char* my_strstr(const char* dest, const char* src) {char * str1 dest;char * str2 src;char …

linux-----強大的find

我又回來了。哈哈。今天我們來說一下linux中的另一個強大的find命令&#xff0c;灰常重要&#xff0c;灰常重要&#xff0c;灰常重要。顯而易見&#xff0c;find就是對某一個文件或者目錄的查找嘍。但是它的一個顯著的特點就是&#xff1a;一般放在后臺執行&#xff0c;從整個文…

C語言模擬實現標準庫函數之strchr()

strchr() 查找字符串s中首次出現字符c的位置 char * my_strchr(char *str1, char str2) {while (*str1 ! str2 && *str1 ! NULL){str1;}return str1; }int main() {char string[17];char *ptr, c r;strcpy(string, "Thisisastring");ptr my_strchr(string…

python 多人連接mysql 進行事務操作 對mysql加鎖與釋放鎖

python 多人連接mysql 對mysql進行事務操作 對mysql加鎖與釋放鎖 下面這個是user1代碼塊 # -*- coding: utf-8 -*- # user1 import pymysql import timeconn pymysql.connections.Connection(host"localhost", userdebian-sys-maint, passwordwL5wsDKDub4gT2EU…

C語言模擬實現標準庫函數之strcmp()

strcmp() C/C函數&#xff0c;比較兩個字符串 設這兩個字符串為str1&#xff0c;str2&#xff0c; 若str1str2&#xff0c;則返回零&#xff1b; 若str1<str2&#xff0c;則返回負數&#xff1b; 若str1>str2&#xff0c;則返回正數。 char * my_strcmp(char *key,…

linux之task_struct

每個進程中都有一個進程控制塊--PCB。PCB--維護進程相關的信息。然而&#xff0c;linux內核的進程控制塊就是task_struct結構體&#xff0c;它可以保存進程的信息。 所有運行在系統里的進程都以task_struct鏈表的形式存在內核里。 每個進程都將它的信息放在task_struct結構體…

python 用元類 type 實現對數據庫的ORM 映射

python 實現對數據庫的ORM 映射 如果使用pymysql 操作數據庫 不借助框架的話&#xff0c;頻繁寫sql語句, 的確比較麻煩 這里借助 type 元類 對 數據表類實現了 與mysql之間的 映射 直接上代碼 import pymysqldef conn_database_execute(sql_str):conn pymysql.connect(host…

C語言模擬實現標準庫函數之memcpy()

memcpy&#xff08;&#xff09; 1.如果我們需要對一個數組初始化&#xff0c;把數組的內容全部置0&#xff0c;那么能不能用strcpy() int main() {char arr1[10] { 0 };char arr2[10] " abcdefg ";strcpy(arr2, arr1);system("pause");return 0; } 我…