O perating s ystems t hree e asy p ieces



Download 3,96 Mb.
Pdf ko'rish
bet145/384
Sana01.01.2022
Hajmi3,96 Mb.
#286329
1   ...   141   142   143   144   145   146   147   148   ...   384
Bog'liq
Operating system three easy pease

Embedding A Free List

Thus far we have treated our simple free list as a conceptual entity; it is

just a list describing the free chunks of memory in the heap. But how do

we build such a list inside the free space itself?

In a more typical list, when allocating a new node, you would just call

malloc()


when you need space for the node. Unfortunately, within the

memory-allocation library, you can’t do this! Instead, you need to build

the list inside the free space itself. Don’t worry if this sounds a little weird;

it is, but not so weird that you can’t do it!

Assume we have a 4096-byte chunk of memory to manage (i.e., the

heap is 4KB). To manage this as a free list, we first have to initialize said

list; initially, the list should have one entry, of size 4096 (minus the header

size). Here is the description of a node of the list:

typedef struct __node_t {

int


size;

struct __node_t *next;

} node_t;

Now let’s look at some code that initializes the heap and puts the first

element of the free list inside that space. We are assuming that the heap is

built within some free space acquired via a call to the system call mmap();

this is not the only way to build such a heap but serves us well in this

example. Here is the code:

// mmap() returns a pointer to a chunk of free space

node_t *head = mmap(NULL, 4096, PROT_READ|PROT_WRITE,

MAP_ANON|MAP_PRIVATE, -1, 0);

head->size

= 4096 - sizeof(node_t);

head->next

= NULL;

After running this code, the status of the list is that it has a single entry,

of size 4088. Yes, this is a tiny heap, but it serves as a fine example for us

O

PERATING



S

YSTEMS


[V

ERSION


0.80]

WWW


.

OSTEP


.

ORG



F

REE


-S

PACE


M

ANAGEMENT

159

size:


4088

next:


0

...


head

[virtual address: 16KB]

header: size field

header: next field (NULL is 0)

the rest of the 4KB chunk

Figure 17.3: A Heap With One Free Chunk

size:

100


magic: 1234567

. . .


size:

3980


next:

0

. . .



ptr

[virtual address: 16KB]

head

The 100 bytes now allocated



The free 3980 byte chunk

Figure 17.4: A Heap: After One Allocation

here. The head pointer contains the beginning address of this range; let’s

assume it is 16KB (though any virtual address would be fine). Visually,

the heap thus looks like what you see in Figure

17.3


.

Now, let’s imagine that a chunk of memory is requested, say of size

100 bytes. To service this request, the library will first find a chunk that is

large enough to accommodate the request; because there is only one free

chunk (size: 4088), this chunk will be chosen. Then, the chunk will be

split

into two: one chunk big enough to service the request (and header,

as described above), and the remaining free chunk. Assuming an 8-byte

header (an integer size and an integer magic number), the space in the

heap now looks like what you see in Figure

17.4


.

Thus, upon the request for 100 bytes, the library allocated 108 bytes

out of the existing one free chunk, returns a pointer (marked ptr in the

figure above) to it, stashes the header information immediately before the

c

 2014, A


RPACI

-D

USSEAU



T

HREE


E

ASY


P

IECES



160

F

REE



-S

PACE


M

ANAGEMENT

size:

100


magic: 1234567

. . .


size:

100


magic: 1234567

. . .


size:

100


magic: 1234567

. . .


size:

3764


next:

0

. . .



sptr

[virtual address: 16KB]

head

100 bytes still allocated



100 bytes still allocated

 (but about to be freed)

100-bytes still allocated

The free 3764-byte chunk

Figure 17.5: Free Space With Three Chunks Allocated

allocated space for later use upon free(), and shrinks the one free node

in the list to 3980 bytes (4088 minus 108).

Now let’s look at the heap when there are three allocated regions, each

of 100 bytes (or 108 including the header). A visualization of this heap is

shown in Figure

17.5

.

As you can see therein, the first 324 bytes of the heap are now allo-



cated, and thus we see three headers in that space as well as three 100-

byte regions being used by the calling program. The free list remains

uninteresting: just a single node (pointed to by head), but now only 3764

bytes in size after the three splits. But what happens when the calling

program returns some memory via free()?

O

PERATING



S

YSTEMS


[V

ERSION


0.80]

WWW


.

OSTEP


.

ORG



F

REE


-S

PACE


M

ANAGEMENT

161

size:


100

magic: 1234567

. . .

size:


100

next:


16708

. . .


size:

100


magic: 1234567

. . .


size:

3764


next:

0

. . .



[virtual address: 16KB]

head


sptr

100 bytes still allocated

(now a free chunk of memory)

100-bytes still allocated

The free 3764-byte chunk

Figure 17.6: Free Space With Two Chunks Allocated

In this example, the application returns the middle chunk of allocated

memory, by calling free(16500) (the value 16500 is arrived upon by

adding the start of the memory region, 16384, to the 108 of the previous

chunk and the 8 bytes of the header for this chunk). This value is shown

in the previous diagram by the pointer sptr.

The library immediately figures out the size of the free region, and

then adds the free chunk back onto the free list. Assuming we insert at

the head of the free list, the space now looks like this (Figure

17.6

).

And now we have a list that starts with a small free chunk (100 bytes,



pointed to by the head of the list) and a large free chunk (3764 bytes).

c

 2014, A



RPACI

-D

USSEAU



T

HREE


E

ASY


P

IECES



162

F

REE



-S

PACE


M

ANAGEMENT

size:

100


next:

16492


. . .

size:


100

next:


16708

. . .


size:

100


next:

16384


. . .

size:


3764

next:


0

. . .


[virtual address: 16KB]

head


(now free)

(now free)

(now free)

The free 3764-byte chunk

Figure 17.7: A Non-Coalesced Free List

Our list finally has more than one element on it! And yes, the free space

is fragmented, an unfortunate but common occurrence.

One last example: let’s assume now that the last two in-use chunks are

freed. Without coalescing, you might end up with a free list that is highly

fragmented (see Figure

17.7

).

As you can see from the figure, we now have a big mess! Why? Simple,



we forgot to coalesce the list. Although all of the memory is free, it is

chopped up into pieces, thus appearing as a fragmented memory despite

not being one. The solution is simple: go through the list and merge

neighboring chunks; when finished, the heap will be whole again.

O

PERATING


S

YSTEMS


[V

ERSION


0.80]

WWW


.

OSTEP


.

ORG



F

REE


-S

PACE


M

ANAGEMENT

163


Download 3,96 Mb.

Do'stlaringiz bilan baham:
1   ...   141   142   143   144   145   146   147   148   ...   384




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish