pintos project 1과 2에서는 대부분 array이나 linked list 자료구조를 사용했다. project 3에 들어오면서 사용해야할 자료구조가 추가되었는데, bitmap과 hash table이다.
char
(1Byte)이다.char
배열만 사용해야한다.element
를 정의하고 그 element
를 쪼개서 boolean(true
or false
)을 표현한다.char
를 element
로 사용하면, 한 element
로 boolean 8개를 나타낼 수 있음.int
를 element
로 사용하면 한 element
로 boolean 32개를 나타낼 수 있음.struct bitmap {
size_t bit_cnt; /* Number of bits. */
elem_type *bits; /* Elements that represent bits. */
};
bit_cnt
: bitmap의 bit개수bits
unsigned long
을 element로 가짐unsigned long
이므로 element 1개당 bit가 64개bitmap_create()
로 생성시 필요한 element의 개수만큼, 메모리를 동적할당 받는다.bitmap.h
파일에 없고 bitmap.c
파일에만 있으므로 멤버변수를 직접 접근하는 것은 불가능하다. bitmap.h
파일 참고struct bitmap *bitmap_create (size_t bit_cnt)
element
를 동적할당함.struct bitmap *bitmap_create_in_buf (size_t bit_cnt, void *, size_t byte_cnt)
size_t bitmap_buf_size (size_t bit_cnt)
void bitmap_destroy (struct bitmap *)
bitmap_create()
만 사용하는 것 보다.
1.bitmap_buf_size()
로 필요한 크기를 알아내고
2. 그 크기만큼 동적할당한 후
3.bitmap_create_in_buf()
로 생성
하는 방식이 더 자주쓰일 것 같다. (메모리에서 연속된 공간에 구조체와 동적배열을 생성할 수 있으므로)
size_t bitmap_size (const struct bitmap *)
bit_cnt
멤버변수를 리턴한다.bitmap
구조체의 크기가 아님void bitmap_set (struct bitmap *, size_t idx, bool)
idx
번째 요소를 bool
값으로 세팅함void bitmap_mark (struct bitmap *, size_t idx)
idx
번째 요소를 true
값으로 세팅함void bitmap_reset (struct bitmap *, size_t idx)
idx
번째 요소를 false
값으로 세팅함void bitmap_flip (struct bitmap *, size_t idx)
idx
번째 요소를 반전함 (원래 값과 반대로)bool bitmap_test (const struct bitmap *, size_t idx)
idx
번째 요소의 값을 리턴함
- single bit 연산은 모두 어셈블리어 수준에서 atomic
bitmap_set()
을 사용하는 것 보다, 가능하면bitmap_mark()
와bitmap_reset()
을 사용하는 편이 좋을것 같다. (함수의 이름만으로 기능을 명시할 수 있기 때문에)
void bitmap_set_all (struct bitmap *, bool)
bool
로 초기화void bitmap_set_multiple (struct bitmap *, size_t start, size_t cnt, bool)
start
번째 요소부터 cnt
개 만큼의 요소를 bool
로 초기화size_t bitmap_count (const struct bitmap *, size_t start, size_t cnt, bool)
start
번째 요소부터 cnt
개 만큼의 요소 중 값이 bool
인 요소의 개수를 리턴함bool bitmap_contains (const struct bitmap *, size_t start, size_t cnt, bool)
start
번째 요소부터 cnt
개 만큼의 요소 중 값이 bool
인 요소가 존재하는지 여부를 확인함bool bitmap_any (const struct bitmap *, size_t start, size_t cnt)
start
번째 요소부터 cnt
개 만큼의 요소 중 값이 true
인 요소가 존재하는지 여부를 확인함bool bitmap_none (const struct bitmap *, size_t start, size_t cnt)
start
번째 요소부터 cnt
개 만큼의 요소 중 값이 false
인 요소가 존재하는지 여부를 확인함bool bitmap_all (const struct bitmap *, size_t start, size_t cnt)
start
번째 요소부터 cnt
개 만큼의 요소 중 값이 true
인 요소만 존재하는지 여부를 확인함size_t bitmap_scan (const struct bitmap *, size_t start, size_t cnt, bool)
start
번째 요소부터 시작하여, cnt
개 만큼의 요소가 연속적으로 bool
인 위치를 확인함size_t bitmap_scan_and_flip (struct bitmap *, size_t start, size_t cnt, bool)
bitmap_scan()
후 확인된 위치에서부터 cnt
개 만큼의 bit를 filp함palloc_get_multiple()
에서 first-fit 정책에 사용됨void bitmap_dump (const struct bitmap *)
hex_dump()
를 bitmap용으로 래핑한 함수
유익해요