BIO系列之3 BIO的宣告和釋放等基本操作

2021-04-25 03:30:14 字數 1757 閱讀 7185

bio的宣告和釋放等基本操作

---根據openssl doc/crypto/bio/bio_new.pod翻譯和自己的理解寫成

在bio的基本操作系列函式中,他們用來bio分配和釋放操作,包括:

bio_new, bio_set, bio_free, bio_vfree, bio_free_all

他們的宣告在openssl/bio.h檔案中,其宣告形式如下:

bio * bio_new(bio_method *type);

int bio_set(bio *a,bio_method *type);

int bio_free(bio *a);

void bio_vfree(bio *a);

void bio_free_all(bio *a);

下面分別對這些函式進行解釋.

【bio_new】

這個函式建立並返回乙個相應的新的bio,並根據給定的bio_method型別呼叫下述的bio_set()函式給bio結構的method成員賦值,如果建立或給method賦值失敗,則返回null。建立乙個memory型別的bio例子如下:

bio* mem=bio_new(bio_s_mem());

有些型別的bio使用bio_new()函式之後就可以直接使用了,如memory型別的bio;而有些bio建立之後還需要一些初始化工作,如檔案bio,一般來說,也提供了這樣的一些函式來建立和初始化這種型別的bio。

比如建立乙個檔案bio,使用下面的**:

bio* in=null;

in=bio_new(bio_s_file());

bio_read_filename(in,"rsa512.pem");

bio* mem=bio_new(bio_s_mem());

然後就可以對該bio mem進行操作了。

另外,需要補充的是(這個大家從前面兩篇文章可能已經認識到了),對於source/sink型別的bio,其型別建立函式一般為bio_s_*的形式,對於filter型的函式,其型別建立函式一般為bio_f_*的形式。

【bio_set】

該函式功能比較簡單,就是對乙個已經存在的bio設定新的bio_method型別。其實就是簡單的對bio的各個成員進行初始化,並將引數type賦值給該bio。其實,bio_new函式在使用openssl_malloc給bio分配了記憶體之後,就簡單呼叫了bio_set函式進行初始化工作。所以一般來說,除非你要重新設定你已經存在的bio,否則是不需要直接呼叫這個函式的。成功操作返回1,否則返回0。

【bio_free】

該函式釋放單個bio的記憶體和資源,成功操作返回1,失敗返回0。bio的操作不僅僅是釋放bio結構所占用的資源,也會釋放其下層的i/o資源,比如關閉釋放相關的檔案符等,這對不同型別的bio是不一樣的,詳細的請參看各種型別bio本身的說明檔案和原始檔。需要注意的是,bio_free只釋放當前的乙個bio,如果用來釋放乙個bio鏈,就可能會導致記憶體洩漏,這種情況應該使用下述的bio_free_all函式。

【bio_vfree】

該函式功能與bio_free完全相同,只是沒有返回值。事實上,它簡單呼叫了bio_free函式,但不返回該函式的返回值,所以它的函式實現**只有乙個語句。

【bio_free_all】

該函式釋放這個bio鏈,並且即使在這個過程中,如果釋放其中乙個bio出錯,釋放過程也不會停止,會繼續釋放下面的bio,這保證了盡量避免記憶體洩漏的出現。如果你非要呼叫這個函式釋放單個的bio,那麼效果跟bio_free是一樣的。事實上,該函式只是簡單的遍歷整個bio鏈,並呼叫bio_free釋放各個環節的bio。

BIO和NIO的區別

bio 同步阻塞 每乙個io請求都會有乙個執行緒去處理,如果資料沒有準備就緒,執行緒會一直等待。直到資料讀取完畢執行緒才會釋放,在此期間,程序不回去做任何其他任務,這種模式會浪費一定的執行緒資源。nio 同步非阻塞 nio的優點在於首先基於快取讀寫檔案,能夠批量操作,然後用channel雙向讀寫資料...

我認識的BIO和NIO

簡介 bio 同步阻塞式io。實現模式為1個連線對應乙個執行緒。即每有1個新的請求時,就需要建立乙個新的執行緒去處理,並且執行緒永遠不會釋放。如果這個連線不去做任何事情的話,會造成資源浪費。nio 同步非阻塞式io。實現模式為1個請求對應乙個執行緒。即有乙個新的請求時,會註冊到作業系統tcp。而服務...

Tomcat的BIO和NIO一些問題

最近一些朋友通過書籍找到我,問了一些關於tomcat中bio和nio的問題,這裡列一下方便需要的朋友。後續也將前面有朋友問的問題整理下。只把 tomcat 的 bio 模式改為 nio 模式,是否能提高伺服器的吞吐量?發現在配置一樣的情況下,兩種模式壓出來的吞吐量差不多。要看你系統是不是整個都非同步...