1. 程式人生 > >作業系統-使用者-任務-動態連結-靜態連結

作業系統-使用者-任務-動態連結-靜態連結

作業系統-使用者-任務

1、根據在同一時間使用計算機使用者的多少,作業系統可分為單使用者作業系統和多使用者作業系統。

2、單使用者作業系統是指一臺計算機在同一時間只能由一個使用者使用,一個使用者獨自享用系統的全部硬體和軟體資源,而如果在同一時間允許多個使用者同時使用計算機,則稱為多使用者作業系統。

3、如果使用者在同一時間可以執行多個應用程式(每個應用程式被稱作一個任務),則這樣的作業系統被稱為多工作業系統

4、如果一個使用者在同一時間只能執行一個應用程式,則對應的作業系統稱為單任務作業系統。

5、早期的DOS作業系統是單使用者單任務作業系統

6、Linux 、UNIX是多使用者多工作業系統。

7、Windows XP 則是單使用者多工作業系統;

8、Windows系列均是單使用者多工作業系統,除了目前使用的Windows Server 2003 和Windows Server 2008是多工多使用者作業系統。

9、現在的Win7作業系統也是多使用者的作業系統。

 

動態連結 靜態連結

1、動態連結庫、靜態庫、import庫區別

動態連結庫(Dynamic Linked Library):

Windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態連結庫中。其中有3個最重要的DLL,Kernel32.dll,它包含用於管理記憶體、程序和執行緒的各個函式;

User32.dll,它包含用於執行使用者介面任務(如視窗的建立和訊息的傳送)的各個函式;GDI32.dll,它包含用於畫圖和顯示文字的各個函式。

2、靜態庫(Static Library):

函式和資料被編譯進一個二進位制檔案(通常副檔名為.LIB)。在使用靜態庫的情況下,在編譯連結可執行檔案時,連結器從庫中複製這些函式和資料並把它們和應用程式的其它模組

組合起來建立最終的可執行檔案(.EXE檔案)。

3、匯入庫(Import Library):

在使用動態連結庫的時候,往往提供兩個檔案:一個引入庫和一個DLL。引入庫包含被DLL匯出的函式和變數的符號名,DLL包含實際的函式和資料。在編譯連結可執行檔案時,只需

要連結引入庫,DLL中的函式程式碼和資料並不複製到可執行檔案中,在執行的時候,再去載入DLL,訪問DLL中匯出的函式。

在執行Windows程式時,它通過一個被稱作“動態連結”的程序與Windows相接。一個Windows的.EXE檔案擁有它使用不同動態連結庫的引用,所使用的函式即在那裡。當Windows程

序被載入到記憶體中時,程式中的呼叫被指向DLL函式的入口,如果DLL不在記憶體中,系統就將其載入到記憶體中。

當連結Windows程式以產生一個可執行檔案時,你必須連結由程式設計環境提供的專門的“匯入庫(import library)庫”。這些匯入庫包含了動態連結庫名稱和所有Windows函式呼叫的

引用資訊。連結程式使用該資訊在.EXE檔案中構造一個表,當載入程式時,Windows使用它將呼叫轉換為Windows函式。

4、靜態庫與匯入庫的區別:

匯入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行程式碼、符號表等等,而對於匯入庫而言,其實際的執行程式碼位於動態庫中,匯入庫只包含了

地址符號表等,確保程式找到對應函式的一些基本地址資訊。

 

5、靜態連結與動態連結:

靜態連結方法:#pragma comment(lib, "test.lib") ,靜態連結的時候,載入程式碼就會把程式會用到的動態程式碼或動態程式碼的地址確定下來

靜態庫的連結可以使用靜態連結,動態連結庫也可以使用這種方法連結匯入庫

動態連結方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用這種方式的程式並不在一開始就完成動態連結,而是直到真正呼叫動態庫程式碼時,載入程式才計算(被呼叫的那部分)動態程式碼的邏輯地址,然後等到某個時候,程式又需要呼叫另外某塊動態程式碼時,載入程式又去計算這部分程式碼的邏輯地址,所以,這種方式使程式初始化時間較短,但執行期間的效能比不上靜態連結的程式。

在軟體開發的過程中,大家經常會或多或少的使用別人編寫的或者系統提供的動態庫或靜態庫,但是究竟是使用靜態庫還是動態庫呢?他們的適用條件是什麼呢?

簡單的說,靜態庫和應用程式編譯在一起,在任何情況下都能執行,而動態庫是動態連結,顧名思義就是在應用程式啟動的時候才會連結,所以,當用戶的系統上沒有該動態庫時,應用程式就會執行失敗。再看它們的特點:

6、動態庫:

1.共享:多個應用程式可以使用同一個動態庫,啟動多個應用程式的時候,只需要將動態庫載入到記憶體一次即可;

2.開發模組好:要求設計者對功能劃分的比較好。

靜態庫:程式碼的裝載速度快,執行速度也比較快,因為編譯時它只會把你需要的那部分連結進去,應用程式相對比較大。但是如果多個應用程式使用的話,會被裝載多次,浪費記憶體。

總上,我個人認為,如果你的系統上有多個應用程式都使用該庫的話,就把它編譯成動態庫,這樣雖然剛啟動的時候載入比較慢,但是多工的時候會比較節省記憶體;如果你的系統上只有一到兩個應用使用該庫,並且使用的API比較少的話,就編譯成靜態庫吧,一般的靜態庫還可以進行裁剪編譯,這樣應用程式可能會比較大,但是啟動的速度會大大提高。