• <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>
            隨筆-162  評論-223  文章-30  trackbacks-0
             
               本文以統計磁盤文件系統已用空間為例說明awk的用法,使用命令df可獲得磁盤文件系統的相關信息,如下圖所示
                  
               第3列Used便是已用空間的數據,這是正常的情形。當第1列Filesystem文本過長時,就有可能換行輸出,這是特殊的情形,如下圖所示
                  
               針對這兩種情形,如何寫出有效的命令腳本來統計Used列的數據和呢?從上面兩圖觀察對比顯然可得,以空白符開頭的文本行便是特殊情形,需要計算的是第2列;而正常情形的文本行,便是第3列。因此可得出awk腳本:   awk '{ if($0~/^ /) s+=$2; else s+=$3;} END{ print "Used total is: "s }'。

               用于正常情形,輸出如下
                     
               而特殊情形,則輸出如下
                  
            posted @ 2012-11-01 17:47 春秋十二月 閱讀(1711) | 評論 (1)編輯 收藏
                 摘要: 引言    在面向對象類的設計中,有時為了強化效能,特別是當構造大量小對象時,為了改善內存碎片,就需要自己實現對象的內存管理,以替換系統缺省的分配和釋放行為,即全局的new和delete。按照c++標準,在定制類專屬的new和delete時,為了減免客戶代碼使用時的麻煩和問題,需要考慮同時定制簡單(normal new)、定位(placement new)和無異常(...  閱讀全文
            posted @ 2012-09-27 17:37 春秋十二月 閱讀(2090) | 評論 (2)編輯 收藏
                 摘要: 情景分析    在網絡編程中,通常異步比同步處理更為復雜,但由于異步的事件通知機制,避免了同步方式中的忙等待,提高了吞吐量,因此效率較高,在高性能應用開發中,經常被用到。而在處理異步相關的問題時,狀態機模式是一種典型的有效方法,這在libevent、memcached、nginx等開源軟件(庫)中多次被使用而得到見證。據此,為拋磚引玉,本文展示了使用此方法異步接收變...  閱讀全文
            posted @ 2012-09-20 15:48 春秋十二月 閱讀(2835) | 評論 (2)編輯 收藏
               為方便查看特定TCP服務器進程的CPU、內存和網絡連接情況,編寫了一個簡單的腳本perf.sh,其原理是指定--tcp或-t選項來調用netstat命令,指定aux -T選項參數調用ps命令,對輸出結果根據進程名稱或PID調用grep過濾;為了輸出結果的可讀性,先調用ps和netstat,用head取出保存大多是說明描述性的頭幾行。這里的實現具有如下特點:
                支持單獨查看CPU和內存利用率,或網絡連接情況,或兩者皆可,name表示進程名,address表示網絡地址
                支持輸出重定向,使用exec實現將標準輸出重定向到file文件,當沒指定-o file選項參數時,則為標準輸出
                支持設置刷新時間,當沒指定-t seconds選項參數時,則默認為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
               最后順便提下,上面是查看某單個服務器進程的性能,若要查看整體服務器系統的性能,可以運用vmstat、iostat和free等命令。
            posted @ 2012-09-04 16:35 春秋十二月 閱讀(1722) | 評論 (1)編輯 收藏
            原理
               在linux平臺下編譯由多個源碼文件或目錄組成的項目工程時,需要編寫make腳本即Makefile文件來編譯,當項目工程寵大時,這種方式比單純地使用gcc命令行方便快捷,且易于維護。由于具體工程的源碼文件數量的多少及名稱的不同,因此編寫一個較為通用的Makefile文件,來實現編譯各種不同的工程,具有重要的參考意義和價值。本文展示了通用Makefile.in文件及其應用示例。Makefile.in文件,顧名思義,內部實現用的,應由外部具體的Makefile文件提供具體的命令行參數來調用,它包括exe,static,share三個規則目標,因此支持可執行文件、動態庫和靜態庫三種工程的編譯,而每種工程又支持debug和release兩種版本,默認為release版本,在編譯時會自動創建debug或release目錄來存放所有中間文件*.o和*.d。在其腳本源碼中,詳見下面實現,小寫變量為內部所有,大寫變量為make命令行提供的參數,目前支持以下幾種命令行參數:
                 1)輸出名稱:OUT_NAME,對于庫工程,內部自動添加lib前綴
                 2)輸出路徑:OUT_PATH,
            末尾反斜杠/可有可無
                 3)源碼路徑:SRC_PATH, 末尾反斜杠/可有可無
                 4)依賴動態庫路徑:SHARE_PATH,不帶庫名稱的路徑, 末尾反斜杠/可有可無 
                 5)依賴動態庫名稱:SHARE_LIB,不帶庫路徑的名稱,內部自動添加-l前綴
                 6)依賴靜態庫路徑:STATIC_PATH,不帶庫名稱的路徑,
            尾反斜杠/可有可無
                 7)依賴靜態庫路徑:STATIC_LIB,不帶庫路徑的名稱
                 8)預定義宏:MACROS,內部自動添加-D前綴
                 9)編譯模式:MODE,表示編譯成debug或release版本
                 關于頭文件包含的支持,這里沒有提供命令行參數,在內部它固定為SRC_PATH、/usr/include和/usr/local/include三個路徑,對于大多數的工程,應該夠用了。

            實現
             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)

            應用
               這里假設有兩個源碼子目錄netcomm和server,前者為動態庫netcomm工程,后者為主程序server工程,它依賴netcomm庫,每個目錄下都有其自己的Makefile,這個用于編譯單個模塊或主程序,它們的父目錄為src,在這個目錄下有兩個Makefile文件,一個是Makefile.in,這個就是上面講到的通用內部Makefile;另一個是Makefile,這個用來聯編所有的模塊和主程序。
               先來看下netcomm的Makefile文件內容,如下所示
             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文件內容,如下所示   
             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文件內容,如下所示
             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 春秋十二月 閱讀(3525) | 評論 (3)編輯 收藏
                 摘要:    信號量是一種用于并發環境同步手段的原語,分為無名信號量和有名信號量兩種,前者只能用于線程間同步,而后者還可用于進程間同步。它包括創建、等待、掛出、取值和銷毀5種基本操作。與互斥鎖不同的是:    ● 信號量擁有一個計數值,表示可用的資源數量,僅當該值為0或1時,則相當于互斥鎖。    &...  閱讀全文
            posted @ 2012-07-20 10:52 春秋十二月 閱讀(2200) | 評論 (0)編輯 收藏
                 摘要:    互斥鎖,用來保證任一時刻只有單個線程或進程擁有對共享資源的互斥訪問權,在這里將posix thread中的互斥體、win32中的互斥體和臨界區,統稱為互斥鎖,其特點如下:   ● 范圍:線程鎖和進程鎖,前者僅用于同一進程內多線程間,而后者用于進程間,顯然,它也能用于同一進程內多線程間,但效率較低。posix的互斥體既可以是線程鎖,...  閱讀全文
            posted @ 2012-06-23 00:08 春秋十二月 閱讀(3594) | 評論 (2)編輯 收藏
                 摘要:     socket pair,也稱套接字管道,主要用來實現進程內或進程間的一對一的全雙工或半雙工通信,在IO復用模型(如select,poll,epoll等)中起到通知中斷退出循環的作用,在類UNIX系統中已經有現成的實現,API為socketpair,但在Windows系統中沒有,因此本文主要講述Windows平臺下soketpair的實現及應用,支持IPv4和I...  閱讀全文
            posted @ 2012-06-17 03:02 春秋十二月 閱讀(3084) | 評論 (3)編輯 收藏
               自旋鎖作為一種并發同步的手段,特別適用于競爭少和鎖時間短的情況,在驅動及內核代碼中經常被用到,本文講述一種適合用戶態程序的自旋鎖,支持Windows和Linux(GCC>=4.1.2)平臺,并提供了C語言的接口和實現。

            接口
               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);

            實現
             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 春秋十二月 閱讀(3073) | 評論 (3)編輯 收藏
                 摘要: 主類模板    gcc從4.1.2版本開始提供了__sync_*系列的內置API,用于加減和邏輯運算,可以對1,2,4,8字節長度的數值或指針類型進行原子操作,為方便使用,筆者對這些API作了簡單的封裝。 Code highlighting produced by Actipro CodeHighlighter (freeware) http://...  閱讀全文
            posted @ 2012-06-08 00:19 春秋十二月 閱讀(4583) | 評論 (1)編輯 收藏
            僅列出標題
            共17頁: First 8 9 10 11 12 13 14 15 16 Last 
            久久久精品久久久久特色影视| 一本大道久久东京热无码AV| 国产精品美女久久久久久2018| 国产午夜福利精品久久2021| 欧美伊香蕉久久综合类网站| 久久伊人色| 97超级碰碰碰久久久久| 久久夜色撩人精品国产小说| 无码国内精品久久人妻| 99久久www免费人成精品| 97精品伊人久久大香线蕉| 久久99精品国产麻豆宅宅| 亚洲国产成人精品女人久久久| 日韩人妻无码精品久久免费一 | 色综合久久88色综合天天 | 久久久99精品成人片中文字幕| 久久青青草原精品国产软件| 中文国产成人精品久久不卡| 久久精品国产精品亚洲| 一本一道久久精品综合| 久久久免费精品re6| 亚洲国产另类久久久精品黑人| 国内精品伊人久久久久妇| 狠狠精品干练久久久无码中文字幕 | 色欲综合久久中文字幕网| 久久午夜无码鲁丝片午夜精品| MM131亚洲国产美女久久| 91精品国产色综合久久| 久久亚洲欧美国产精品| 色综合久久无码中文字幕| 77777亚洲午夜久久多喷| 久久人妻少妇嫩草AV蜜桃| 亚洲欧美成人久久综合中文网 | 久久精品中文字幕久久| 成人国内精品久久久久影院| 69久久夜色精品国产69| 97久久久久人妻精品专区| 久久国产亚洲精品麻豆| 国产视频久久| 漂亮人妻被中出中文字幕久久| 国产aⅴ激情无码久久|