簡單地說,當計算機運行一個軟件,會被拆分成若干部分來執行,進程就是計算機正在運行的程序,它具體指程序執行時所需的虛擬地址空間和控制信息。而每一個應用程序運行於獨立的進程、他們擁有自己獨立的地址空間。不同應用程序的分界線稱為進程邊界。今天就為大家介紹windows的那些進程與應用程序,希望了解這些能更好的為系統服務.
進程
一般進程可以定為一個正在運行的程序的一個實例,
一個內核對象,操作系統可以用它來管理進程。也是系統保存進程統計信息的地方。
一個地址空間,其中包含了可執行文件和DLL模塊的代碼數據,同時包括動態內存分配,和線程堆棧和堆得分配。
CPU的工作方式,是 一個進程可以有多個線程..然後CPU會輪流調度資源分配給各個線程,就像一個時鐘一樣。
關於Windows應用程序的組成
要點描述:
1. GUI 和 CUI 分別表示 圖形和控制台的界面,
2./SUBSYSTEM:CONSOLE 和 /SUB-SYSTEM:WINDOWS 分別是控制台和窗口的鏈接器開關
3._tWinMain 圖形界面的入口點函數 和 _tmain 控制台界面的入口點函數。
一、Windows一般可以建立兩種應用程序。
1.GUI程序 - 圖形用戶界面 - 它使用的連接器開關是/SUBSYSTEM:CONSOLE
2.CUI程序 - 控制台界面 - 它使用的連接器開關是/SUB-SYSTEM:WINDOWS
操作系統會加載並檢查可執行文件映像的文件頭,並獲取這個子系統值。
根據子系統值來創建 一個符合要求的程序界面。
二、 Windows 應用程序
都會有個入口點函數,在程序運行時,函數會被調用。
int WINAPI _tWinMain(
HINSTANCE hInstanceExe,
HINSTANCE,
PTSTR pszCmdLine,
int nCmdShow);
int _tmain(
int argc,
TCHAR *argv[],
TCHAR *envp[]); 上一頁12下一頁共2頁
操作系統實際並不調用我們所寫的入口點函數。相反,它會調用由C/C++運行庫實現並鏈接時使用-entry:命令選項來設置
的一個C/C++運行時啟動函數。該函數將初始化C/C++運行庫,使我們能調用malloc和free之類函數。
應用程序類型和相應的入口點函數表
當鏈接器正確選擇了C/C++運行庫啟動函數後,鏈接器會根據指定的鏈接器開關,尋找相應的入口點函數,否則會返回
"unresolved external symbol"(無法解析的外部符號)錯誤。 不然一般會根據情況分別選擇 嵌入可執行文件的啟動函數。
當然我們也可以從自己的項目中移除/SUBSYSTEM鏈接器開關,讓程序自動判斷應該使用哪個子系統。
去啟動入口點函數 (WinMain, wWinMain, main, or wmain) 。
VisualC++有自帶C運行庫的源碼。可以在ertex.c文件中找到 這4個啟動入口點函數源代碼。這些啟動函數的用途下面簡單說下:
1.獲取指向心進程的完整命令行的一個指針。
2.獲取指向新進程的壞境變量的一個指針。
3.初始化C/C++運行庫的全局變量。如果包含了StdLib.h,我們的代碼就可以訪問這些變量。
4.初始化C運行庫內存分配函數malloc和calloc和其他底層I/O歷程使用的堆。
5.調用所有全局和靜態C++類對象的構造函數。
C/C++啟動函數會調用應用程序的入口點函數。比如我們寫了一個_tWinMain函數,且定義了_UNICODE
其調用過程如下:
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineUnicode,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
如果沒有定義_UNICODE,其調用過程將如下所示:
GetStartupInfo(&StartupInfo);
int nMainRetVal = WinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineAnsi,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
注意_ImageBase是一個鏈接器定義的偽變量,可執行文件都被映射到應用程序內存中的什麼位置以後討論。
現在 我們如果寫了一個_main函數,可以定義?_UNICODE其調用過程如下:
int nMainRetVal = wmain(argc, argv, envp);
沒定義_UNICODE,調用過程如下:
int nMainRetVal = main(argc, argv, envp);
另外注意用Visual Studio 生成的應用程序CUI是沒有入口點的第3個參數
int _tmain(int argc, TCHAR* argv[]);
要自己添加成
int _tmain(int argc, TCHAR* argv[], TCHAR* env[])
env參數指向一個參數,所有環境變量和值 都用等號(=)分隔。
為安全起見 Microsoft 並不贊成使用所有這些變量,因為使用了這些變量代碼可能會在C運行庫初始化這些變量之前開始執行,因此我們應該直接調用對於的WindowsAPI函數。
進程是操作系統中最基本、重要的概念。是多道程序系統出現後,為了刻畫系統內部出現的動態情況,描述系統內部各道程序的活動規律引進的一個概念,所有多道程序設計操作系統都建立在進程的基礎上。而應用程序是指為了完成某項或某幾項特定任務而被開發運行於操作系統之上的計算機程序。
上一頁12 下一頁共2頁