본문 바로가기

OS/Pintos P.J_13

[Project_1_THREADS]_Priority Scheduling_2 Priority Inversion 카이스트 핀토스 가이드 설명에서 Priority inversion은 어떠한 것이며 우리가 무슨 상황을 해결해야 할지 설명해 주고있다. 간략하게 말하자면 H, M, L의 우선순위가 있고 딱 한명만 사용가능한 자원 LOCK 이 있다고 했을때 처음에 L이 LOCK을 가지고 작업을 하는도중 H가 들어오면 L은 작업대는 H에게 넘겨주지만 자신의 LOCK은 들고가버린다. 그럼 H도 LOCK이 필요하다 했을때 L때문에 작업을 못하고 작업대를 양보한다. 대기리스트에 있던 M이 빈 작업대를 들어오고 M은 LOCK이 필요없기 떄문에 자신의 작업을 끝마치고 나간다. 그후 작업을 못하고 밀려난 L이 돌아와 작업을 마무리하고 LOCK을 반납하면 그제서야 H가 LOCK을 받아 작업을 마친다. 이.. 2021. 12. 30.
[Project_1_THREADS]_Priority Scheduling_1 1-2 과제 Priority scheduling과 Priority donation을 Pintos에서 실행하라 하나의 스레드가 레디리스트에 추가되었을 때 이것이 높은 우선순위를 가지면 현재 running중인 스레드는 즉시 이 녀석에게 양보를 해주어야 한다. 비슷하게 스레드가 lock, 세마포어 또는 Condition 변수를 기다릴때 가장 높은 우선순위를 가진 기다리는 중이던 스레드가 먼저 일어난다. 스레드의 우선순위는 높아지거나 낮아질 수있다. 그러나 우선순위가 낮아지게 되면 더 이상 높은 우선순위를 가 아니므로 CPU를 양보한다. 스레드의 우선순위 범위는 PRI_MIN(0)부터 PRI_MAX(63)까지이다. 초기 스레드의 우선순위는 thread_create()의 인수로 전달된다. 우선순위의 변동이 필요 .. 2021. 12. 28.
[Project_1_THREADS]_ Alarm Clock 들어가기전 , 핀토스에서는 프로세스와 스레드를 동일시 하고있음을 알아두자 수정전 timer_sleep() /* devices/timer.c */ void timer_sleep (int64_t ticks) { int64_t start = timer_ticks (); while (timer_elapsed (start) < ticks) thread_yield (); } timer_elapsed(start)는 timer_sleep이 호출된 시점에서 tick이 얼마나 지났는지 반환하는 함수이다. tick(틱)은 컴퓨터가 켜지고 1ms 에 1씩 증가하는 값으로서 하드웨어에 달린 타이머에 의해 증가한다. Idle()은 레디리스트에 아무스레드도 없는경우 불러오는 함수로 스레드로 CPU가 얼마나 쉬고 있는지를 보여주기 .. 2021. 12. 27.