posts - 12,comments - 1,trackbacks - 0
          看understanding linux kernel的一點筆記:
          頁表
          通常32位cpu使用2級頁表機制就已足夠,但到64位時代,2級頁表會使頁表的項急劇增加,所以通常會使用更多的頁表級數。
          ia64/ppc64/alpha使用3級頁表,x86_64使用到4級頁表。為兼容這些模型,2.6.11之后使用了統一的4級頁表模型
          Global Directory
          Upper Directory
          Middle Directory
          Page Table
          針對不同的架構,設置每一級不同的地址位數,0的話就是不使用這一級頁表機制。

          cache
          多cpu環境中,每個cpu有自己的cache,對cache的更新有硬件機制保證通知其他的cpu進行同步。(真的嗎?)

          tlb
          用來cache頁表,加速地址的轉換速度。每個cpu有自己的tlb,但不需要同步,因為地址轉換和進程相關。

          posted @ 2008-11-01 08:27 白色天堂 閱讀(141) | 評論 (0)編輯 收藏
          LinuxThreads:
            舊的pthread實現,基于process實現pthread。主要問題是signal不符合規范,stack size固定???

          NPTL:
            2.6后加入的新實現,redhat as中2.4就可以支持。更符合pthread的規范。用戶線程和內核線程采取1:1模式,支持floating stack。

          posted @ 2008-09-09 22:56 白色天堂 閱讀(192) | 評論 (0)編輯 收藏
          今天花了一點時間作了個x86上hotspot vm的disassembler,這樣可以看出jvm生成的本地代碼了。
          代碼比較簡單,主要是用了udis86的庫,這個可以在sf上下載到,它的接口還是比較簡單的。

          簡單的例子,hotspot解析模式中iconst_0的對應匯編代碼:
          iconst_0  3 iconst_0  [0xb4d98120, 0xb4d98160]  64 bytes

            0xb4d98120: sub esp, 0x4
            0xb4d98123: fstp dword [esp]
            0xb4d98126: jmp 0x1e
            0xb4d9812b: sub esp, 0x8
            0xb4d9812e: fstp qword [esp]
            0xb4d98131: jmp 0x13
            0xb4d98136: push edx
            0xb4d98137: push eax
            0xb4d98138: jmp 0xc
            0xb4d9813d: push eax
            0xb4d9813e: jmp 0x6
            0xb4d98143: push eax
            0xb4d98144: xor eax, eax
            0xb4d98146: movzx ebx, byte [esi+0x1]
            0xb4d9814a: inc esi
            0xb4d9814b: jmp dword near [ebx*4+0x6900680]

          posted @ 2008-08-24 00:28 白色天堂 閱讀(182) | 評論 (0)編輯 收藏
          對soft reference,比較容易理解它的用處。它天生就是為實現cache來設計的。關于weak reference,好像很少有人說的清楚。有的和soft reference混在一起談,有的就是簡單翻譯java doc中的說明,看得出翻譯的人自己也不是很理解,所以只能一筆帶過。

          我也一直不是很清楚它的實際用途,今天我突然想到WeakReference可能的設計目的。

          從java的內存泄漏說起,以前說到java也會內存泄漏的時候往往會舉這樣的例子,對象保存在一個全局表中,造成無法回收。一般的解決方法是不要使用全局表或者記得更新。但在實際開發中,有時必須要使用全局表,但無法明確知道該對象是否可銷毀,因為對象可能被多個線程共享訪問,所以程序不能確切的更新表中的引用。這時候weak reference就有用武之地,用WeakHashMap構造全局表,key和value之間是weak reference,這樣的話程序員就不用考慮更新該表了,只要該對象沒有強引用指向它,gc就可以回收它了。

          回頭去找一個實際的例子對照看看,記得在JDK中,weak reference還是用的很頻繁的。

          posted @ 2008-07-25 22:51 白色天堂 閱讀(612) | 評論 (0)編輯 收藏
          以前用redhat的時候使用rpm管理軟件包,因為不能解決軟件的依賴關系后來轉到debian。apt確實方便了很多,但一直懷念rpm的一個功能,rpm可以查詢一個文件具體屬于哪個包,用apt一直沒有找到對應的命令。
          今天想在64位ubuntu上編譯32位程序的時候發現沒有/usr/include/gnu/stub-32.h,在網上搜索時突然發現apt也可以根據文件來搜索包。命令是apt-file(缺省是沒有安裝的)。
          先安裝apt-file
          使用apt-file update同步安裝包內部的文件,它會到你定義的source去獲取這些信息,運行會比較慢,而且沒有什么提示,不知道今后會不會都是這樣。
          然后就可以用apt-file find xxx 去查詢了。


          -每天進步一點點, :)

          posted @ 2008-05-21 23:04 白色天堂 閱讀(347) | 評論 (1)編輯 收藏
          代碼生成一般采用tree rewriting的方式,先將源代碼轉換成語法樹的形式,通過模式匹配將子樹替換成葉結點,同時生成代碼指令,當樹全部替換完后代碼即生成了。采用這種方式主要關心匹配規則,甚至可以使用lex/yacc之類的工具生成code generator generator,也便于實現可移植的編譯器。

          dynamic programing
          前面的算法如果只是從左往右依次匹配的話生成的代碼質量不高,DP就是要考慮指令的代價,生成質量較優的代碼。

          自底向上為每個節點計算一系列值存入數組C[],其中index代表使用的register數目,存儲的是相應的代價(要考慮可能增加的store/load指令代價),計算某個節點的C[]時,先找到可能的匹配模式,根據匹配模式選擇可能的寄存器數目組合,計算代價后選擇最小值。這樣遍歷整個樹后可以得到最小代價生成方式。



          posted @ 2008-05-07 05:14 白色天堂 閱讀(264) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 金堂县| 搜索| 德州市| 昭平县| 康马县| 尉氏县| 玉溪市| 嵩明县| 蕉岭县| 桐梓县| 阿坝县| 惠州市| 新民市| 吉木萨尔县| 崇文区| 吉隆县| 上饶市| 湘西| 邵东县| 图木舒克市| 长垣县| 石阡县| SHOW| 垦利县| 温宿县| 阿拉善右旗| 涟源市| 西宁市| 肃北| 新巴尔虎右旗| 遂溪县| 正阳县| 孟津县| 太湖县| 咸丰县| 胶南市| 丰台区| 乡城县| 佳木斯市| 行唐县| 郴州市|