<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      01-計算機系統漫游

      編譯過程分為四個階段:預處理、編譯、匯編、鏈接
      -w1201

      gcc -E hello.c -o hello.i   //預處理
      gcc -S hello.i -o hello.s   //編譯
      gcc -c hello.s -o hello.o   //匯編
      gcc hello.o -o hello        //生成可執行文件
      

      hello.c為例子:

      #include <stdio.h>
      #define ANSWER 42
      int main() {
          int obj = ANSWER;
          return 0;
      }
      

      預編譯實際上是進行頭文件、宏定義的替換和組織,執行上述預編譯命令可查看其內容(展示部分結果):

      # 1 "hello.c"
      # 1 "<built-in>"
      # 1 "<command-line>"
      //...省略
      # 216 "/usr/lib/gcc/x86_64-redhat-linux/8/include/stddef.h" 3 4
      typedef long unsigned int size_t;
      # 34 "/usr/include/stdio.h" 2 3 4
      //...省略
      typedef __builtin_va_list __gnuc_va_list;
      # 37 "/usr/include/stdio.h" 2 3 4
      ...
      # 28 "/usr/include/bits/types.h" 2 3 4
      
      
      typedef unsigned char __u_char;
      typedef unsigned short int __u_short;
      typedef unsigned int __u_int;
      
      //...省略
      
      
      typedef int __sig_atomic_t;
      # 39 "/usr/include/stdio.h" 2 3 4
      # 1 "/usr/include/bits/types/__fpos_t.h" 1 3 4
      
      
      
      
      # 1 "/usr/include/bits/types/__mbstate_t.h" 1 3 4
      # 13 "/usr/include/bits/types/__mbstate_t.h" 3 4
      typedef struct
      {
        int __count;
        union
        {
          unsigned int __wch;
          char __wchb[4];
        } __value;
      } __mbstate_t;
      # 6 "/usr/include/bits/types/__fpos_t.h" 2 3 4
      
      //...省略
      
      extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
      # 864 "/usr/include/stdio.h" 3 4
      extern int __uflow (FILE *);
      extern int __overflow (FILE *, int);
      # 879 "/usr/include/stdio.h" 3 4
      
      # 2 "hello.c" 2
      
      
      # 3 "hello.c"
      int main() {
          int obj = 42;
          return 0;
      }
      
      

      我們發現預編譯生成的.i文件中已經不存在宏ANSWER了,其值被替換成42。編譯階段主要是對代碼進行詞法分析、語法分析、語義分析、中間代碼優化等等。

      然后是通過gcc -S選項進行編譯,編譯生成的.s是匯編程序,結果如下:

      	.file	"hello.c"
      	.text
      	.globl	main
      	.type	main, @function
      main:
      .LFB0:
      	.cfi_startproc
      	pushq	%rbp
      	.cfi_def_cfa_offset 16
      	.cfi_offset 6, -16
      	movq	%rsp, %rbp
      	.cfi_def_cfa_register 6
      	movl	$42, -4(%rbp)
      	movl	$0, %eax
      	popq	%rbp
      	.cfi_def_cfa 7, 8
      	ret
      	.cfi_endproc
      .LFE0:
      	.size	main, .-main
      	.ident	"GCC: (GNU) 8.4.1 20200928 (Red Hat 8.4.1-1)"
      	.section	.note.GNU-stack,"",@progbits
      

      接著就是匯編,將匯編程序轉換為ELF(Executable and Linkable Format)格式的目標.o程序,可通過gcc -c的方式,或直接調用as進行匯編:as -c hello.s -o hello.o

      當拿到.o文件后就可以進行鏈接或者直接生成可執行程序,鏈接的話需要加載鏈接庫,鏈接庫有動態鏈接庫和靜態鏈接庫。以上就是代碼編譯系統的過程。

      那為什么要理解一個程序的編譯過程呢?要理解編譯系統的原因:

      • 理解編譯系統可以優化程序的性能
      • 理解鏈接時出現的錯誤
      • 避免安全漏洞

      接下來站在全局的角度大致了解硬件架構圖,以便于我們了解程序執行的流程:
      -w957

      其中CPU(Central Processing Unit)中央處理單元包括:PC(Program Count)、寄存器堆(Register file)、ALU(Arithmatic/logic Unit)三部分。

      那么執行一個hello程序,計算機內部會發生什么呢?(通常用戶是在shell終端上執行代碼的)
      -w883
      -w829
      -w828

      上圖就是程序執行流程,概述如下:

      • IO設備鍵盤輸入字符串"./hello",shell程序將輸入字符讀入寄存器,處理器會把hello字符通過系統總線和內存總線加載至內存(此時還沒有按下回車)。
      • 當按下回車執行時,shell就知道我們已經完成命令輸入,然后shell會執行一系列指令加載可執行文件hello。
      • 加載的過程實際上是將代碼所需要的數據從磁盤拷貝至內存。拷貝的過程被稱為DMA(Direct Memory Access),DMA技術可將數據不經過處理器,從磁盤直接加載至內存,我們知道CPU時間是非常寶貴的,磁盤讀取本身就很慢,通過DMA技術,拷貝操作不經過處理器,這樣就不會剝奪占用CPU時間,達到更加高效的作用(對計算密集型主機來說特別有幫助)。
      • 當可執行文件hello中的代碼和數據被加載至內存中后,處理器就開始執行函數代碼,那么一個程序運行起來就變為了進程。

      那么上面說到了shell程序,其實更準確的說法應該是shell進程,進程是正在運行中的程序,當用戶在shell中運行hello進程的時候,其實shell會發生中斷,系統會保存其上下文信息,然后轉而運行hello進程,當hello進程運行完畢后,又恢復shell進程上下文信息。大致形勢如下:
      -w795

      在計算機系統中,每個進程都對應了4GB的虛擬內存地址,操作系統將實際硬件上的物理地址通過內存映射方式,將物理地址映射為連續大小4GB的虛擬內存地址空間,這4GB空間中,由低地址向高地址的3GB空間劃分為用戶空間,然后高地址部分的1GB劃分為內核空間,專門用于保存系統級別數據信息。那么用戶對一個程序的操作實際上是在用戶空間進行的,劃分如下:
      -w719

      關于系統加速,有以下三種定律:

      • 阿姆達爾定律
        -w1155
        -w796

      • 古斯塔法森定律
        -w1163

      • 孫-倪定律
        -w1163
        -w1141

      三種模型關系:
      -w867

      關于并發、并行,首先什么是并發?什么是并行?
      并行parallelise)同時刻(某點),即并行是在某一時刻上有多個任務在執行。
      并發concurrency)同時間(某段),即并發是在某一時段內有多個任務在執行。

      如何獲得更高的計算力:

      • 線程級并發:增加CPU核心數提高系統行呢哥
      • 指令級并行:流水指令集
      • 單指令多數據并行:SIMD指令加速
      posted @ 2023-07-13 19:38  miseryjerry  閱讀(116)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产无遮挡免费真人视频在线观看| 亚洲AV无码一二区三区在线播放| 97人妻无码一区| 亚洲av永久无码精品天堂久久| 日本一区不卡高清更新二区| 一个人在线观看免费中文www| 四虎亚洲精品高清在线观看 | 精品一区二区中文字幕| 精品人妻中文字幕av| 五月天国产成人av免费观看| 欧美性猛交xxxx乱大交丰满| 性男女做视频观看网站| 天堂网在线观看| 都市激情 在线 亚洲 国产| 人妻无码久久久久久久久久久| 乡宁县| 国产精品一区中文字幕| 高清破外女出血AV毛片| 巨胸喷奶水视频www免费网站| 亚洲成人精品一区二区中| 高雄市| 野外做受三级视频| 国产成人亚洲精品成人区| 9191国语精品高清在线| 色悠久久网国产精品99| 日本亚洲色大成网站www久久| 日本精品不卡一二三区| 亚洲国产精品综合久久网各| 国产av无码专区亚洲av软件| 超碰人人模人人爽人人喊手机版| 牲欲强的熟妇农村老妇女视频| 亚洲人成网线在线播放VA| 亚洲成在人线AV品善网好看| 亚洲精品国产男人的天堂| 成人午夜激情在线观看| 国产啪视频免费观看视频| 亚洲成色精品一二三区| 亚洲国产成人精品激情姿源| 少妇高潮水多太爽了动态图| 91产精品无码无套在线| 色老头亚洲成人免费影院|