2012-04-04 28 views
5

Evet, bir Bilgisayar sistemleri kursu alıyorum. Malloc uygulamak için çeşitli tahsis şemaları hakkında birkaç sorum vardı. Açık listeler için, LIFO benzeri bir yığın kullanarak malloc uygularsam, önceki boş belleğe işaretçilerin sahip olma amacı nedir? Niçin çift bağlantılı listelere ihtiyacın var? Birbiriyle bağlantılı bağlantılar listesi de işe yaramaz mıydı?Malloc Ayırma Şemaları

Malloc lecture. Bu bağlantıyı çevrimiçi buldum, neden bahsettiğimi görmek için slayt 7'ye bakabilirsiniz.

Ayrılmış bir liste ayırma düzenine bakarken, bu listeler tek yönlü doğru mu? Ve ayrıca, birleştirme mekanizması tam olarak nedir? Örneğin, 4 kelime serbest bırakılırsa, önce ilgili ayrılmış ayrılmış listeye geri eklemeden önce çevrenizdeki boş alan olduğunda onu denemeyi dener misiniz? Yoksa, 4 ayrılmış kelimeyi ilgili ayrılmış listenin '4 word' bölümüne yerleştirir misiniz?

Teşekkür ederiz.

cevap

4

Serbest bırakılan bir blok her zaman iki işaretçi için yer olduğundan, neden bu listeyi iki kez birbirine bağlamaz? Birleştirme işaretini basitleştirir, böylelikle listeyi geçerken bir izleyici işaretçisini korumak zorunda kalmaz. Ayrıca listenin sonunun, aramaya başlamak için daha yakın olabileceğine dair bir ipucu olması durumunda listenin her iki yönde de geçişini sağlar. Bir keresinde baktığım bir belirsiz sistem, son etkinliğin gerçekleştiği "ortada" bir işaretçiyi tuttu. Bir bloğu serbest bırakırken

. Sadece dört olası durum vardır:

  • serbest blok serbest blok sonra komşudur.
  • Serbest blok, numaralı ücretsiz bir bloktan önce bitişiğindedir.
  • Serbest blok, önce ve sonra her iki serbest blok arasında ve bitişiğinde bulunur.
  • Serbest blok, herhangi bir serbest bloğa bitişik değildir. komşu serbest blok birleştirici

amaçları şunlardır:

  • doğru bkz öncesinde bakmak için ayırıcı yüklenmeden serbest bloğun boyutu gösterir bağlantılı liste uzunluğunu azaltmak için iki blok bitişik ise, belirli bir uzunlukta freelist bir serbest blok Sıralama

genellikle faydası vardır, ancak en pratik uygulamalarda, birleştirme öncelikli birböylece Farklı boyutta serbest bloklar olduğunda, farklı bir boyut bloğu içintalebi uygun şekilde reddedilmez.

+0

Sanırım ne söylediğinizi görüyorum ama sondaki işaretçiyi devam ettirme ihtiyacının olmaması konusunda daha fazla detay verebilir misiniz? Ayrıca, eğer serbest bir blok B'yi çağırırsam B-> next-> prev = B? Çünkü durum böyle değilse, bağlantılı listelerin ne kadar yardımcı olabileceğini görmüyorum. Ayrıca, yığının ayrılmış bir liste ayırıcısında başlatılmasının en iyi yolu ne olurdu? Sayfayı bir düzende bölümler misiniz? (2 kelime 64 serbest blok, 4 kelimeden 64 serbest blok, 8 kelime 64 blok ... belirtilen sonsuzluk kategorisine gelene kadar ... Ya da başlangıçta daha iyi bir yol var mı? – de1337ed

+0

@ de1337ed: Belki de herhangi bir düğüm listesi işlem kodu yazılmamış mı? Bir girdap ver: bağlantılı bir listeye bir düğüm ekleyen bir işlev yaz.Listeyi adres = sıralanmış sırayla saklayın. Tek tek bağlı olarak deneyin. Ve sonra çift bağlantılı için değiştirin. (Sorunuzu cevaplamak için 'B-> next-> prev' * her zaman * B) Eğer değilse, bir hata vardır.) Yığının başlatılması uygulayıcının politika kararlarına tabidir: bir grup 512 baytlık bloklar gitmeye hazır mı? Sisteme bağlı. – wallyk