1.一個程序從寫出到運行經歷了什麼?編程
在IDE上編程的時候,程序寫出到運行的過程被隱藏了,因而今天我跟着一個程序經歷了它生命的歷程。網絡
一個簡單的程序 hello.c多線程
//hello.c
#include<stdio.h> int main() { printf("hello my fang\n");
return 0;
}
首先咱們在編輯器裏建立並保存了一個文件,這個文件是源文件,hello.c。源文件裏的每個字符在系統中是用ASCⅡ碼來表示,而每個字符都是用字節來存儲的(事實上計算機裏全部的文件,數據等全都是用位來表示和存儲的,八位表明一個字節)。hello.c源文件在預處理器的做用下處理成hello.i的文件(程序中預處理語句會告訴預處理器),hello.i在編譯器的做用下翻譯爲hello.s的彙編程序,而後在彙編器的做用下,把程序翻譯爲機器語言指令打包在二進制文件hello.o中。程序中的printf函數存在一個已經單獨預編譯好了的文件printf.o,在連接器的做用下與hello.o文件合併在一塊兒獲得hello文件,而這個hello文件就是以二進制保存的可執行的目標程序,系統把它加載到內存中,而後執行。併發
一個典型的系統硬件的組成包括CPU(中央處理器,總線,I/O,主存(一個臨時的存儲器,在處理器處理程序時,存放程序信息和數據的地方)。編輯器
hello文件生成後被存在磁盤(I/O設備)中,而後在命令下,hello文件被送入主存,處理器這時候開始處理程序(從程序的入口main()開始),此時文件會被送入處理器裏的寄存器中處理,處理完畢後把結果送到顯示器上,因而在顯示器上便出現了hello my fang。至此這個程序壽終正寢。函數
2.關於操做系統的一些基本概念spa
全部程序對硬件的操做都必須通過操做系統,操做系統有兩個基本的功能:1.防止硬件被失控的程序濫用 2.嚮應用程序提供簡單一致的機制來控制複雜而又不一樣的硬件設備。操做系統經過如下幾個抽象來實現這兩個功能。操作系統
1.進程線程
進程是操做系統對一個正在運行的程序的抽象,操做系統能夠同時運行多個進程,但每一個進程表現爲獨自使用硬件。一個進程與另外一個進程交錯執行叫作併發運行,也就是說在一個時段內多個進程在運行,但在某個時刻,只有一個進程在運行,但宏觀上這幾個進程都有進度,是由於系統同過上下文(一個進程運行的全部狀態叫上下文)切換來併發的執行多個進程。翻譯
2.線程
每一個進程是由一個或多個進程組成。能夠簡單的理解爲進程是一個大項目,而線程是項目組的工做人員。多線程比多進程更容易共享數據(更高效)。
3.虛擬存儲器
由於每個進程在宏觀上表現爲單獨運行,因此想象每個進程在運行時單獨佔了一個主存。虛擬存儲器是對程序存儲器的抽象。
4.文件
文件就是字節的序列。因此每一個I/O設備甚至網絡均可以看做文件。文件是對I/O設備的抽象。
此外兩個術語。併發:一個同時具備多個進程的系統 並行:使用併發使一個系統運行更快