① 數據結構中的「順序存儲結構」為什麼會有碎片產生碎片是如何產生的為什麼鏈式存儲結構沒有碎片
順序存儲如「數組」、「文件」等,一旦你要刪除元素,就會產生碎片,
產生的原因,是刪除留下空洞,要往前搬家才能消除碎片,而元素移動
會消耗時間。
鏈式存儲是指針相聯,刪除元素只要改變指針指向,不會留下碎片。
② 什麼是內存碎片怎麼解決碎片問題
內存碎片就是電腦的儲存裡面有各種文件數據的沒用文件 可以刪除
③ 內存碎片的減少內存碎片
內存碎片是因為在分配一個內存塊後,使之空閑,但不將空閑內存歸還給最大內存塊而產生的。最後這一步很關鍵。如果內存分配程序是有效的,就不能阻止系統分配內存塊並使之空閑。即使一個內存分配程序不能保證返回的內存能與最大內存塊相連接(這種方法可以徹底避免內存碎片問題),但你可以設法控制並限制內存碎片。所有這些作法涉及到內存塊的分割。每當系統減少被分割內存塊的數量,確保被分割內存塊盡可能大時,你就會有所改進。
這樣做的目的是盡可能多次反復使用內存塊,而不要每次都對內存塊進行分割,以正好符合請求的存儲量。分割內存塊會產生大量的小內存碎片,猶如一堆散沙。以後很難把這些散沙與其餘內存結合起來。比較好的辦法是讓每個內存塊中都留有一些未用的位元組。留有多少位元組應看系統要在多大程度上避免內存碎片。對小型系統來說,增加幾個位元組的內部碎片是朝正確方向邁出的一步。當系統請求1位元組內存時,你分配的存儲量取決於系統的工作狀態。
如果系統分配的內存存儲量的主要部分是 1 ~ 16 位元組,則為小內存也分配 16 位元組是明智的。只要限制可以分配的最大內存塊,你就能夠獲得較大的節約效果。但是,這種方法的缺點是,系統會不斷地嘗試分配大於極限的內存塊,這使系統可能會停止工作。減少最大和最小內存塊存儲量之間內存存儲量的數量也是有用的。採用按對數增大的內存塊存儲量可以避免大量的碎片。例如,每個存儲量可能都比前一個存儲量大 20%。在嵌入式系統中採用「一種存儲量符合所有需要」對於嵌入式系統中的內存分配程序來說可能是不切實際的。這種方法從內部碎片來看是代價極高的,但系統可以徹底避免外部碎片,達到支持的最大存儲量。
將相鄰空閑內存塊連接起來是一種可以顯著減少內存碎片的技術。如果沒有這一方法,某些分配演算法(如最先適合演算法)將根本無法工作。然而,效果是有限的,將鄰近內存塊連接起來只能緩解由於分配演算法引起的問題,而無法解決根本問題。而且,當內存塊存儲量有限時,相鄰內存塊連接可能很難實現。
有些內存分配器很先進,可以在運行時收集有關某個系統的分配習慣的統計數據,然後,按存儲量將所有的內存分配進行分類,例如分為小、中和大三類。系統將每次分配指向被管理內存的一個區域,因為該區域包括這樣的內存塊存儲量。較小存儲量是根據較大存儲量分配的。這種方案是最先適合演算法和一組有限的固定存儲量演算法的一種有趣的混合,但不是實時的。
有效地利用暫時的局限性通常是很困難的,但值得一提的是,在內存中暫時擴展共處一地的分配程序更容易產生內存碎片。盡管其它技術可以減輕這一問題,但限制不同存儲量內存塊的數目仍是減少內存碎片的主要方法。
現代軟體環境業已實現各種避免內存碎片的工具。例如,專為分布式高可用性容錯系統開發的 OSE 實時操作系統可提供三種運行時內存分配程序:內核 alloc(),它根據系統或內存塊池來分配;堆 malloc(),根據程序堆來分配; OSE 內存管理程序 alloc_region,它根據內存管理程序內存來分配。
從 許多方面來看,Alloc就是終極內存分配程序。它產生的內存碎片很少,速度很快,並有判定功能。你可以調整甚至去掉內存碎片。只是在分配一個存儲量後,使之空閑,但不再分配時,才會產生外部碎片。內部碎片會不斷產生,但對某個給定的系統和八種存儲量來說是恆定不變的。
Alloc 是一種有八個自由表的固定存儲量內存分配程序的實現方法。系統程序員可以對每一種存儲量進行配置,並可決定採用更少的存儲量來進一步減少碎片。除開始時以外,分配內存塊和使內存塊空閑都是恆定時間操作。首先,系統必須對請求的存儲量四捨五入到下一個可用存儲量。就八種存儲量而言,這一目標可用三個 如果 語句來實現。其次,系統總是在八個自由表的表頭插入或刪除內存塊。開始時,分配未使用的內存要多花幾個周期的時間,但速度仍然極快,而且所花時間恆定不變。
堆 malloc() 的內存開銷(8 ~ 16 位元組/分配)比 alloc小,所以你可以停用內存的專用權。malloc() 分配程序平均來講是相當快的。它的內部碎片比alloc()少,但外部碎片則比alloc()多。它有一個最大分配存儲量,但對大多數系統來說,這一極限值足夠大。可選的共享所有權與低開銷使 malloc() 適用於有許多小型對象和共享對象的 C++ 應用程序。堆是一種具有內部堆數據結構的夥伴系統的實現方法。在 OSE 中,有 28 個不同的存儲量可供使用,每種存儲量都是前兩種存儲量之和,於是形成一個斐波那契(Fibonacci)序列。實際內存塊存儲量為序列數乘以 16 位元組,其中包括分配程序開銷或者 8 位元組/分配(在文件和行信息啟用的情況下為 16 位元組)。
當你很少需要大塊內存時,則OSE內存管理程序最適用。典型的系統要把存儲空間分配給整個系統、堆或庫。在有 MMU 的系統中,有些實現方法使用 MMU 的轉換功能來顯著降低甚至消除內存碎片。在其他情況下,OSE 內存管理程序會產生非常多的碎片。它沒有最大分配存儲量,而且是一種最先適合內存分配程序的實現方法。內存分配被四捨五入到頁面的偶數——典型值是 4 k 位元組。
④ 分區存儲管理中的碎片是怎樣形成的
在磁碟分區中,文件會被分散保存到磁碟的不同地方,而不是連續地保存在磁碟連續的簇中。又因為在文件操作過程中,Windows系統可能會調用虛擬內存來同步管理程序,這樣就會導致各個程序對硬碟頻繁讀寫,從而產生磁碟碎片。
⑤ 什麼是內部碎片什麼是外部碎片各種存儲管理中都可能產生何種碎片
1.內部碎片:
當一個進程裝入到固定大小的分區塊(比如頁)時,假如進程所需空間小於分區塊,則分區塊的剩餘的空間將無法被系統使用,稱為內部碎片。
2.外部碎片:
指的是還沒有被分配出去(不屬於任何進程),但由於太小了無法分配給申請內存空間的新進程的內存空閑區域。
3.存儲管理中都可能產生的碎片:
除了內部碎片和外部碎片,在「分頁存儲」中,可能產生「頁內碎片」,頁內碎片是由於進程的最後一頁經常裝不滿一塊而形成了不可利用的碎片。
(5)內存存儲方案哪個會產生碎片擴展閱讀
在數據存儲領域中,碎片(fragmentation)是指存儲空間使用效率低下,結果導致功能、運行效率變低或二者兼而有之的現象。碎片化所造成的影響取決於具體的存儲系統以及碎片化的種類。
大部分情況下,碎片化都會導致都會導致存儲空間的浪費,此時「碎片」一詞亦可指代閑置的空間本身。對於其他的一些系統來說(比如FAT文件系統),數據量一定的前提下,用於存儲數據所佔的存儲空間是一定的,和碎片化的程度無關。
⑥ 磁碟碎片是怎麼產生的
1、當應用程序所需的物理內存不足時,一般操作系統會在硬碟中產生臨時交換文件,用該文件所佔用的硬碟空間虛擬成內存。虛擬內存管理程序會對硬碟頻繁讀寫,產生大量的碎片。
2、當中間的一個簇(由扇區組成)內容被刪除後,新寫入一個較小的文件,這樣在這個文件兩邊就會出現一些空間,這時候再寫入一個文件,兩段空間的任意一部分都不能容納該文件,這時候就需要將文件分割成兩個部分,磁碟碎片再次產生。
3、下載是產生碎片的一個重要源頭。如下載的視頻文件會被迫分割成若干個碎片存儲於硬碟中。還有就是經常刪除、添加文件,這時候如果文件空間不夠大,就會產生大量的磁碟碎片,隨著文件的刪改頻繁,這種情況會日益嚴重。
(6)內存存儲方案哪個會產生碎片擴展閱讀:
清理磁碟碎片的准備工作
1、垃圾清理
系統工作一段時間後,垃圾文件就會非常之多,有程序安裝時產生的臨時文件、上網時留下的緩存文件、刪除軟體時剩下的DLL文件或強行關機時產生的錯誤文件等,建議使用微軟的「磁碟清理程序」代勞,也可以使用一些功能更強的軟體或手工清理。
2、檢查並修復硬碟中的錯誤
使用微軟的「磁碟掃描程序」檢查,經過這個程序對磁碟完整而詳細的掃描後,能修復系統中的絕大多數錯誤。
3、整理磁碟碎片的時候,要關閉其他所有的應用程序,包括屏幕保護程序,最好將虛擬內存的大小設置為固定值。不要對磁碟進行讀寫操作,一旦Disk Defragment發現磁碟的文件有改變,它將重新開始整理。
⑦ 資料庫存儲空間中碎片產生的原因 及如何回收碎片
以MySQL為例,碎片的存在十分影響性能
MySQL 的碎片是 MySQL 運維過程中比較常見的問題,碎片的存在十分影響資料庫的性能,本文將對 MySQL 碎片進行一次講解。
判斷方法:
MySQL 的碎片是否產生,通過查看
show table status from table_nameG;
這個命令中 Data_free 欄位,如果該欄位不為 0,則產生了數據碎片。
產生的原因:
1. 經常進行 delete 操作
經常進行 delete 操作,產生空白空間,如果進行新的插入操作,MySQL將嘗試利用這些留空的區域,但仍然無法將其徹底佔用,久而久之就產生了碎片;
演示:
創建一張表,往裡面插入數據,進行一個帶有 where 條件或者 limit 的 delete 操作,刪除前後對比一下 Data_free 的變化。
刪除前:
Data_free 不為 0,說明有碎片;
2. update 更新
update 更新可變長度的欄位(例如 varchar 類型),將長的字元串更新成短的。之前存儲的內容長,後來存儲是短的,即使後來插入新數據,那麼有一些空白區域還是沒能有效利用的。
演示:
創建一張表,往裡面插入一條數據,進行一個 update 操作,前後對比一下 Data_free 的變化。
CREATE TABLE `t1` ( `k` varchar(3000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
更新語句:update t1 set k='aaa';
更新前長度:223 Data_free:0
更新後長度:3 Data_free:204
Data_free 不為 0,說明有碎片;
產生影響:
1. 由於碎片空間是不連續的,導致這些空間不能充分被利用;
2. 由於碎片的存在,導致資料庫的磁碟 I/O 操作變成離散隨機讀寫,加重了磁碟 I/O 的負擔。
清理辦法:
MyISAM:optimize table 表名;(OPTIMIZE 可以整理數據文件,並重排索引)
Innodb:
- select count(*) from test.twitter_11;
1. ALTER TABLE tablename ENGINE=InnoDB;(重建表存儲引擎,重新組織數據)
2. 進行一次數據的導入導出
碎片清理的性能對比:
引用我之前一個生產庫的數據,對比一下清理前後的差異。
SQL執行速度:
修改前:1 row in set (7.37 sec)
修改後:1 row in set (1.28 sec)
結論:
通過對比,可以看到碎片清理前後,節省了很多空間,SQL執行效率更快。所以,在日常運維工作中,應對碎片進行定期清理,保證資料庫有穩定的性能。
⑧ 在存儲管理技術中,可變式分區分配方式產生什麼碎片
打個比方,把一個100M的空間里,裝10個10M的文間。就相當於把這個空間分成10份,每一份里裝一個文件在電腦應用中,這10個文件分10次刪掉了,然後每一份里分別裝入了一個9M的文件。這樣10份里每份還有1M的空間,整個空間共10M的空間里了,這個時候這個空間又被裝入一個10M的文件。那麼最後的這個文件就被分成了10份,每份1M。這樣,這個文件就是零碎的。稱為碎片由於這個文件被分成了10份,放在10個不同的位置那麼硬碟在讀取這個文件時,磁頭要尋找10個不同的地方,分10次來讀取,大大的增加了讀取時間。因此碎片整理就是將這些零散的文件重新分配位置,將它們移到一塊這樣硬碟就可以讀取連續的文件,以提高讀取速度。