2023年最新的CPU緩存冷門知識講解_第1頁
2023年最新的CPU緩存冷門知識講解_第2頁
2023年最新的CPU緩存冷門知識講解_第3頁
2023年最新的CPU緩存冷門知識講解_第4頁
2023年最新的CPU緩存冷門知識講解_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第CPU緩存冷門知識講解計算機組成原理-CPU高速緩存

按道理來說,循環(huán)1花費的時間應(yīng)該是循環(huán)2的16倍左右。但實際上,循環(huán)1在我的電腦上運行需要50毫秒,循環(huán)2只需要46毫秒。相差在15%之內(nèi),1倍都沒有。

這就是CPUCache(高速緩存)帶來的效果。

程序執(zhí)行時,CPU將對應(yīng)的數(shù)據(jù)從內(nèi)存中讀取出來,加載到CPUCache里。這里注意,CPU是一小塊一小塊來讀取數(shù)據(jù)的,而不是按照單個數(shù)組元素來讀取數(shù)據(jù)的。

這一小塊一小塊的數(shù)據(jù),在CPUCache里面,我們把它叫作CacheLine(緩存塊)。

日常用的Intel效勞器或者PC中,CacheLine的大小通常是64字節(jié)。

上面的循環(huán)2里面,每隔16個整型數(shù)計算一次,16個整型數(shù)正好是64個字節(jié)。所以,循環(huán)1和循環(huán)2,都需要把同樣數(shù)量的CacheLine數(shù)據(jù)從內(nèi)存中讀取到CPUCache中,導(dǎo)致兩個程序花費的時間就差異不大了。

CPUCache一般有三層,L1/L2單核私有,L3多核共享緩存(這里的L1-L3指特定的由SRAM組成的物理芯片,不是概念上的緩存)。有了CPUCache,內(nèi)存中的指令、數(shù)據(jù),會被加載到L1-L3Cache中,95%的情況下,CPU都只需要訪問L1-L3Cache,而無需訪問內(nèi)存。

CpuCache讀取數(shù)據(jù)

現(xiàn)代CPU進行數(shù)據(jù)讀取的時候,無論數(shù)據(jù)是否已經(jīng)存儲在Cache中,CPU始終會首先訪問Cache。只有當(dāng)CPU在Cache中找不到數(shù)據(jù)的時候,才會去訪問內(nèi)存,并將讀取到的數(shù)據(jù)寫入Cache之中。

那么,Cache如何根據(jù)內(nèi)存地址定位到數(shù)據(jù)呢?

根據(jù)內(nèi)存地址的低位,計算在Cache中的索引;

判斷有效位,確認Cache中的數(shù)據(jù)是有效的;

比照內(nèi)存地址的高位,和Cache中的組標記,確認Cache中的數(shù)據(jù)就是我們要訪問的內(nèi)存數(shù)據(jù),從CacheLine中讀取到對應(yīng)的數(shù)據(jù)塊(DataBlock);

根據(jù)內(nèi)存地址的Offset位,從DataBlock中,讀取希望讀取到的字

如果在2、3這兩個步驟中,CPU發(fā)現(xiàn),Cache中的數(shù)據(jù)并不是要訪問的內(nèi)存地址的數(shù)據(jù),那CPU就會訪問內(nèi)存,并把對應(yīng)的BlockData更新到CacheLine中,同時更新對應(yīng)的有效位和組標記的數(shù)據(jù)。

總結(jié)一下,一個內(nèi)存的訪問地址,最終包括高位代表的組標記、低位代表的索引,以及在對應(yīng)的DataBlock中定位對應(yīng)字的位置偏移量。

CpuCache寫入數(shù)據(jù)

當(dāng)Cpu要寫入數(shù)據(jù)時,到底是寫Cache還是寫主存呢,如何保證一致性呢?

這里介紹兩種寫入策略。

1.寫直達(Write-Through)

寫入前,我們會先去判斷數(shù)據(jù)是否已經(jīng)在Cache里面了。如果數(shù)據(jù)已經(jīng)在Cache里面了,我們先把數(shù)據(jù)寫入更新到Cache里面,再寫入到主內(nèi)存里面;如果數(shù)據(jù)不在Cache里,我們就只更新主內(nèi)存。

