/* Condition variable. */
struct condition {
struct list waiters; /* List of waiting threads. */
};
condition 구조체
waiters 리스트가 있다.
/* Initializes condition variable COND. A condition variable
allows one piece of code to signal a condition and cooperating
code to receive the signal and act upon it. */
void
cond_init (struct condition *cond) {
ASSERT (cond != NULL);
list_init (&cond->waiters);
}
요약 : condition의 waiters 리스트를 초기화한다.
void
cond_wait (struct condition *cond, struct lock *lock) {
struct semaphore_elem waiter;
ASSERT (cond != NULL);
ASSERT (lock != NULL);
ASSERT (!intr_context ());
ASSERT (lock_held_by_current_thread (lock));
sema_init (&waiter.semaphore, 0);
list_push_back (&cond->waiters, &waiter.elem);
lock_release (lock);
sema_down (&waiter.semaphore);
lock_acquire (lock);
}
요약 : 각각의 sema elem을 재움 → semaphore의 원리를 이용해서 재움
condition waiters에 각각의 sema elem이 있음
이 sema elem에 있는 semaphore를 잠금으로써 각각의 elem을 재운다.
thread sleep은 ticks를 기준으로 잠을 재움
하지만 cond_wait는 원할때 재우고 깨울수 있다는 점에서 다름
void
cond_signal (struct condition *cond, struct lock *lock UNUSED) {
ASSERT (cond != NULL);
ASSERT (lock != NULL);
ASSERT (!intr_context ());
ASSERT (lock_held_by_current_thread (lock));
if (!list_empty (&cond->waiters))
sema_up (&list_entry (list_pop_front (&cond->waiters),
struct semaphore_elem, elem)->semaphore);
}
요약 : 각각의 sema elem을 깨움
cond의 waiters가 있다면(즉 재워놓은 sema elem이 있다면) sema up을 통해 깨워라
void
cond_broadcast (struct condition *cond, struct lock *lock) {
ASSERT (cond != NULL);
ASSERT (lock != NULL);
while (!list_empty (&cond->waiters))
cond_signal (cond, lock);
}
요약 : 모든 sema_elem을 깨움
while을 돌며 모든 sema_elem을 깨워라
(대전은 다 맛집인거같다... ㅎㅎ)
어려운 pintos를 하나하나 해보고있다.
내가 멍청한건지 잘 모르겠다... ㅎㅎ
내일 또 봐보자