검색어 입력폼
평가점수C

[컴퓨터공학] nachos Thread, Synchronization, Scheduling 분석

저작시기 2004.10 |등록일 2004.12.19 한글파일한컴오피스 (hwp) | 34페이지 | 가격 1,100원

소개글

정말 열심히 분석했습니다. 그냥 읽어만 봐도 nachos가 이해가 가실 거에요~

목차

1.
1) threads/threadtest.cc threadtest()에서 5개의 thread를 생성시키고 rs 옵션을 설정하여 nachos를 수행시키시오. rs 옵션을 설정하지 않았을 때와 결과를 비교하여 설명하시오
2) code/userprog에서 -c 옵션을 설정하고 nachos를 수행시키면 echo가 수행되고 문자 ‘q‘를 입력하게 되면 종료합니다. 이것을 문자 ‘q`가 아닌 문자열 `bye`를 입력했을 때 종료되게 수정하시오.(ConsoleTest() 함수내에서 수정을 하시오)
3) 위의 1),2)번 문제를 수행하다 보면 다음의 파일들을 보게 됩니다. 다음 파일들을 분석 하시오
code/thread :
thread.h, thread.cc
scheduler.h scheduler.cc
list.h list.cc
synch.h , synch.cc
code/machine :
interrupt.h , interrupt.cc
timer.h , timer.cc
stats.h , stats.cc

- thread 생성 및 종료
- 스케쥴링, context switching
- h/w timer
- interrupt : interrupt handler, interrupt enable, disable
- semaphore, lock
2. synch.h 에 정의되어 있는 Lock을 구현하고 설명하시오.
그리고 구현된 Lock을 테스트 하기위한 LockTest 라는 함수를 만들어서 현재 Lock을 잡은 thread, Lock을 놓은 thread를 화면에 출력하는 테스트 코드를 threadtest.cc 파일 에 추가하시오.
3. semaphore를 이용하여 producer consumer problem을 구현하시오.(교재참고)
threadtest.cc에 테스트 할 함수를 구현하고 main.cc에서 해당함수를 호출하게 구현하시 오. (20점)
(makefile에 PROCONSUMER를 define 하고 PROCONSUMER가 define되었다면 main.cc에서 SemTest()를 호출하면 됩니다. )
4. nachos에서 제공하는 scheduling을 Priority Scheduling으로 수정하시오. (20점)

Thread 및 Scheduler 클래스의 수정이 필요하고 단, Thread 생성 시 Priority를 설정하는 부분은 2개의 parameter를 갖는 constructor를 추가하거나 SetPriority(int priority) 함수를 추가하시오.
그리고 Priority Scheduling을 테스트 할 수 있는 코드도 추가하시기 바랍니다. 테스트 코드의 경우는 Thread Name, 현재 가지고 있는 우선순위 값 등의 정보를 출력해주는 코드이면 됩니다.
(makefile에 PRIORITYSCHED define하고 main.cc에서 본인이 작성한 함수 명을 호출하시오. 그리고 본인이 작성한 스케쥴링의 policy를 설명하시오.)

본문내용

nachos라고 실행화일명을 입력하면 먼저 initialize()에서 console, disk, timer와 같은 simulate hardware를 초기화하고 최초의 thread 하나를 생성한다. 다음으로 Threadtest()를 수행하면서 threadtest.cc로 theadsystem을 test하고 새로운 thread 하나를 더 생성하여 두 개의 thread가 실행된다.
많은 ready thread들 중에 단 하나의 thread만이 CPU를 점유할 수 있다. 이 실행될 thread를 고르는 일을 scheduler가 담당하는데, 이것이 scheduler.cc에 구현되어 있다. 이것들을 간단히 살펴보면 scheduler의 ReadyToRun()은 매개변수로 thread를 가지고 ready list에 tread를 넣는다. FindNextRun()은 ready list의 실행 준비 중인 thread들 중 실행될 thread를 고른다. Run()은 매개변수로 thread를 가지고 현재 실행 중이던 thread를 보류시키고, 다른 thread를 실행시키는 switching을 담당한다.
하나의 thread가 실행되는 중에, 다른 thread를 실행시키려면 interrupt 명령이 enable 되어야 한다. 이것은 functionptr()이라는 함수를 이용하여 구현한다. thread controller나 scheduler 안에서는 interrupt는 disable 된다.
thread는 종료되면서 소멸한다. thread.cc의 Finish()를 보면 thread는 종료할 때, 그 pointer를 threadToBeDestroyed라는 변수에 넘긴다. 그러면 scheduler는 다른 thread로 swich 시키며, stack area는 다른 것으로 바뀐다. Scheduler.cc의 Run()을 보면 실행 중이던 thread는 threadToBeDestroyed라는 변수를 확인하고 그것이 NULL이 아니면 thread 객체를 가리키고 있던 pointer를 해제한다. 따라서 실행 중이던 thread가 종료되는 것이다.
context switching은 실행상태에 놓이는 thread를 바꾸는 것을 말한다. 이 과정은 scheduler.cc 와 switch.s에 구현되어 있다. scheduler.cc의 Run()에 실행할 thread의 pointer를 바꾸는 과정이 나와 있으며, switch.s는 기계어 소스로서, stack pointer와 register값, program counter들을 바꾸는 과정이 묘사되어 있다.
이 과정에서 쓰인 파일들을 분석해 보기로 하자.
다운로드 맨위로