原创 Linux下一個進程究竟會有多少個線程

最近,在做一個關於聊天服務器的項目,其中遇到了一個問題,那就是一個進程可以產生多少個線程呢? 開始各種想象,會和不同平臺,不同系統相關,網上很多大佬說是1024個,也有256個。 與其無端猜測,不如動手測試一下。在Linux32位平臺,進

原创 32位Linux系統的虛擬地址映射

此次主要是在Bochs x86 2.6.8環境下,調試操作系統尋找邏輯地址對應的物理地址。 先分析下邊這段代碼: int main() { int data = 10; printf(“&data=0x%x\n

原创 單例模式SingleTon

單例模式 一個類只生成一個對象(確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例) 通過定義一個private的構造函數,避免被其他類new出來一個對象,不可以被實例化。 1.單例模式的懶加載 (第一次運行到

原创 遞歸

遞歸 若一個對象部分的包含自己,或用他自己給自己定義,被稱爲遞歸。 簡而言之,就是自己調用自己。 問大家一個問題,你認爲可以無限遞歸嗎? 首先,遞歸調用會進行入棧和棧幀回退,消耗棧空間;其次,我們棧空間有限,Win下的VS200

原创 溢出

溢出 就是結果值超出了被賦值對象的類型長度。 例如 8 位(1字節)的 char 。根據它有符號還是無符號, 它可以包含最大數127 或 255 。 下面的乘法向一個 char 賦值 256 ,因而導致了溢出: int

原创 線程池

池 一組資源的集合。爲了提高服務器性能,以空間換時間,即“浪費”服務器的硬件資源,以換取其運行效率。 靜態資源分配方式:資源在服務器啓動之初就被完全創建好並初始化。 對於預期應該分配多少資源,有兩種方案: 分配“足夠多”的資

原创 進程間通信之管道,消息隊列,共享內存

Linux下進程間通信的幾種主要手段: 管道:包括有名管道和無名管道; 信號(signal):用於通知接受進程有某事件發生,除了進程間通信,還可以發信號給進程本身; 消息隊列:是消息的鏈接表; 共享內存:使得多個進程訪問同一塊共

原创 sizeof與strlen的區別

兩者區別如下: sizeof操作符的結果類型是size_t, 它在頭文件中的typedef是unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。 sizeof是運算符,而strlen是函數。 看一個問

原创 STL 空間配置器 allocator

STL的操作對象(所有的數值)都存放在容器之中,而容器則需要配置空間以置放資料。最近在看侯捷的《STL源碼剖析》,所以做了筆記。 爲什麼不說allocator是內存配置器而說他是空間配置器呢? 因爲空間不一定是內存,空間也可以是

原创 I/O複用——select/poll/epoll區別

I/O複用 能使程序能同時監聽多個文件描述。 1.select 在一段指定時間內,監聽用戶感興趣文件描述符上的可讀,可寫和異常等事件。 函數原型: int select(int nfds, struct

原创 零拷貝操作

零拷貝 在兩個文件描述符之間直接傳遞數據(完全在內核中操作),從而避免了內核緩衝區和用戶緩衝區之間的數據拷貝。 接下來,將介紹三個與零拷貝操作相關的函數,sendfile函數,splice函數和tee函數 首先, sendfil

原创 i++和++i的那些陷阱坑

一般意義上的理解,++i是先定義一個i的副本,將i執行+1,最後返回那個副本; i++是將i執行+1,然後返回

原创 TCP粘包問題

TCP粘包 TCP粘包是指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據 的頭緊接着前一包數據的尾。 1.出現原因 這裏提一下保護消息邊界和流, 保護消息邊界,就是指傳輸協議把數據當作一

原创 vector的日常使用

在編程題中,遇到輸入要求多行數據時,之前是採用二維數組保存數組,但是空間的開闢總是未知的,或多或少也不合適。數組的越界問題會導致程序的奔潰,而且數組的動態性不好。 vector內存的特點是可變大小的,尾部插入刪除元素的效率還是很高的。 順

原创 main函數前後做了什麼

__start:      :      init stack;      init heap;      open stdin;      open stdout;      open stderr;      :      pus