[SW사관학교 정글]58일차 TIL

김승덕·2022년 11월 15일
0

SW사관학교 정글 5기

목록 보기
98/150
post-thumbnail

condition variable 함수 정리

struct condition

/* Condition variable. */
struct condition {
	struct list waiters;        /* List of waiting threads. */
};

condition 구조체

waiters 리스트가 있다.

cond_init

/* 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 리스트를 초기화한다.

cond_wait

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과의 차이점은?

thread sleep은 ticks를 기준으로 잠을 재움

하지만 cond_wait는 원할때 재우고 깨울수 있다는 점에서 다름

cond_signal

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을 통해 깨워라

cond_broadcast

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를 하나하나 해보고있다.
내가 멍청한건지 잘 모르겠다... ㅎㅎ
내일 또 봐보자

profile
오히려 좋아 😎

0개의 댓글