第十六章 執行緒棧

2021-05-27 17:48:49 字數 1377 閱讀 4240

1:基礎

1:執行緒初始化時,執行緒棧預設1m,所有頁面都是page_readwrite屬性,但只為前兩個頁面調撥了物理儲存器,位址低的那個頁面叫防護頁面,為其指定了page_guard屬性

2:當執行緒訪問到防護頁面時,由於指定了page_guard屬性,系統會得到通知,系統會為防護頁面的下乙個頁面調撥物理儲存器,並指定page_guard屬性,使之成為新的防護頁面,同時,系統去除原來防護頁面的page_guard屬性

3:當防護頁面為倒數第三個頁面時,如果執行緒繼續訪問,會為倒數第二個頁面調撥物理儲存器,但是並不為其指定page_guard屬性,當執行緒訪問到此頁面時,會觸發exception_stack_overflow異常,如果應用程式忽略該異常,繼續訪問最後乙個頁面,由於未調撥物理儲存器,則產生訪問違規異常,作業系統會終止程序

2:棧下溢

char szbuf[100];

szbuf[10000]='a';

從基礎可以看出,當前時刻,肯定有兩個頁面已經調撥了物理儲存器,所以如szbuf[3000]='a',編譯器也不會報錯,但如上**,賦值的位址已經超過了兩個頁面,這就是所謂的棧下溢

作業系統不一定能檢測出棧下溢,因為下溢訪問的地方,也許我們已經為其調撥了物理儲存器

3:c/c++執行庫棧檢查函式

如果在棧上定義int a[4000],作業系統實際上只是把棧指標下移8000個位元組,並沒有為其調撥物理儲存器,只有真正訪問時才調撥,但作業系統這樣的實現是有問題的,因為如果有a[0]=0這樣的操作,便會引起訪問違規(我的理解:因為這個時候棧指標指向很遠的地方,只能在那裡調撥物理儲存器),為了解決這個問題,編譯器做了些工作,當編譯器處理每個函式的時候,會算出函式要多大的棧空間,如果棧空間大於目標系統的頁面大小,編譯器會呼叫棧檢查函式,棧檢查函式會去訪問該函式所需空間的每個頁面,從高位址向低位址,每個頁面寫入乙個位元組的值,這樣,系統會慢慢擴大執行緒棧的大小,為經過的每個頁面調撥物理儲存器

4:以後學習下編譯器一些棧安全性檢查

5:乙個重點

當執行緒堆疊溢位時,如在[基礎]中所說,會丟擲exception_stack_overflow異常,如果我們用seh完美的處理了此問題,當此執行緒下次再溢位時,就不能夠丟擲此異常了,因為除最後乙個頁面之外的所有頁面已經調撥了物理儲存器,系統取而代之的是丟擲訪問違規

這裡有兩個重點:

(1):如果想讓執行緒下次溢位還能丟擲異常,需呼叫c執行庫_resetkoflw函式

(2):系統為執行緒棧調撥了物理儲存器,即使執行緒棧指標又移到了高位址,系統也不會去釋放這些調撥的物理儲存器,因為執行緒棧的使用時非常頻繁的,頻繁的申請釋放沒有意義

第十六章 tcp wrappers

在伺服器向外提供的tcp服務上包裝一層安全檢測機制。外來連線請求首先通過這個安全檢測,獲得安全認證後才可被系統服務接受。hosts.allow hosts.deny 在配置檔案中為各服務分別定義訪問控制規則實現訪問控制,檔案中的規則是即時生效的。配置檔案語法 1 daemon list client...

第十六章 控制迴圈

第十六章 控制迴圈 16.1 選擇迴圈的種類 1.在大多數語言中,你只能用到少數幾種迴圈 1 計數迴圈 執行次數一定。2 連續求值的迴圈 預先並不知道將要執行多少次,它會在每次迭代時檢查是否應該結束。3 無限迴圈 一旦啟動就一直執行下去。4 迭代器迴圈 對容器類裡面的每個元素執行一次操作。2.什麼時...

第十六章 Math函式

16.1 內建math物件概要 math 物件包含靜態屬性和方法,用於在數字上處理數字或提供數學常數。16.2 math屬性和方法 屬性 e ln2 ln10 log2e log10e pi sqrt1 2 sqrt2 方法 abs acos asin atan atan2 ceil cos exp...