Time of Update: 2018-12-05
緩衝淘汰演算法系列之1——LRU類1. LRU1.1. 原理LRU(Least recently used,最近最少使用)演算法根據資料的曆史訪問記錄來進行淘汰資料,其核心思想是“如果資料最近被訪問過,那麼將來被訪問的幾率也更高”。1.2. 實現最常見的實現是使用一個鏈表儲存快取資料,詳細演算法實現如下:1. 新資料插入到鏈表頭部;2. 每當快取命中(即快取資料被訪問),則將資料移到鏈表頭部;3. 當鏈表滿的時候,將鏈表尾部的資料丟棄。1.3. 分析【命中率】當存在熱點資料時,LRU的效率很好,
Time of Update: 2018-12-05
緩衝淘汰演算法系列之3——FIFO類1 FIFO1.1. 原理按照“先進先出(First In,First Out)”的原理淘汰資料。1.2. 實現FIFO隊列,具體實現如下:1. 新訪問的資料插入FIFO隊列尾部,資料在FIFO隊列中順序移動;2. 淘汰FIFO隊列頭部的資料;1.3. 分析l 命中率命中率很低,因為命中率太低,實際應用中基本上不會採用。l 複雜度簡單l 代價實現代價很小。2. Second Chance2.1. 原理FIFO演算法的改進版,其思想是“如果被淘汰的資料之前被訪問
Time of Update: 2018-12-05
類比測試程式,從用戶端向伺服器發資料,人工控制伺服器收資料。當用戶端發了一部分資料後,無法再發送,此時伺服器開始每次收取1K。按照常理推斷,伺服器收取1K後,用戶端應該能夠繼續發送資料,但實測觀察發現,用戶端還是無法發送資料,直到伺服器收取了一定資料量後,用戶端才能夠繼續發送。tcp抓包如下:11:42:40.217984 IP localhost.6379 > localhost.28944: . ack 65665 win 0 <nop,nop,timestamp 1816613
Time of Update: 2018-12-05
tcp串連是網路編程中最基礎的概念,基於不同的使用情境,我們一般區分為“長串連”和“短串連”,長短串連的優點和缺點這裡就不詳細展開了,有心的同學直接去google查詢,本文主要關注如何解決tcp短串連的TIME_WAIT問題。短串連最大的優點是方便,特別是指令碼語言,由於執行完畢後指令碼語言的進程就結束了,基本上都是用短串連。但短串連最大的缺點是將佔用大量的系統資源,例如:本地連接埠、socket控制代碼。導致這個問題的原因其實很簡單:tcp協議層並沒有長短串連的概念,因此不管長串連還是短串連,
Time of Update: 2018-12-05
#include<list>#include<iostream>using namespace std;int main(){ list<int> list1; int i,j; for (i=0; i<10; i++) { list1.push_front(i); } list<int>::iterator iter; list1.pop_front();
Time of Update: 2018-12-05
最近因為項目需要,簡單的試用了兩款高可用開源方案:Keepalived和Heartbeat。兩者都很流行,但差異還是很大的,現將試用過程中的感受以及相關知識點簡單總結一下,供大家選擇方案的時候參考。1)Keepalived使用更簡單:從安裝、配置、使用、維護等角度上對比,Keepalived都比Heartbeat要簡單得多,尤其是Heartbeat
Time of Update: 2018-12-05
#include<queue>#include<iostream>using namespace std;int main(){ queue <int> qu1; int i; for (i=0;i<10;i++) { qu1.push(i); } // queue<int>::iterator iter; //iter=qu1.begin(); queue沒有 iterator
Time of Update: 2018-12-05
SO_LINGER是一個socket選項,通過setsockopt API進行設定,使用起來比較簡單,但其實現機制比較複雜,且字面意思上比較難理解。解釋最清楚的當屬《Unix網路編程卷1》中的說明(7.5章節),這裡簡單摘錄:SO_LINGER的值用如下資料結構表示:struct linger { int l_onoff; /* 0 = off, nozero = on */ int l_linger; /* linger time */};其取值和處理如下:1、設定
Time of Update: 2018-12-05
// map::get_allocator#include <iostream>#include <map>#include<string>using namespace std;int main (){ int psize; map<char,int> mymap; pair<const char,int>* p; // allocate an array of 5 elements using
Time of Update: 2018-12-05
【tcp_tw_recycle和tcp_timestamps】參考官方文檔(http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt),tcp_tw_recycle解釋如下:tcp_tw_recycle選項作用為:Enable fast recycling TIME-WAIT sockets. Default value is 0.tcp_timestamps選項作用為:Enable timestamps as
Time of Update: 2018-12-05
tcp_tw_reuse選項的含義如下(http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt):tcp_tw_reuse - BOOLEANAllow to reuse TIME-WAIT sockets for new connections when it issafe from protocol viewpoint. Default value is 0.
Time of Update: 2018-12-05
FastCgifast_cgi模組詳解nginx--location文法規則: location [=|~|~*|^~] /uri/ { … }= 開頭表示精確匹配 ^~ 開頭表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。 ~ 開頭表示區分大小寫正則匹配 ~* 開頭表示不區分大小寫正則匹配 !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
Time of Update: 2018-12-05
參考官方文檔(http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt),解釋如下:tcp_max_tw_buckets - INTEGERMaximal number of timewait sockets held by system simultaneously.If this number is exceeded time-wait socket is immediately destroyedand
Time of Update: 2018-12-05
Circular Linked List)是一種首尾相接的鏈表,它與單鏈表的唯一區別在於對尾結點的處理;因為在單鏈表中尾結點的指標域NULL改為指向頭結點就得到了單迴圈鏈表。單迴圈鏈表可以用頭指標head或尾指標rear表示,用尾指標rear表示的單迴圈鏈表尋找開始結點a1和尾結點an就很方便;尋找時間都是O(1)。 僅設尾指標rear的單迴圈鏈表的實現:#include<stdio.h>#include<stdlib.h>typedef struct node{
Time of Update: 2018-12-05
1. cin,cin.get,cin.getlinecin讀入資料遇到空格結束;丟棄空格符,輸入斷行符號符結束,很正常。cin.get用來讀取字元,輸入斷行符號符結束,但是不丟棄斷行符號符和空格符。注意:cin.get()與cin.get(char)等價,但是cin.get(char *,int) 用來讀取字串,可以接受空格符,遇到斷行符號符結束,按照指定長度(長度減1)讀取字元, 會丟棄最後的斷行符號符。cin.getline()與cin.get(char
Time of Update: 2018-12-05
#include<stdio.h>#include<stdlib.h>#include<string.h>struct dictree{ struct dictree *child[26]; int n;};struct dictree *root;void insert(char *source){ int len,i,j; struct dictree *current,*newnode; len=strlen(source)
Time of Update: 2018-12-05
1、 堆排序定義 n個關鍵字序列Kl,K2,…,Kn稱為堆,若且唯若該序列滿足如下性質(簡稱為堆性質): (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ ) 若將此序列所儲存的向量R[1..n]看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。【例】關鍵字序列(10,15,56,25,30,70)和(70,56,30,25,15,1
Time of Update: 2018-12-05
(1)管道(Pipe):管道可用於具有親緣關係進程間的通訊,允許一個進程和另一個與它有共同祖先的進程之間進行通訊。 (2)具名管道(named
Time of Update: 2018-12-05
#include<iostream>#include<vector>using namespace std;int main(){ int i=0,j=0; vector <vector <int > > Array; vector <int> line; for (j=0; j<10; j++) { Array.push_back(line); for (i=0;
Time of Update: 2018-12-05
/******* kmp_1.cpp ******/ #include<string.h>#include<stdio.h>#include"kmp_2.h"void get_next(char *T,int *next) //這個函數是重點{ int i=0, j=-1;//j在前,i在後,next[i]存的是i之前的串的最長公用前尾碼長度 next[0]=-1;//初始時計算i=0,即考慮第0個字元,此時j應設為-1,next[i]=-1表i之前/