這個策略很直觀,但是問題也很明顯,那就是這個策略很慢。無論數(shù)據(jù)是不是在Cache里面,我們都需要把數(shù)據(jù)寫到主內(nèi)存里面。這個方式就有點兒像Java里volatile關(guān)鍵字,始終都要把數(shù)據(jù)同步到主內(nèi)存里面。

2.寫回(Write-Back)

如果要寫入的數(shù)據(jù),就在CPUCache里面,那么就只更新CPUCache里面的數(shù)據(jù)。同時標記CPUCache里的這個Block是臟(Dirty)的。就是這個時候,CPUCache里的這個Block的數(shù)據(jù),和主內(nèi)存是不一致的。

如果要寫入的數(shù)據(jù)所對應(yīng)的CacheBlock里,放的是別的內(nèi)存地址的數(shù)據(jù),那么就要看一看,CacheBlock里的數(shù)據(jù)有沒有被標記成臟的。如果是臟的,要先把這個CacheBlock里面的數(shù)據(jù),寫入到主內(nèi)存里面。然后,再把當(dāng)前要寫入的數(shù)據(jù),寫入到Cache里,同時把CacheBlock標記成臟的。如果Block里面的數(shù)據(jù)沒有被標記成臟的,那么我們直接把數(shù)據(jù)寫入到Cache里面,然后再把CacheBlock標記成臟的就好了。

然而,無論是寫回還是寫直達,都沒有解決多線程,或者是多個CPU核的緩存一致性的問題。

這也就是我們在寫入修改緩存后,需要解決的第二個問題。

要解決這個問題,我們需要引入一個新的方法,叫作MESI協(xié)議。這是一個維護緩存一致性協(xié)議。這個協(xié)議不僅可以用在CPUCache之間,也可以廣泛用于各種需要使用緩存,同時緩存之間需要同步的場景下。

多核CPUCache緩存一致性

因為多核CPUCache在L3緩存是共享的,所以一致性問題,只會出現(xiàn)在L1/L2級這種單核私有緩存的場景中。

我們需要有一種機制,來同步兩個不同核心里面的緩存數(shù)據(jù)。這樣的機制需要滿足兩點:

第一點叫寫傳播(WritePropagation)。寫傳播是說,在一個CPU核心里,我們的Cache數(shù)據(jù)更新,必須能夠傳播到其他的對應(yīng)節(jié)點的CacheLine里。

第二點叫事務(wù)的串行化(TransactionSerialization),事務(wù)串行化是說,我們在一個CPU核心里面的讀取和寫入,在其他的節(jié)點看起來,順序是一樣的。

CPUCache里做到事務(wù)串行化,需要做到兩點,第一點是一個CPU核心對于數(shù)據(jù)的操作,需要同步通信給到其他CPU核心。第二點是,如果兩個CPU核心里有同一個數(shù)據(jù)的Cache,那么對于這個Cache數(shù)據(jù)的更新,需要有一個“鎖〞的概念。只有拿到了對應(yīng)CacheBlock的“鎖〞之后,才能進行對應(yīng)的數(shù)據(jù)更新。接下來,我們就看看實現(xiàn)了這兩個機制的MESI協(xié)議。

MESI協(xié)議,是一種叫作寫失效(WriteInvalidate)的協(xié)議。在寫失效協(xié)議里,只有一個CPU核心負責(zé)寫入數(shù)據(jù),其他的核心,只是同步讀取到這個寫入。在這個CPU核心寫入Cache之后,它會去播送一個“失效〞請求告訴所有其他的CPU核心。其他的CPU核心,只是去判斷自己是否也有一個“失效〞版本的CacheBlock,然后把這個也標記成失效的就好了。

MESI協(xié)議的由來呢,來自于我們對CacheLine的四個不同的標記,分別是:

M:代表已修改(Modified)E:代表獨占(E__clusive)S:代表共享(Shared)I:代表已失效(Invalidated)

我們先來看看“已修改〞和“已失效〞,這兩個狀態(tài)比較容易理解。所謂的“已修改〞,就是我們上一講所說的“臟〞的CacheBlock。CacheBlock里面的內(nèi)容我們已經(jīng)更新過了,但是還沒有寫回到主內(nèi)存里面。而所謂的“已失效“,自然是這個CacheBlock里面的數(shù)據(jù)已經(jīng)失效了,我們不可以相信這個CacheBlock里面的數(shù)據(jù)。

