• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-161  評論-223  文章-30  trackbacks-0
             
                 摘要: 引言    在面向?qū)ο箢惖脑O(shè)計中,有時為了強化效能,特別是當構(gòu)造大量小對象時,為了改善內(nèi)存碎片,就需要自己實現(xiàn)對象的內(nèi)存管理,以替換系統(tǒng)缺省的分配和釋放行為,即全局的new和delete。按照c++標準,在定制類專屬的new和delete時,為了減免客戶代碼使用時的麻煩和問題,需要考慮同時定制簡單(normal new)、定位(placement new)和無異常(...  閱讀全文
            posted @ 2012-09-27 17:37 春秋十二月 閱讀(2087) | 評論 (2)編輯 收藏
                 摘要: 情景分析    在網(wǎng)絡(luò)編程中,通常異步比同步處理更為復雜,但由于異步的事件通知機制,避免了同步方式中的忙等待,提高了吞吐量,因此效率較高,在高性能應(yīng)用開發(fā)中,經(jīng)常被用到。而在處理異步相關(guān)的問題時,狀態(tài)機模式是一種典型的有效方法,這在libevent、memcached、nginx等開源軟件(庫)中多次被使用而得到見證。據(jù)此,為拋磚引玉,本文展示了使用此方法異步接收變...  閱讀全文
            posted @ 2012-09-20 15:48 春秋十二月 閱讀(2830) | 評論 (2)編輯 收藏
               為方便查看特定TCP服務(wù)器進程的CPU、內(nèi)存和網(wǎng)絡(luò)連接情況,編寫了一個簡單的腳本perf.sh,其原理是指定--tcp或-t選項來調(diào)用netstat命令,指定aux -T選項參數(shù)調(diào)用ps命令,對輸出結(jié)果根據(jù)進程名稱或PID調(diào)用grep過濾;為了輸出結(jié)果的可讀性,先調(diào)用ps和netstat,用head取出保存大多是說明描述性的頭幾行。這里的實現(xiàn)具有如下特點:
                支持單獨查看CPU和內(nèi)存利用率,或網(wǎng)絡(luò)連接情況,或兩者皆可,name表示進程名,address表示網(wǎng)絡(luò)地址
                支持輸出重定向,使用exec實現(xiàn)將標準輸出重定向到file文件,當沒指定-o file選項參數(shù)時,則為標準輸出
                支持設(shè)置刷新時間,當沒指定-t seconds選項參數(shù)時,則默認為3秒 
                支持顯示多線程,當指定-m選項時,則顯示多個線程的情況,默認不顯示
              1#! /bin/bash
              2#perf.sh
              3
              4name=
              5address=
              6file=
              7seconds=
              8show_mthread=0
              9is_count=0
             10
             11while getopts :p:n:o:t:mv opt
             12do
             13    case $opt in
             14    p)  name=$OPTARG
             15        ;;
             16    n)  address=$OPTARG
             17        ;;
             18    o)  file=$OPTARG
             19        ;;
             20    t)  seconds=$OPTARG
             21        ;;
             22    m)  show_mthread=1
             23        ;;
             24    v)  is_count=1
             25        ;;
             26    '?')    echo "$0: invalid option -$OPTARG" >&2
             27            echo "Usage: $0 [-p name] [-n address] [-o file] [-t seconds] [-m]" >&2
             28            exit 1
             29            ;;
             30    esac
             31done
             32
             33shift $((OPTIND-1))
             34
             35if [ -"$name" --"$address" ]; then
             36    print"Usage $(basename "$0") [-p name] [-n address] [-o file] [-t seconds] [-m]\nname or address must not be null\n"
             37    exit 1
             38fi
             39
             40if [ -"$seconds" ]; then
             41    seconds=3
             42fi
             43
             44psflag="aux"
             45if [ "$show_mthread" = 1 ]; then
             46    psflag="$psflag -T"
             47fi
             48
             49psheader="`ps $psflag | head -n 1`"
             50sortflag="-k3nr -k4nr" #sort by descend order according to cpu and mem 
             51
             52netflag="-an --tcp --inet"
             53netheader="`netstat $netflag | head -n 2`"
             54is_exist=
             55
             56show_process_info()
             57{
             58    if [ -"$1" ]; then
             59        return 255
             60    fi
             61
             62    result=`ps $psflag | grep -"$1" | grep --"gdb|grep|$0" | sort $sortflag`
             63    if [ -"$result" ]; then
             64        is_exist=0    
             65    else
             66        is_exist=1
             67        uptime 
             68        echo "$psheader" 
             69        echo "$result"
             70    fi
             71    echo ""
             72}

             73
             74show_net_connection()
             75{
             76    if [ -"$1" ]; then
             77        return 255
             78    fi
             79
             80    result=`netstat  $netflag | grep -E $1
             81    if [ -"$result" ]; then
             82        echo "$netheader" 
             83        if [ "$is_count" = 1 ]; then
             84            echo "$result" | awk '/^tcp/ ++S[$NF] } ENDfor(a in S) print a, S[a] }'
             85        fi
             86    fi
             87    echo ""
             88}

             89
             90tmpfile=`mktemp /tmp/per.XXXXXXXXXXXX`
             91
             92while true
             93do
             94    if [ -"$file" ]; then
             95        exec 1> $tmpfile
             96    fi
             97
             98    show_process_info $name
             99    show_net_connection $address
            100    echo ""
            101
            102    sleep $seconds
            103
            104    if [ -"$file" ]; then 
            105        exec 1>&-
            106
            107        if [ "$is_exist" = 1 ]; then
            108            cat $tmpfile >> $file
            109        fi
            110
            111        size=`ls -l $file | awk '{print $5}'`
            112        if [ $size -ge $(expr 1024 \* 1024 \* 1) ]; then
            113            cat  /dev/null > $file    
            114        fi
            115    else
            116        clear
            117    fi
            118done
               最后順便提下,上面是查看某單個服務(wù)器進程的性能,若要查看整體服務(wù)器系統(tǒng)的性能,可以運用vmstat、iostat和free等命令。
            posted @ 2012-09-04 16:35 春秋十二月 閱讀(1719) | 評論 (1)編輯 收藏
            原理
               在linux平臺下編譯由多個源碼文件或目錄組成的項目工程時,需要編寫make腳本即Makefile文件來編譯,當項目工程寵大時,這種方式比單純地使用gcc命令行方便快捷,且易于維護。由于具體工程的源碼文件數(shù)量的多少及名稱的不同,因此編寫一個較為通用的Makefile文件,來實現(xiàn)編譯各種不同的工程,具有重要的參考意義和價值。本文展示了通用Makefile.in文件及其應(yīng)用示例。Makefile.in文件,顧名思義,內(nèi)部實現(xiàn)用的,應(yīng)由外部具體的Makefile文件提供具體的命令行參數(shù)來調(diào)用,它包括exe,static,share三個規(guī)則目標,因此支持可執(zhí)行文件、動態(tài)庫和靜態(tài)庫三種工程的編譯,而每種工程又支持debug和release兩種版本,默認為release版本,在編譯時會自動創(chuàng)建debug或release目錄來存放所有中間文件*.o和*.d。在其腳本源碼中,詳見下面實現(xiàn),小寫變量為內(nèi)部所有,大寫變量為make命令行提供的參數(shù),目前支持以下幾種命令行參數(shù):
                 1)輸出名稱:OUT_NAME,對于庫工程,內(nèi)部自動添加lib前綴
                 2)輸出路徑:OUT_PATH,
            末尾反斜杠/可有可無
                 3)源碼路徑:SRC_PATH, 末尾反斜杠/可有可無
                 4)依賴動態(tài)庫路徑:SHARE_PATH,不帶庫名稱的路徑, 末尾反斜杠/可有可無 
                 5)依賴動態(tài)庫名稱:SHARE_LIB,不帶庫路徑的名稱,內(nèi)部自動添加-l前綴
                 6)依賴靜態(tài)庫路徑:STATIC_PATH,不帶庫名稱的路徑,
            尾反斜杠/可有可無
                 7)依賴靜態(tài)庫路徑:STATIC_LIB,不帶庫路徑的名稱
                 8)預(yù)定義宏:MACROS,內(nèi)部自動添加-D前綴
                 9)編譯模式:MODE,表示編譯成debug或release版本
                 關(guān)于頭文件包含的支持,這里沒有提供命令行參數(shù),在內(nèi)部它固定為SRC_PATH、/usr/include和/usr/local/include三個路徑,對于大多數(shù)的工程,應(yīng)該夠用了。

            實現(xiàn)
             1#Makefile.in
             2
             3inc_path := $(SRC_PATH) /usr/include /usr/local/include
             4inc_path := $(addprefix -I,$(inc_path))
             5override SHARE_PATH += /usr/lib /usr/local/lib
             6override SHARE_PATH  := $(addprefix -L,$(SHARE_PATH))
             7override SHARE_LIB  := $(if $(SHARE_LIB),$(addprefix -l,$(SHARE_LIB)))
             8override STATIC_PATH := $(patsubst %/,%,$(STATIC_PATH)) 
             9override STATIC_LIB := $(if $(STATIC_PATH),$(if $(STATIC_LIB),$(addprefix $(STATIC_PATH)/,$(STATIC_LIB))))
            10override SRC_PATH := $(patsubst %/,%,$(SRC_PATH))
            11override MACROS := $(addprefix -D,$(MACROS))
            12
            13cxxflags := -Wall $(MACROS)
            14
            15ifeq ($(MODE),debug)
            16  cxxflags += -
            17  tmp_path := $(SRC_PATH)/debug
            18else
            19  cxxflags += -O2 -DNDEBUG 
            20  tmp_path := $(SRC_PATH)/release
            21endif
            22
            23lib_name := $(addprefix lib,$(OUT_NAME))
            24
            25srcs := $(wildcard $(SRC_PATH)/*.c) $(wildcard $(SRC_PATH)/*.cpp)
            26deps := $(patsubst %.c,%.d,$(patsubst %.cpp,%.d,$(srcs)))
            27deps := $(foreach dep,$(deps),$(notdir $(dep)))
            28deps := $(addprefix $(tmp_path)/,$(deps))
            29
            30objs := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(srcs)))
            31objs := $(foreach obj,$(objs),$(notdir $(obj)))
            32objs := $(addprefix $(tmp_path)/,$(objs))
            33
            34share_name  := $(tmp_path)/$(lib_name).so
            35static_name := $(tmp_path)/$(lib_name).a
            36exe_name    := $(tmp_path)/$(OUT_NAME)
            37    
            38override MACROS := $(if $(MACROS),$(addprefix -D,$(MACROS)))
            39
            40.PHONY: exe lib static share clean config
            41
            42arflags    := -rc
            43
            44definMKDIR
            45if [ ! -d $(tmp_path) ]; then \
            46mkdir $(tmp_path);\
            47fi 
            48endef
            49
            50config:
            51    @$(MKDIR)
            52
            53exe: config $(exe_name)
            54
            55lib: config static share
            56
            57static: $(static_name)
            58    
            59share: $(share_name)
            60
            61$(exe_name): $(objs) 
            62    @echo "Linking to execute ($@ : $(objs))."
            63    $(CXX) -o $@ $(objs) $(SHARE_PATH) $(SHARE_LIB) $(STATIC_LIB)
            64    @cp $(exe_name) $(OUT_PATH) 
            65        
            66$(static_name): $(objs)
            67    @echo "Archive to static library ($@ [$(objs)])."
            68    $(AR) $(arflags) $@ $(objs)
            69    @cp $(static_name) $(OUT_PATH) 
            70    
            71$(share_name): $(objs)
            72    @echo "Linking to shared library ($@ [$(objs)])."
            73    $(CXX) $(cxxflags) -o $@ $(objs) -fPIC -shared
            74    @cp $(share_name) $(OUT_PATH) 
            75    
            76$(tmp_path)/%.o: $(SRC_PATH)/%.cpp $(tmp_path)/%.d
            77    @echo "Compile $@ ($<)."
            78    $(CXX) $(cxxflags) $(inc_path) -c $< -o $@
            79
            80$(tmp_path)/%.d: $(SRC_PATH)/%.cpp 
            81    @echo "Compile $@ ($<)."
            82    $(CXX) $(cxxflags) -MM $< -o $@.$$$$; \
            83    sed 's,\($*\)\.o[ :]*,\1.o $@:, g' < $@.$$$$ > $@; \
            84    rm -f $@.$$$$
            85
            86-include $(deps)
            87
            88clean:
            89    $(RM) $(objs) $(deps) $(share_name) $(static_name) $(exe_name)

            應(yīng)用
               這里假設(shè)有兩個源碼子目錄netcomm和server,前者為動態(tài)庫netcomm工程,后者為主程序server工程,它依賴netcomm庫,每個目錄下都有其自己的Makefile,這個用于編譯單個模塊或主程序,它們的父目錄為src,在這個目錄下有兩個Makefile文件,一個是Makefile.in,這個就是上面講到的通用內(nèi)部Makefile;另一個是Makefile,這個用來聯(lián)編所有的模塊和主程序。
               先來看下netcomm的Makefile文件內(nèi)容,如下所示
             1path := SRC_PATH=. OUT_PATH=../../output
             2
             3.PHONY: all debug release clean
             4
             5all: debug release 
             6    
             7debug:
             8    $(MAKE) -../Makefile.in lib MODE=debug OUT_NAME=netcommd $(path)
             9
            10release:
            11    $(MAKE) -../Makefile.in lib MODE=release OUT_NAME=netcomm $(path)
            12
            13clean:
            14    $(MAKE) -../Makefile.in clean MODE=debug OUT_NAME=netcommd $(path)
            15    $(MAKE) -../Makefile.in clean MODE=release OUT_NAME=netcomm $(path)
                 
               再看下server的Makefile文件內(nèi)容,如下所示   
             1macros := MACROS="_USE_MEM_POOL=1"
             2
             3path := SRC_PATH=. OUT_PATH=../../output SHARE_PATH=../../output
             4
             5.PHONY: all debug release clean 
             6
             7all: debug release 
             8
             9debug:
            10    $(MAKE) -../Makefile.in exe MODE=debug OUT_NAME=serverd SHARE_LIB="netcommd" $(macros) $(path)
            11
            12release:
            13    $(MAKE) -../Makefile.in exe MODE=release OUT_NAME=server SHARE_LIB="netcomm" $(macros) $(path)
            14
            15clean:
            16    $(MAKE) -../Makefile.in clean MODE=debug OUT_NAME=serverd $(path)
            17    $(MAKE) -../Makefile.in clean MODE=release OUT_NAME=server $(path)
                
               最后看下src的Makefile文件內(nèi)容,如下所示
             1.PHONY: all release debug clean
             2
             3all: debug release
             4
             5debug:
             6    $(MAKE) debug -C netcomm 
             7    $(MAKE) debug -C server
             8
             9release:
            10    $(MAKE) release -C netcomm
            11    $(MAKE) release -C server
            12
            13clean:
            14    $(MAKE) clean -C netcomm
            15    $(MAKE) clean -C server
               以上所有腳本代碼,在make 3.81下測試通過。
            posted @ 2012-08-16 19:29 春秋十二月 閱讀(3523) | 評論 (3)編輯 收藏
                 摘要:    信號量是一種用于并發(fā)環(huán)境同步手段的原語,分為無名信號量和有名信號量兩種,前者只能用于線程間同步,而后者還可用于進程間同步。它包括創(chuàng)建、等待、掛出、取值和銷毀5種基本操作。與互斥鎖不同的是:    ● 信號量擁有一個計數(shù)值,表示可用的資源數(shù)量,僅當該值為0或1時,則相當于互斥鎖。    &...  閱讀全文
            posted @ 2012-07-20 10:52 春秋十二月 閱讀(2190) | 評論 (0)編輯 收藏
                 摘要:    互斥鎖,用來保證任一時刻只有單個線程或進程擁有對共享資源的互斥訪問權(quán),在這里將posix thread中的互斥體、win32中的互斥體和臨界區(qū),統(tǒng)稱為互斥鎖,其特點如下:   ● 范圍:線程鎖和進程鎖,前者僅用于同一進程內(nèi)多線程間,而后者用于進程間,顯然,它也能用于同一進程內(nèi)多線程間,但效率較低。posix的互斥體既可以是線程鎖,...  閱讀全文
            posted @ 2012-06-23 00:08 春秋十二月 閱讀(3586) | 評論 (2)編輯 收藏
                 摘要:     socket pair,也稱套接字管道,主要用來實現(xiàn)進程內(nèi)或進程間的一對一的全雙工或半雙工通信,在IO復用模型(如select,poll,epoll等)中起到通知中斷退出循環(huán)的作用,在類UNIX系統(tǒng)中已經(jīng)有現(xiàn)成的實現(xiàn),API為socketpair,但在Windows系統(tǒng)中沒有,因此本文主要講述Windows平臺下soketpair的實現(xiàn)及應(yīng)用,支持IPv4和I...  閱讀全文
            posted @ 2012-06-17 03:02 春秋十二月 閱讀(3070) | 評論 (3)編輯 收藏
               自旋鎖作為一種并發(fā)同步的手段,特別適用于競爭少和鎖時間短的情況,在驅(qū)動及內(nèi)核代碼中經(jīng)常被用到,本文講述一種適合用戶態(tài)程序的自旋鎖,支持Windows和Linux(GCC>=4.1.2)平臺,并提供了C語言的接口和實現(xiàn)。

            接口
               spin_trylock如果獲取成功返回1,否則返回0;spin_is_lock如果已加鎖,返回1,否則返回0。
             1typedef struct 
             2{
             3 volatile long  flag_;
             4 volatile long* spin_;
             5}
            spin_lock_t;
             6
             7void spin_init(spin_lock_t* lock,long* flag);
             8
             9void spin_lock(spin_lock_t* lock);
            10
            11int spin_trylock(spin_lock_t* lock);
            12
            13void spin_unlock(spin_lock_t* lock);
            14
            15int spin_is_lock(spin_lock_t* lock);

            實現(xiàn)
             1#ifdef _MSC_VER
             2#include <windows.h>
             3#elif defined(__GNUC__)
             4#if __GNUC__<4 || (__GNUC__==4 && __GNUC_MINOR__<1)
             5#error GCC version must be greater or equal than 4.1.2
             6#endif
             7#include <sched.h>
             8#else
             9#error Currently only windows and linux os are supported
            10#endif
            11
            12void spin_init(spin_lock_t* lock,long* flag)
            13{
            14#ifdef _MSC_VER
            15    InterlockedExchange((volatile long*)&lock->flag_,0);
            16    InterlockedExchange((volatile long*)&lock->spin_,flag?(long)flag:(long)&lock->flag_);
            17#elif defined(__GNUC__)
            18    __sync_and_and_fetch((long*)&lock->flag_,0);
            19    __sync_lock_test_and_set((long*)&lock->spin_,flag?(long)flag:(long)&lock->flag_);
            20#endif
            21}

            22
            23void spin_lock(spin_lock_t* lock)
            24{
            25#ifdef _MSC_VER
            26    for (;0!=InterlockedExchange((volatile long*)lock->spin_,1);)
            27    {
            28        Sleep(1);
            29    }

            30#elif defined(__GNUC__)
            31    for (;0!=__sync_fetch_and_or(lock->spin_,1);)
            32    {
            33        sched_yield();
            34    }

            35#endif
            36}

            37
            38int spin_trylock(spin_lock_t* lock)
            39{
            40#ifdef _MSC_VER
            41    return !InterlockedExchange((volatile long*)lock->spin_,1);
            42#elif defined(__GNUC__)
            43    return !__sync_fetch_and_or(lock->spin_,1);
            44#endif
            45}

            46
            47void spin_unlock(spin_lock_t* lock)
            48{
            49#ifdef _MSC_VER
            50    InterlockedExchange((volatile long*)lock->spin_,0);
            51#elif defined(__GNUC__)
            52    __sync_and_and_fetch(lock->spin_,0);
            53#endif
            54}

            55
            56int spin_is_lock(spin_lock_t* lock)
            57{
            58#ifdef _MSC_VER
            59    return InterlockedExchangeAdd((volatile long*)lock->spin_,0);
            60#elif defined(__GNUC__)
            61    return __sync_add_and_fetch(lock->spin_,0);
            62#endif
            63}
            posted @ 2012-06-13 21:02 春秋十二月 閱讀(3065) | 評論 (3)編輯 收藏
                 摘要: 主類模板    gcc從4.1.2版本開始提供了__sync_*系列的內(nèi)置API,用于加減和邏輯運算,可以對1,2,4,8字節(jié)長度的數(shù)值或指針類型進行原子操作,為方便使用,筆者對這些API作了簡單的封裝。 Code highlighting produced by Actipro CodeHighlighter (freeware) http://...  閱讀全文
            posted @ 2012-06-08 00:19 春秋十二月 閱讀(4578) | 評論 (1)編輯 收藏
                 摘要:      類型選擇是一種編譯時的類型計算技術(shù),也就是根據(jù)條件判斷來匹配對應(yīng)的類型,功能形如運行時的if else和switch case控制結(jié)構(gòu)。在這里仿真運行時的條件語句,實現(xiàn)了類型選擇,包括if單分支、if多分支和switch case三種結(jié)構(gòu),關(guān)于其原理及細節(jié)就不多講了,直接看如下代碼  (1)if單分支 Code ...  閱讀全文
            posted @ 2012-06-06 13:49 春秋十二月 閱讀(2076) | 評論 (1)編輯 收藏
            僅列出標題
            共17頁: First 8 9 10 11 12 13 14 15 16 Last 
            国产叼嘿久久精品久久| 中文字幕无码av激情不卡久久| 久久久久亚洲AV片无码下载蜜桃| 国产精品内射久久久久欢欢| 国产精品久久久久久久久软件 | 99久久综合国产精品免费| 亚洲综合精品香蕉久久网| 色综合久久久久| 精品久久久久久国产| 国产精品99久久精品爆乳| 久久精品国产免费观看三人同眠| 久久久久综合网久久| 欧美日韩精品久久久免费观看| 久久国产精品一区二区| 思思久久99热只有频精品66| 天天综合久久久网| 亚洲中文字幕无码久久综合网| 久久99久久成人免费播放| 久久夜色精品国产网站| 亚洲精品综合久久| 国内精品久久久久久中文字幕| 亚洲精品白浆高清久久久久久| 久久精品亚洲欧美日韩久久| 99久久人人爽亚洲精品美女| 久久午夜伦鲁片免费无码| 久久精品国产男包| 久久99热这里只有精品国产| 中文字幕亚洲综合久久菠萝蜜| 99久久精品国产毛片| 久久99中文字幕久久| 国产精品一区二区久久不卡| 久久综合香蕉国产蜜臀AV| 久久精品国产亚洲AV久| 国产毛片欧美毛片久久久| 久久亚洲AV成人无码| 亚洲精品无码久久久| 香蕉久久AⅤ一区二区三区| 亚洲国产精品成人久久蜜臀| 欧美久久天天综合香蕉伊| 久久久WWW成人免费精品| 亚洲国产精品狼友中文久久久 |