Time of Update: 2017-02-27
前言glances 可以為 Unix 和 Linux 效能專家提供監視和分析效能資料的功能,其中包括:CPU 使用率記憶體使用量情況核心統計資訊和運行隊列資訊磁碟 I/O 速度、傳輸和讀/寫比率檔案系統中的可用空間磁碟適配器網路 I/O 速度、傳輸和讀/寫比率頁面空間和頁面速度消耗資源最多的進程電腦資訊和系統資源glances 工具可以在使用者的終端上即時顯示重要的系統資訊,並動態地對其進行更新。這個高效的工具可以工作於任何 終端螢幕。另外它並不會消耗大量的 CPU
Time of Update: 2017-02-27
並發 Linux下高並發的Nginx伺服器,當TCP TIME_WAIT通訊端數量經常達到兩、三萬,伺服器很容易被拖死。通過修改Linux核心參數,可以減少Nginx伺服器的TIME_WAIT通訊端數量。vi /etc/sysctl.conf增加以下幾行:引用net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 1200net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse =
Time of Update: 2017-02-27
posix 條件變數與互斥鎖 樣本生產者--消費者問題一、posix 條件變數一種線程間同步的情形:線程A需要等某個條件成立才能繼續往下執行,現在這個條件不成立,線程A就阻塞等待,而線程B在執行過程中使這個條件成立了,就喚醒線程A繼續執行。在pthread庫中通過條件變數(Condition Variable)來阻塞等待一個條件,或者喚醒等待這個條件的線程。Condition Variable用pthread_cond_t類型的變數表示,和Mutex的初始化和銷毀類似,pthread_cond_
Time of Update: 2017-02-27
posix 訊號量與互斥鎖 樣本生產者--消費者問題一、posix 訊號量訊號量的概念參見這裡(http://www.bianceng.cn/OS/Linux/201308/37243.htm)。前面也講過system v 訊號量,現在來說說posix 訊號量。system v 訊號量只能用於進程間同步,而posix 訊號量除了可以進程間同步,還可以線程間同步。system v 訊號量每次PV操作可以是N,但Posix 訊號量每次PV只能是1。除此之外,posix
Time of Update: 2017-02-27
線程的屬性和 線程特定資料 Thread-specific Data一、posix 線程屬性POSIX 線程庫定義了線程屬性對象 pthread_attr_t ,它封裝了線程的建立者可以訪問和修改的線程屬性。主要包括如下屬性:1. 範圍(scope)2. 棧尺寸(stack size)3. 棧地址(stack address)4. 優先順序(priority)5. 分離的狀態(detached state)6. 調度策略和參數(scheduling policy and
Time of Update: 2017-02-27
pthread 系列函數 和 簡單多線程伺服器端程式一、posix
Time of Update: 2017-02-27
通過UNIX域通訊端傳遞描述符和 sendmsg/recvmsg 函數在前面我們介紹了UNIX域通訊端編程,更重要的一點是UNIX域通訊端可以在同一台主機上各進程之間傳遞檔案描述符。下面先來看兩個函數:#include <sys/types.h>#include <sys/socket.h>ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);ssize_t recvmsg(int sockfd,
Time of Update: 2017-02-27
一、UNIX Domain Socket IPCsocket API原本是為網路通訊設計的,但後來在socket的架構上發展出一種IPC機 制,就是UNIX Domain Socket。雖然網路socket也可用於同一台主機的進程間通訊(通過loopback地址127.0.0.1),但是 UNIX Domain Socket用於IPC更有效率:不需要經過網路通訊協定棧,不需要打包拆包、計算校正和、維護序號和應答等,只是
Time of Update: 2017-02-27
一、下圖是典型的UDP用戶端/伺服器通訊過程下面依照通訊流程,我們來實現一個UDP回射客戶/伺服器#include <sys/types.h>#include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const
Time of Update: 2017-02-27
一、epoll 系列函數簡介#include <sys/epoll.h>int epoll_create(int size);int epoll_create1(int flags);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int
Time of Update: 2017-02-27
一、用select實現的並發伺服器,能達到的並發數,受兩方面限制1、一個進程能開啟的最大檔案描述符限制。 這可以通過調整核心參數。可以通過ulimit -n來調整或者使用setrlimit函數設定, 但一個系統所能開啟的最大數也是有 限的,跟記憶體大小有關,可以通過cat /proc/sys/fs/file-max 查看2、select中的fd_set集合容量的限制 (FD_SETSIZE,一般為1024) ,這需要重新編譯核心。可以寫個測試程式,只建立串連,看看最多能夠建立多少個
Time of Update: 2017-02-27
假設server和client 已經建立了串連,server調用了close, 發送FIN 段給client(其實不一定會發送FIN段,後面再說 ),此時server不能再通過socket發送和接收資料,此時client調用read,如果接收到FIN 段會返回0,但client此時還是 可以write 給server的,write調用只負責把資料交給TCP發送緩衝區就可以成功返回了,所以不會出錯,而server收到資料
Time of Update: 2017-02-27
一、當我們使用單進程單串連且使用readline修改後的用戶端程式,去串連使用readline修改後的伺服器端程式,會出 現一個有趣的現象,先來看輸出:先運行伺服器端,再運行用戶端,simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./echoser_recv_peekrecv connect ip=127.0.0.1
Time of Update: 2017-02-27
一、五種I/O模型1、阻塞I/O我們在前面所說的I/O模型都是阻塞I/O,即調用recv系統調用,如果沒有資料則阻塞等待,當資料到來則將資料從核心 空間(套介面緩衝區)拷貝到使用者空間(recv函數提供的buf),然後recv返回,進行資料處理。2、非阻塞 I/O我們可以使用 fcntl(fd, F_SETFL, flag | O_NONBLOCK); 將通訊端標誌變成非阻塞,調用recv,如果裝置暫時
Time of Update: 2017-02-27
一、在前面講過的最簡單的回射客戶/伺服器程式中,一個用戶端即一個進程,只會發起一個串連,只要稍微修改一下就 可以讓一個用戶端發起多個串連,然後只利用其中一個串連發送資料。先來認識一個函數getsockname #include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);利用此函數可以得到某串連sockfd的地址資訊,如ip地址和連接埠,
Time of Update: 2017-02-27
在前面的文章中,我們為了避免粘包問題,實現了一個readn函數讀取固定位元組的資料。如果應用程式層協議的各欄位長度固 定,用readn來讀是非常方便的。例如設計一種用戶端上傳檔案的協議,規定前12位元組表示檔案名稱,超過12位元組的檔案名稱截 斷,不足12位元組的檔案名稱用'\0'補齊,從第13位元組開始是檔案內容,上傳完所有檔案內容後關閉串連,伺服器可以 先調用readn讀12個位元組,根據檔案名稱建立檔案,然後在一個迴圈中調用read讀檔案內容並存檔,迴圈結束的條件是read返
Time of Update: 2017-02-27
我們在前面曾經說過,發送端可以是一K一K地發送資料,而接收端的應用程式可以兩K兩K地提走資料,當然也有可能一 次提走3K或6K資料,或者一次只提走幾個位元組的資料,也就是說,應用程式所看到的資料是一個整體,或說是一個流 (stream),在底層通訊中這些資料可能被拆成很多資料包來發送,但是一個資料包有多少位元組對應用程式是不可見的,因 此TCP協議是面向流的協議,這也是容易出現粘包問題的原因。而UDP是面向訊息的協議,每個UDP段都是一條訊息,應用程
Time of Update: 2017-02-27
使用fork並發處理多個client的請求和對等通訊p2p一、在前面講過的回射客戶/伺服器程式中,伺服器只能處理一個用戶端的請求,如何同時服務多個用戶端呢?在未講到 select/poll/epoll等進階IO之前,比較老土的辦法是使用fork來實現。網路伺服器通常用fork來同時服務多個用戶端,父 進程專門負責監聽連接埠,每次accept一個新的用戶端串連就fork出一個子進程專門服務這個用戶端。但是子進程退出時會產
Time of Update: 2017-02-27
SIGHUP 終止進程 終端線路掛斷 SIGINT 終止進程 中斷進程 SIGQUIT 建立CORE檔案終止進程,並且產生core檔案 SIGILL 建立CORE檔案 非法指令 SIGTRAP 建立CORE檔案 跟蹤自陷 SIGBUS 建立CORE檔案 匯流排錯誤 SIGSEGV 建立CORE檔案 段非法錯誤 SIGFPE 建立CORE檔案
Time of Update: 2017-02-27
Linux 網路卡驅動程式對 ethtool 的支援和實現從典型的乙太網路控制器說起網卡工作在 OSI 網路體系的 最後兩層,物理層和資料連結層,物理層定義了資料傳送與接收所需要的電與光訊號、線路狀態、時鐘基準、資料編碼和電 路等,並向資料連結層裝置提供標準介面。物理層的晶片稱之為 PHY。資料連結層則提供定址機構、資料幀的構建、資料差 錯檢查、傳送控制、向網路層提供標準的資料介面等功能。乙太網路卡中資料連結層的晶片稱之為 MAC 控制器。很多網卡的 這兩個部分是做到一起的。他們之間的關係是