標籤:pen 核心 code flags span 核心空間 介面 時間片 建立
1.1、命令提示字元(控制台)是一個軟體:如果你的軟體佈建為控制台使用者介面,那麼Window會拿命令提示行來運行你的軟體。
1.2、如果是視窗的話,Windows就不會來管你,就只是直接載入。
1.3、hPrevInstance:在你的程式中永遠都不要使用。
1.4、進程執行個體控制代碼:載入到地址空間的每一個執行體或者DLL檔案都被賦予了一個獨一無二的執行個體控制代碼。
1.5、進程在死亡的時候我們需要做一些回收和清理的事情。
1.6、核心對象泄露是會比記憶體泄露更加麻煩的事情。記憶體泄露可以通過關閉進程來解決,而核心泄露只能通過重啟作業系統來解決。
1.7、使用ExitProcess等等,類似的函數來強制的結束進程是不明智的,這會使得資源無法被回收。
1.8、進程許可權:
1.9、進程是完全封閉的。開放一些介面。
1.10、UAC:帶過濾表的許可權。現在只能在程式的邊界上來進行許可權的提升。
1.11、UAC會最大限度的來保障使用者的安全。
1.12、任何的進程都是由很多個模組構成的。
1.13、進程:進程核心空間、地址空間。
1.14、Main函數也是一個線程函數。
1.15、進程消亡的所有的的當前進程的線程全部退出。
1.16、進程結束主線程退出,主線程退出所有的子線程退出。
1.17、WaitForSingleObject函數等待子線程結束。才會去執行主線程之後的代碼,才會去消亡。保證了子線程能夠正常的退出。
1.18、在進行多線程參數專遞的時候一定要注意。有可能主線程退出的時候子線程還在使用主線程的推棧。而靜態成員或者全部變數可以解決這個問題。
1.19、ExitThread函數會立即結束當前線程:會將屬於當前線程的棧銷毀、但是不會去調用解構函式。這很容易造成記憶體流失。
1.20、_beginthreadex(),新線程的建立建議都使用這個函數進程建立。因為該函數比CreateThread來的安全。而且更加具有移植性。
1.21、_beginthread(),這個函數並沒有建立棧,所以不要用。
1.22、SuspendThread(hThread),函數會使得線程的暫停計數加一(Suspend:暫停)、當線程暫停計數不為0的時候,線程就不會進入CPU調度。
1.23、ResumeThread(hThread),而這個函數會使暫停計數減一(Resume:恢複)。
1.24、良好的程式中不應該出現線程的掛起:因為線程的掛起是非安全執行緒的。
1.25、等待、休眠:線程會放棄掉時間片。
1.26、SwitchToThread()函數會將當前線程的時間片放棄掉,然後將剩餘的時間片交給哪些饑餓度高的線程去執行。
1.27、
擷取CONTEXT結構體:CONTEXT context;context.ContextFlags = CONTEXT_ALL;GetThreadContext(hThread, &context);_tprintf(TEXT("EBP: 0x%x, ESP: 0x%x, EIP: 0x%x\r\n"), context.Ebp, context.Esp, context.Eip);//選擇輸出
1.28、全域變數是非安全執行緒的,在多線程編程中全域變數會造成各種各樣的麻煩。
1.29、鎖的API(原子操作):InterlockedExchange函數,返回參數以前的值。
1.30、所謂的原子操作就是一句一句的彙編代碼。
1.31、上鎖就相當於使多線程成為了單線程了。
1.32、當兩個或兩個以上的線程有資料的共用情況的話,盡量的讓其在同一個CPU下運行。
1.33、旋轉鎖:在一個while中不停的進行迴圈,直到獲准進入這個地區。
1.34、EnterCriticalSection(&gCs),這個函數進入臨界區,和死迴圈有些類似,主要的目的是擋住其他線程,不讓其他線程進入當前的這塊地區
以保證當前這塊代碼同一時間只有一個線程在訪問。
1.35、資料同步:就是為了避免在訪問同一資源的時候發生錯誤,導致擷取到的值是錯誤的
1.36、鎖:
1.36.1、
while(InterlockedExchange((long*)&bUsing, TRUE) == TRUE) //在while迴圈中一直等待。等待到可執行狀態。{ Sleep(1);}//code.InterlockedExchange((long*)&bUsing, FALSE);
1.36.2、
CRITICAL_SECTION gCS;//邊界區,關鍵段。InitializeCriticalSection(&gCS);//初始化。DeleteCriticalSection(&gCS); //進程結束時候調用,delete//線程中:EnterCriticalSection(&gCS); //進入臨界區//code.ReleaseCriticalSection(&gCS);//退出臨界區
1.36.3、
SRWLOCK gSRW;//_Slim鎖InitializeSRWLock(&gSRW);//初始化,這個只有初始化沒有delete。//線程中,分為獨佔鎖和共用鎖定://獨佔鎖方式:AcquireSRWLockExclusive(&gSRW);//code.ReleaseSRWLockExclusive(&gSRW);//共用鎖定方式:AcquireSRWLockShared(&gSRW);//code.ReleaseSRWLockShared(&gSRW);//這裡的獨佔和共用需要注意的是:在意獨佔鎖方式鎖的線程一旦獲得准許所有的一共用鎖定方式鎖的線程必須全部退出。//在以共用鎖定方式鎖的線程在執行的時候,獨佔鎖方式鎖的線程不會執行。
windows基礎複習