然后,我們再來看“獨占〞和“共享〞這兩個狀態(tài)。這就是MESI協(xié)議的精華所在了。無論是獨占狀態(tài)還是共享狀態(tài),緩存里面的數(shù)據(jù)都是“干凈〞的。這個“干凈〞,自然對應(yīng)的是前面所說的“臟〞的,也就是說,這個時候,CacheBlock里面的數(shù)據(jù)和主內(nèi)存里面的數(shù)據(jù)是一致的。

那么“獨占〞和“共享〞這兩個狀態(tài)的差異在哪里呢?這個差異就在于,在獨占狀態(tài)下,對應(yīng)的CacheLine只加載到了當(dāng)前CPU核所擁有的Cache里。其他的CPU核,并沒有加載對應(yīng)的數(shù)據(jù)到自己的Cache里。這個時候,如果要向獨占的CacheBlock寫入數(shù)據(jù),我們可以自由地寫入數(shù)據(jù),而不需要告知其他CPU核。

在獨占狀態(tài)下的數(shù)據(jù),如果收到了一個來自于總線的讀取對應(yīng)緩存的請求,它就會變成共享狀態(tài)。這個共享狀態(tài)是因為,這個時候,另外一個CPU核心,也把對應(yīng)的CacheBlock,從內(nèi)存里面加載到了自己的Cache里來。

而在共享狀態(tài)下,因為同樣的數(shù)據(jù)在多個CPU核心的Cache里都有。所以,當(dāng)我們想要更新Cache里面的數(shù)據(jù)的時候,不能直接修改,而是要先向所有的其他CPU核心播送一個請求,要求先把其他CPU核心里面的Cache,都變成無效的狀態(tài),然后再更新當(dāng)前Cache里面的數(shù)據(jù)。這個播送操作,一般叫作RFO(RequestForOwnership),也就是獲取當(dāng)前對應(yīng)CacheBlock數(shù)據(jù)的所有權(quán)。

有沒有覺得這個操作有點兒像我們在多線程里面用到的讀寫鎖。在共享狀態(tài)下,大家都可以并行去讀對應(yīng)的數(shù)據(jù)。但是如果要寫,我們就需要通過一個鎖,獲取當(dāng)前寫入位置的所有權(quán)。

整個MESI的狀態(tài),可以用一個有限狀態(tài)機來表示它的狀態(tài)流轉(zhuǎn)。需要注意的是,對于不同狀態(tài)觸發(fā)的事件操作,可能來自于當(dāng)前CPU核心,也可能來自總線里其他CPU核心播送出來的信號。我把對應(yīng)的狀態(tài)機流轉(zhuǎn)圖放在了下面,你可以對照著Wikipedia里面MESI的內(nèi)容,仔細研讀一下。

為什么CPU有多層緩存

緩存的故事

假設(shè)你是一位六十年代的白領(lǐng),在巨大的辦公樓里工作,沒有電腦,你需要閱讀大量的文件并且交叉檢索這些文檔。

你有一個辦公桌(L1緩存)。桌上的文件是你正在手頭處理的資料,還有一些是你最近看過的或者你準備閱讀的。通常我們需要閱讀文件的每一頁(對應(yīng)于存儲單元的一個字節(jié)),但除非它們在辦公桌上,文件都是作為一個整體。即只想看某一頁的內(nèi)容,我們也必須把整份文件抓過來。

辦公室里還有文件柜(L2緩存)。這些文件柜里存放的是你最近處理過,但目前沒有在使用的文件。辦公桌上的文件在用完后,通常也會放回文件柜。從文件柜里拿文件就不是順手拈來了——你需要走過去,翻開相應(yīng)的抽屜,還要查目錄卡片,才能找到想要的文件——不過這也還比較快了。

