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개수bitsunsigned 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용으로 래핑한 함수
유익해요