Time of Update: 2018-12-04
ssh到163機器上,要求輸入密碼,這樣對一些指令碼工作不方便,因為要求輸入密碼,也就是需要人工幹預。此前用的方法是拷貝authorized_keys裡面(記不清了,以前搞過),最近發現一個命令ssh-copy-id很方便,try了一下,果然好用,記錄下來:在192.168.42.142機器上1)運行:ssh-keygen -t rsa2)然後拍兩下斷行符號(均選擇預設)3)運行: ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.42.1634
Time of Update: 2018-12-04
接上回:http://blog.csdn.net/pennyliang/archive/2010/10/21/5956302.aspx
Time of Update: 2018-12-04
記憶體的使用可以說對程式員來說極其重要,特別在大規模資料處理中,如何達到記憶體頻寬的極限是程式員追求的目標。 從本節開始,通過一系列的例子,來進行探討。本系列全部採用組合語言,使用的例子只有一個就是記憶體拷貝,這個最容易理解,最容易舉例的例子。 本節給出的代碼是baseline,也就是最差的方法,將來的方法都比這個要強的多,包括了精簡指令,記憶體的預取,MMX寄存器,塊複製等多項技術,希望讀者朋友持續閱讀。希望達到的目的包括:
Time of Update: 2018-12-04
接上回: linux編程的108種奇淫巧計-7(Lock-free實驗) 本節增加test_and_set的原語和一個spinlock比較完整的實現(參照nginx spin lock),主要的變化在於插入了__asm__
Time of Update: 2018-12-04
接上文:http://blog.csdn.net/pennyliang/archive/2011/03/08/6231709.aspx 按照慣例,首先對代碼進行一些解釋。 rdtsc函數是擷取機器開機的時間戳記。下面這段文字來自intel指令手冊: Loads the current value of the processor’s time-stamp counter (a 64-bit MSR) intothe EDX:EAX registers and also
Time of Update: 2018-12-04
編譯展開的這篇部落格被CSDN推了首頁http://blog.csdn.net/pennyliang/archive/2010/10/28/5971059.aspx,有些讀者反映有些太難,考慮到有些地方沒有講得太清楚,本文一併進行深入討論。 首先關鍵的代碼是: #define DO(x) x #define DO4(x) x x x x #define DO8(x) DO4(x) DO4(x) #define DO16(x)
Time of Update: 2018-12-04
有時候,我們可以將計算好的值進行儲存,需要的時候取出,這樣可以大大降低計算量,用空間代替時間。 我們從一個問題出發,農夫John和他的朋友們一同去參加Cownty展會,這個展會的門票是50元,排隊購票的人有2n個人,其中n個人拿著100元的鈔票,另外n個人拿著50元的鈔票,農夫john想知道在這種情況下著2n個人共有多少種排隊的方式,使得售票處在不準備零錢的情況下,也能把票賣給這2n個人,而不會出現找不開錢的局面。這是一個經典的組合問題,最後可以通過求解catalan數一步解決,我們這裡通過深入
Time of Update: 2018-12-04
從該部落格開始,會有一些小系列預計有4-5篇博文來介紹,鎖的應用和實踐,我們常常聽到spin lock,wait-free,lock-free,這到底是怎麼回事,我們能不能自己實現一個spin lock,原理是什嗎?這個小系列就討論這個內容。 首先我們來看兩個基本操作compare_and_swap和fetch_and_add,基本上lock-free的操作都會依賴這兩個基本的原子操作。特別是compare_and_swap這個原子操作,它源於IBM System 370
Time of Update: 2018-12-04
接上回:http://blog.csdn.net/pennyliang/archive/2011/03/08/6231709.aspx 用複雜指令的方法,沒有任何最佳化的餘地,最佳化的工作全仰仗intel工程師了,採用精簡指令,將迴圈展開,可以使用更多的技巧包括預取,NT,關於non-temp該系列前面的一篇文章已經詳細介紹不在多說。另外這裡用到了r8開始的寄存器,這些是64位新增的,通常在這種流式資料中普遍採用。
Time of Update: 2018-12-04
我打算開個長篇系列部落格,預計108篇吧,但願能在1-2年內完成。 註:考慮到我本人長期使用linux系統做開發,因此有些代碼在windows環境下無法編譯或者會有問題,建議大家都使用linux環境做實驗,最好是2.6核心的,處理器需要是多核。很多讀者說我是紙上談兵,這個確實不好,從本系列開始基本都是50行左右的代碼。本系列不代表任何學術或業界立場,僅我個人興趣愛好,由於水平有限,錯誤難免,請不要有過分期望。 廢話不多說,今天就寫第一篇如下:
Time of Update: 2018-12-04
上篇部落格:http://blog.csdn.net/pennyliang/archive/2010/10/20/5953939.aspx提出了一段代碼,並沒有給出解釋,本文接上文繼續展開討論。
Time of Update: 2018-12-04
在google上搜尋“linuxプログラミングの108種類”可以看到一些被翻譯的部落格,例如:http://bbs.flatworld.jp/node/1209 不知道這是機器自動翻譯的,還是人工翻譯的,有懂日語的朋友可以幫忙評鑑一下。 我的部落格好像被百度封了,可能是出現的外鏈太多的原因吧,但流量依然不減,可見還是受到一定的歡迎。 最近寫部落格的興趣在減退,不過看到這麼多讀者,感覺還是放不下啊。
Time of Update: 2018-12-04
電腦的儲存結構是層次性的,從快到慢,代價從高到低,容量從小到大,寄存器,L1 cache,L2
Time of Update: 2018-12-04
在數量眾多的檔案讀寫時,例如一個目錄下有400萬個圖片檔案,需要將這400萬個圖片檔案打包,如果這400萬個檔案讀寫順序不對,將會到這磁頭來回seek,即便單檔案順序,但由於每個檔案較小,因此順序的機會有限,大部分呈現隨機讀的狀態。 linux核心的IO scheduling 是針對單個檔案的,有四種調度方式,但缺乏對大量檔案的調度,因此有必要在使用者空間進行IO調度。
Time of Update: 2018-12-04
關於下面兩段代碼的解釋:引自水木Maling: "寫雖然是16bytes/cycle但那是througput 也就是說我們需要儘可能使每個cycle有一個寫操作進入write buffer after allocation stage從而保證 16bytes/cycle. 上面的代碼palignr 在前端阻擋(從讀取到解碼階段)了寫操作儘快的進入decode以及allocatoin stage 所以每個迴圈會比下面的代碼多出
Time of Update: 2018-12-04
接上文:linux編程的108種奇淫巧計-15(減少複製) 上回提到了用movntdq指令寫xmm寄存器的方式,可以獲得效能上的收益,並且指出在預設的情況下,在發生寫入的時候,需要先從低層次儲存層次refill到高層次儲存層次(可以簡單認為從記憶體refill進cache),然後再cache中更新,再write back,特彆強調的是,這是預設的方式。 實際上,高一級儲存層次,向低一級儲存層次寫入有兩種方式,一種是預設的write back,一種是write
Time of Update: 2018-12-04
類似fputs這樣的標準檔案IO函數均為安全執行緒,即函數內部會加鎖解鎖,但如果是大量檔案讀寫,可以採用flockfile函數來進行統一加鎖減鎖,而內部採用線程不安全的檔案IO。 例如 fputs("XXX",stream); fputs("YYY",stream); fputs("ZZZ",stream); 可以改寫為 flockfile(stream) fputs_unlocked("XXX",stream);
Time of Update: 2018-12-04
再答gangban_lau:http://blog.csdn.net/gangban_lau/archive/2010/11/10/6000977.aspx 部落格確實不是很好的討論平台。 對於是否原子性這個問題,我們在水木體繫結構版曾討論過這個話題,參見yifanw的發言,“在所有mordern archiecture上,對齊的machine
Time of Update: 2018-12-04
今天繼續介紹第4種常見技巧,編譯展開,代碼見本文最後,重要的部分有注釋說明。 我們知道對於迴圈,編譯器會自動進行展開,但是如何展開,這完全不可控,如果我們自行碼代碼,代碼會顯得臃腫難看,大段重複代碼,因此本為介紹了一種常見的方法進行這種代碼展開,可以寫到任意層次,我這裡唯寫到了DO16,見代碼加粗的部分。 實驗表明在手動展開後,加上O3的編譯最佳化,依然能夠比不手動展開要快,大家可以實驗以下的代碼。
Time of Update: 2018-12-04
在linux下憂盤被作為SCSI裝置,掛載優盤前首先確認優盤裝置名稱,在終端輸入dmesg|more查看,我的是sda1 建立掛載點/mnt/usb 然後用mount -t vfat /dev/sda1 /mnt/usb掛載即可,或者通過在fstab中加入/dev/sda1 /mnt/usb vfat defaults 0 0開機自動掛載,但用defaults參數,如果開機時優盤沒有插上,就會報錯. 所以我是在fstab中加入/dev/sda1 /mnt/usb vfat noauto 0 0,