說說操作系統(tǒng)的進(jìn)程ID和MongoDB _id主鍵
成都創(chuàng)新互聯(lián)公司專注于新洲企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站定制開發(fā)。新洲網(wǎng)站建設(shè)公司,為新洲等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)在分布式系統(tǒng)中,數(shù)據(jù)之間的合并成為常態(tài),單機(jī)系統(tǒng)中的數(shù)據(jù)庫可以使用自增加ID作為主鍵,簡(jiǎn)單省事??墒窃诜植际较到y(tǒng)中,數(shù)據(jù)合并存在了巨大的困難。數(shù)據(jù)主鍵的選取就成為了很大的問題。一個(gè)常規(guī)的解決方法就是使用GUID作為主鍵。GUID作為數(shù)據(jù)庫主鍵也有兩個(gè)不太好的地方,一是,有些數(shù)據(jù)庫系統(tǒng)沒有GUID類型,只好用字符串替代,字符串長(zhǎng)度為32位(16Byte字節(jié)的16進(jìn)制表示)。二是Guid沒有順序規(guī)律,在排序的時(shí)候效率很差。
在MongoDB中,每個(gè)文檔都有一個(gè)_id,采用了一種生成算法,可以保證在分布式的情況下,產(chǎn)生不重復(fù)的ID。該算法中有一部分是進(jìn)程ID。占用兩個(gè)字節(jié),共支持進(jìn)程編號(hào)65535個(gè)(0xFFFF),我們查看操作系統(tǒng)API(Windows和Linux)的時(shí)候發(fā)現(xiàn),進(jìn)程ID是一個(gè)整數(shù),那么MogonDB的算法會(huì)不會(huì)有問題呢?
在Linux中查看系統(tǒng)允許的大進(jìn)程ID:
# cat /proc/sys/kernel/pid_max 32768可見,Linux中大允許的進(jìn)程ID為32768。另一個(gè)問題,進(jìn)程ID整數(shù),并且是遞增的,這個(gè)數(shù)夠用嗎?
實(shí)際上,Linux中不可能同時(shí)跑這么多個(gè)進(jìn)程。當(dāng)一個(gè)進(jìn)程結(jié)束時(shí),進(jìn)程的ID被空閑出來。空閑出來的ID也沒有被Linux系統(tǒng)及時(shí)回收,而是當(dāng)PID持續(xù)增加到大值的時(shí)候,才開始回滾。即在新建進(jìn)程的時(shí)候,查找可用的進(jìn)程號(hào),找到后把該進(jìn)程號(hào)分配給新的進(jìn)程。
Linux沒問題,那么Windows呢?
Windows中的進(jìn)程ID實(shí)際上是一個(gè)全局句柄表PspCidTable的偽索引。為什么是偽索引,請(qǐng)看以下的描述:
一個(gè)進(jìn)程的句柄表包含了所有已被該進(jìn)程打開的那些對(duì)象的指針。對(duì)象句柄是用來檢索句柄表的一個(gè)“偽索引”。對(duì)于句柄表機(jī)制,achillis<<Windows句柄表>>系列文章已經(jīng)分析得很透徹了,只是對(duì)“句柄以4為步進(jìn)”來源不明。經(jīng)查,根源如下:
typedefstruct _EXHANDLE
{
union
{
struct
{
ULONG TagBits:2;
ULONG Index:30;
}
HANDLE GenericHandleOverlay;
#define HANLE_VALUE_INC 4
ULONG_PTR Value;
}
}EXHANDLE,*PEXHANDLE;
此結(jié)構(gòu)正是用來定義句柄類型。低2位TagBits為標(biāo)志位Windows用于其它用途,故句柄值低2位對(duì)其作為句柄表索引本身無意義,所以等于4的倍數(shù)。有了以上分析,自然,在用句柄值為索引取句柄表項(xiàng)時(shí),句柄值必須/4。因此程序中用到的句柄值并不能直接用來索引句柄表,也就有了“偽索引”說法。
Windows的全局句柄表有65535個(gè)位置,所以windows系統(tǒng)最多只能提供65536/4=16384個(gè)可用的句柄數(shù)(如果在程序中不停的打開進(jìn)程ID卻不及時(shí)關(guān)掉不用的進(jìn)程句柄,會(huì)導(dǎo)致系統(tǒng)變慢程序崩潰)。
如何在Windows下查看進(jìn)程ID:
1.按ctrl+alt+delete鍵調(diào)出任務(wù)欄管理器,依次點(diǎn)擊查看----選擇列---在彈出的窗口中在PID前面打勾,帶你及確定,在任務(wù)欄管理器的進(jìn)程中PID下面的就是該進(jìn)程的進(jìn)程號(hào)!
2.開始---運(yùn)行----在對(duì)話框中輸入:cmd然后回車---在彈出的控制臺(tái)中輸入 tasklist就會(huì)出現(xiàn)所有進(jìn)程,同樣PID下面的是進(jìn)程號(hào)!
好了,MogonDB的主鍵中的進(jìn)程表示方法在Windows中也是沒有問題的。
再說題頭,MongoDB中的主鍵聲稱策略還是很有效的。MongoDB主鍵表示如下:
4位:時(shí)間戳(精確到秒) 3位:機(jī)器名哈希值 2位:進(jìn)程ID 3位:自動(dòng)增加的順序值。在這個(gè)方案中,可以很好的借鑒作為我們自己信息系統(tǒng)的數(shù)據(jù)庫主鍵的生成策略。但是有一點(diǎn)筆者需要做一下標(biāo)注,3位機(jī)器名哈希值可能會(huì)重復(fù)。
在一個(gè)環(huán)境中,如果可以保證機(jī)器名不重復(fù)的話,也很難保證機(jī)器名哈希之后的三個(gè)字節(jié)不重復(fù)。當(dāng)然在機(jī)器只有幾臺(tái)或十幾臺(tái)的情況下,這個(gè)沖突的可能性比較低。
即使機(jī)器名哈希值重復(fù)了,碰巧了兩臺(tái)機(jī)器的進(jìn)程ID一致,并且在同一秒內(nèi),碰到了統(tǒng)一個(gè)自增順序值,這樣產(chǎn)生的ID才會(huì)重復(fù)??垂?,您可以計(jì)算一下這個(gè)概率有多低。
參考文獻(xiàn)。
http://www.newsmth.net/nForum/#!article/KernelTech/59502
http://www.cnblogs.com/Thriving-Country/archive/2011/09/18/2180143.html
http://zhidao.baidu.com/question/147564693.html
http://blog.csdn.net/scorpio3k/article/details/5835614
~~THE END~~
尹曙光
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞名稱:說說操作系統(tǒng)的進(jìn)程ID和MongoDB_id主鍵-創(chuàng)新互聯(lián)
新聞來源:http://aaarwkj.com/article46/jeohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、Google、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容