有些時候,其他人也需要查看你的文件柜里的文件。勤雜工會推著一輛推車(環(huán)路公共汽車)在各個辦公室轉(zhuǎn)。如果有人在自己的文件柜沒有找到相應(yīng)的資料,他會寫一個紙條交給勤雜工。為簡化起見,假設(shè)這位勤雜工知道所有的東西放哪兒。所以當(dāng)他來到你的辦公室的時候,他會檢查你的文件柜里是否有其他人需要的文件,如果有,就把這些文件抽出來放到車上。當(dāng)他轉(zhuǎn)到別的辦公室,就會把找到的文件放在文件柜里,并留下收條。

有時候,這些文件并不在文件柜里,而是在辦公桌上。那就不可以直接拿了,需要征詢主人的意見,如果不行,大家就要商量如何協(xié)調(diào)。有大量冗長的詳盡的合作指引來處理這類情況(至少要一起開會)。

文件柜經(jīng)常會滿,這時就不能放新的文件,需要先騰地方,把一些很久都沒用到的文件拿出來。勤雜工會把這些文件放到地下室里(L3緩存)。地下室里的文件被密集地堆放到紙箱里或者文件架上,交給文檔管理員處理,其他人都不會下去,也不會了解文檔的存放細節(jié)。

當(dāng)勤雜工來到地下室,會把一堆不需要的文件放到‘in’框里,同時他也會留下一堆紙條,寫著在樓上文件柜里找不到的文件名。文檔管理員會拿著這些紙條,找到對應(yīng)的文件,把它們放到‘out’框里。下次勤雜工下來的時候,就可以把‘out’框里的文件拿走,交給需要的人。

現(xiàn)在的問題是,文件還是太多,地下室也放不下,而且辦公大樓的租金都很貴,所以通常公司都會在離市區(qū)較遠的地方租一個倉庫來存放歸檔文件(對應(yīng)于DRAM內(nèi)存)。文檔管理員會記錄哪些文件放在地下室,哪些文件放在倉庫。這樣,當(dāng)需要拿文件時,管理員就知道哪些是能在地下室找到,哪些要到倉庫里拿。每天有一兩次,會有一輛貨車開到倉庫去拿需要的文件,同時把一些地下室的舊文件運過去。

對勤雜工而言,他并不關(guān)心這些細節(jié),這些都是文檔管理員在處理。他需要做的就是把紙條放到‘in’框里,從‘out’框里取出文件。

回到最初的問題

那么,這個類比的意義何在?簡短而言,一個具體的模型比模糊的概念更能清晰地說明物流的意義。實際上,物流對設(shè)計芯片的意義和運作一個高效的辦公文件處理系統(tǒng)是一樣的。

最初的問題是‘為什么不用一個大的緩存,而是用幾層小的緩存?’。也就是說,如果一個4核芯片配置32K一級緩存,256K二級緩存和2M三級緩存,為什么不能用一個3M的大緩存?

在類比里,類似于問與其給4個人每人分一個1.5米寬的辦公桌,為什么不給這4個人一個150米寬的大辦公桌?

關(guān)鍵在于,放辦公桌上的目的就是要能觸手可及。如果辦公桌太大,就沒有意義了。難道還需要走50米去拿文件?對一級緩存也是同理,如果太大,存取速度會變慢,而且會消耗更多的電力。所以一級緩存既要足夠大到能起作用,又要小到能夠快速存取。

另外一點,一級緩存處理的存取類型和其他緩存不同。有L1的數(shù)據(jù)緩存,也有L1指令緩存。Intel的CPU還有另外的指令緩存,uOp緩存,既叫L1并發(fā)指令緩存也叫L0指令緩存。

L1數(shù)據(jù)緩存通常只處理1到8個字節(jié)的數(shù)據(jù),但高層級的緩存并不處理單獨的字節(jié)。在我們的類比里,所有不辦公桌上的資料都是以文件為單位(對應(yīng)于catchline)。在內(nèi)存中也一樣,高層級緩存通常是批發(fā)處理數(shù)據(jù),以緩存行為單位(cacheline)。

L1指令緩存和數(shù)據(jù)緩存完全不同,就內(nèi)核而言,它是只讀的。(指令內(nèi)存的寫入通常是用非直接的方式,先把指令放入高層的緩存,再載入一級指令緩存)。由于這個原因,指令緩存和數(shù)據(jù)緩存通常是分隔的。使用通用的L1緩存意味著把互相沖突的設(shè)計原那么糅合在一起,妥協(xié)的結(jié)果就是任何一個目的都達不到。而且用通用的L1緩存處理指令和數(shù)據(jù)負載也會很大。

