728x90
[pintos] Project 1_priority scheduling
전체적인 흐름을 이해하기 위해서는 header file에 구현되어 있는 구조체와 멤버 그리고 구조체를 파악하는 게 도움이 된다.
thread.h
struct thread {
/* Owned by thread.c. */
tid_t tid; /* Thread identifier. */
enum thread_status status; /* Thread state. */
char name[16]; /* Name (for debugging purposes). */
int priority; /* Priority. */
/*-------Project 1, priority_donation------*/
int init_priority; // thread 양도 받았다가 다시 반납할 때 원래의 priority 복원 위해
struct lock *wait_on_lock; // thread가 현재 얻기 위해 기다리고 있는 lock으로 스레드는 이 lock이 release되기를 기다린다.
struct list donations; // 자신에게 priority를 나누어준 스레드들의 리스트
struct list_elem donation_elem; // donations list를 관리하기 위한 element로 thread 구조체의 그냥 elem과 구분하여 사용
/*-------Project 1 end------*/
/*-------Project 1, alarm clock------*/
int64_t wakeup_tick; // 깨어나야 할 tick값
/*-------Project 1 end------*/
/* Shared between thread.c and synch.c. */
struct list_elem elem; /* List element. */
list.h
struct list_elem {
struct list_elem *prev; /* Previous list element. */
struct list_elem *next; /* Next list element. */
};
struct list {
struct list_elem head; /* List head. */
struct list_elem tail; /* List tail. */
};
#define list_entry(LIST_ELEM, STRUCT, MEMBER) \
((STRUCT *) ((uint8_t *) &(LIST_ELEM)->next \
- offsetof (STRUCT, MEMBER.next)))
synch.h
struct semaphore {
unsigned value; /* Current value. */
struct list waiters; /* List of waiting threads. */
};
struct lock {
struct thread *holder; /* Thread holding lock (for debugging). */
struct semaphore semaphore; /* Binary semaphore controlling access. */
};
// thread를 기다리게 하거나, waiters에서 기다리고 있는 thread들에게 signal을 보낼 수 있다.
// wating list에 들어가는 것이 thread인가 semaphore인가..?
struct condition {
struct list waiters; /* List of waiting threads. */
};
추가 자세한 구현 내용은 블로그의 priority scheduling 참조.
마지막 semaphore와 lock 쓰는 부분의 전체적인 이해를 위해 하기와 같은 flow로 이해하면 된다.
라고 하려고 했는데 티스토리 오류로 사진 파일이 올라가지 않는다.
나중에 추가하기 !
참조
https://poalim.tistory.com/34?category=758538
728x90
'정글 2기 > OS 운영체제' 카테고리의 다른 글
[Pintos] Project 2_Calling convention_Caller, Callee and registers (0) | 2021.10.09 |
---|---|
[three_easy_pieces] 가상 메모리(Virtual memory)_주소 변환의 원리 (0) | 2021.10.07 |
[pintos] Project 1_alarm (0) | 2021.10.04 |
[PintOS] 로딩 (Loading) (0) | 2021.10.04 |
[PintOS] 디버깅 도구(Debugging Tool)_printf, ASSERT, __attributes__, backtraces (0) | 2021.10.03 |
댓글