另外,作為程序員,我們通常不關(guān)心內(nèi)存帶寬。例如,每個時鐘周期,i7的CPU的內(nèi)核能從L1緩存中讀取16字節(jié)的指令,而且會不斷地循環(huán)讀取。如果是3GHZ,每個核可以讀50GB指令/秒。實際上,通常L1指令緩存的能力都足夠大,很少需要L2緩存參與處理。但如果是通用緩存,就需要預(yù)估指令和數(shù)據(jù)的高并發(fā)情況。(想象一下在L1緩存中用memcopy拷貝幾K數(shù)據(jù)的情況)

順便提一句,如果都在L1緩存,CPU能在一個時鐘周期完成許多存取操作。‘Haswell’或者之后的3GHZ的i7內(nèi)核可以處理超過300GB的指令和數(shù)據(jù),如果搭配合理的話。這樣的處理能力綽綽有余,但你仍然需要考慮數(shù)據(jù)和指令同時出現(xiàn)峰值的情況。

L1緩存在設(shè)計上就是越快越好,以應(yīng)對峰值情況。只有L1緩存處理不了,才會轉(zhuǎn)給更高層的緩存,但速度會降低。因為高層緩存更關(guān)心電力效率和存儲密度。

第三點,共享。在上面的比喻中,獨立辦公桌,亦或L1緩存是私有的,如果在你的辦公桌上,你只管拿就好了,不需要詢問其他人。

這很關(guān)鍵。如果4個人共享一個大辦公桌,你就不能隨便拿文件,因為另外三個人可能正在使用。(即使他們只是在閱讀其他文件時順便參考一下你想使用的文件)。任何時候,你想要拿什么東西,你需要先叫一聲,‘有人在用嗎?’如果別人在你前面,你就必須等待。或者需要一個排隊系統(tǒng),當(dāng)存在資源沖突的時候,每個人需要拿張票排隊等候,或者其它的什么機制,具體實現(xiàn)細節(jié)并不重要,但是所有的事情你都需要和其他人協(xié)調(diào)。

對多核共享緩存的情況也是這樣。你不能在不通知別人的情況下隨意動那些數(shù)據(jù),所有對共享緩存的操作都必須協(xié)調(diào)進行。

這就是為什么我們要使用私有的L1緩存。L1緩存就是你的辦公桌,你可以隨便使用桌上的文件。L2緩存處理大局部的協(xié)同操作。大局部時間,工作者(CPU內(nèi)核)坐在辦公桌前,勤雜工會走過來,把需求列表拿走,同時把之前你想找的文件放倒文件柜里。整個過程不會打斷你的工作(CPU)。

僅僅當(dāng)你和勤雜工都需要拿文件柜里的同一份文件,或者別人想用你辦公桌上的文件,這時就需要停下手頭工作,進行交談。

簡單而言,L1緩存的工作就是優(yōu)先為CPU內(nèi)核效勞。因為是私有的,所以根本不需要協(xié)調(diào)工作。L2緩存也是私有的,但是它的工作重心還包括在不打攪內(nèi)核工作的情況下,處理大量的緩存間的數(shù)據(jù)通信。

L3緩存是共享資源,需要全局協(xié)調(diào)。在上面的類比中,工作者只有從勤雜工的推車里拿到文件,這就是一個阻塞點。我們只能希望L1和L2緩存足夠大以便這類阻塞點不會成為性能瓶頸。

附加說明

本篇文章涵蓋了當(dāng)前臺式機(筆記本)CPU的緩存架構(gòu):分開的L1/L1D緩存,每核統(tǒng)一的L2緩存,共享的L3緩存。

不是每個系統(tǒng)都象這樣。一些系統(tǒng)并不區(qū)分指令緩存和數(shù)據(jù)緩存;另外一些那么把指令和數(shù)據(jù)在所有的緩存級全局部開。很多L2緩存是多核共享的,L2緩存就象是連接多個內(nèi)核的公共汽車。還有一些系統(tǒng)有L3和L4緩存。我也沒有提到使用多CPU套接字的系統(tǒng)。

我提到環(huán)路公共汽車是因為這是一個很好的類比。環(huán)路公共汽車很常見。有些時候,環(huán)路汽車是個麻煩(尤其是只需要把兩三個街區(qū)連起來);有時候,環(huán)路公共汽車需要和交叉系統(tǒng)連接起來(就象在辦公室,每個樓層用推車,不同樓層那么用電梯)。

作為軟件工程師,我們自然而然地會假設(shè)模塊A和模塊B可以魔術(shù)般地連接,數(shù)據(jù)那么可隨意地從一端流向另一端。內(nèi)存的實際工作機制其實非常復(fù)雜,但抽象出來呈現(xiàn)給程序員的只是一組大平面的字節(jié)排列。

硬件并不象這樣工作。各個部件之間并不能魔法般地自動連接。模塊A和模塊B并非抽象概念,而是具體的物理設(shè)備,實際上可以看作是非常小的機器,在硅片上占有實際的物理空間。芯片都有平面圖,是真正的2D地圖。如果你想連接A和B,就需要一條實際的導(dǎo)線來連接。導(dǎo)線也占空間,而且需要消耗電力(越遠消耗越多)。用一大捆線連接A和B意味著物理上這一塊區(qū)域會阻礙其他區(qū)域的連接。(當(dāng)然,芯片可以使用多層連接,如果你有興趣,可以搜索‘routingcongestion’)。在芯片里移動數(shù)據(jù)實際上是一個物流問題,并且超級復(fù)雜。

所以盡管辦公室的故事只是半開玩笑的類比,‘誰需要和誰談’、‘這個系統(tǒng)的幾何構(gòu)造如何——是有意義的布局嗎?’這些問題其實對系統(tǒng)設(shè)計和硬件相關(guān)并有巨大的影響。利用空間的隱喻來概念化實際情況是十分有效的。

IntelCPU漏洞技術(shù)解讀:都是緩存惹的禍!

原因一切還是要從CPU指令執(zhí)行的框架——流水線說起。Intel當(dāng)然不至于明知你要用一個用戶態(tài)的進程讀取Kernel內(nèi)存還會給你許可。但現(xiàn)代CPU流水線的設(shè)計,尤其是和性能優(yōu)化相關(guān)的流水線的特性,讓這一切充滿了變數(shù)。

給所有還沒有看過云杉網(wǎng)絡(luò)連載的系列文章《__86高性能編程箋注系列》的讀者一點背景知識的介紹:

__86CPU為了優(yōu)化性能,在處理器架構(gòu)方面做了很多努力。諸如“多級緩存〞這一類的特性,是大家都比較熟悉的概念。還有一些特性,比方分支預(yù)測和亂序執(zhí)行,也都是一些可以從并行性等方面有效提升程序性能的特性,并且它們也都是組成流水線的幾個關(guān)鍵環(huán)節(jié)。即便你暫時還不能準確理解其含義,但望文生義,也能看出來這肯定是兩個熵增的過程。熵增帶來無序,無序就會帶來更多漏洞。

緩存的困境講緩存,必然先掛一張memoryhierarchy鎮(zhèn)樓:

不過我要說的和這個沒太大關(guān)系。現(xiàn)在需要考慮的是,如果能讀取到內(nèi)核地址的內(nèi)容,那這局部內(nèi)容最終肯定是跑到緩存中去了,因為真正直接和CPU核心交互的存儲器,就是緩存。這對一級緩存(L1Cache,業(yè)內(nèi)也常用縮寫L1$,取cash之音)提出的要求就是,必須要非???,唯有如此才能跟上CPU處理核心的速度。

SideNotes:為什么在不考慮本錢的情況下緩存不是越大越好,也是因為當(dāng)緩存規(guī)模越大,查找某一特定數(shù)據(jù)就會越慢。而緩存首先要滿足的要求就是快,其他的都是次要的。

根據(jù)內(nèi)核的根本知識我們知道,進程運行時都有一個虛擬地址「Virtualaddress」和其所對應(yīng)的物理地址「physicaladdress」。

從虛擬地址到物理地址的翻譯轉(zhuǎn)換也由CPU通過pagetable完成。Pagetable并不儲存在CPU里,但近期查找到的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論