* 목표: 동기화 primitive를 OS161에 구현

 

1. Configuration

 

ASST1으로 framework을 변경하여 커널을 만들어야 한다.

 

$ cd kern/conf

$ ./config ASST1

 

그러면 compile 디렉터리에 ASST1이 있을 것을 볼 수 있다.

다음과 같이 빌드한다.

 

$ cd compile/ASST1

$ make depend

$ make

$ make install

 

ASST0 을 올바로 수행했다면, 설치 디렉터리는 ASST0에 지정된 것과 같다.

 

2. 테스트를 위해서는 디폴트로 512KB로 되어 있는 메모리를 2MB 정도로 증가시켜야 할 필요가 있다. (멀티쓰레드 때문에)

RAM 크기는 sys161.conf 파일에 있는 항목을 다음과 같이 수정하면 2MB RAM을 설정한다.

 

31 busctl ramsize=2097152

 

3. Thread test

 

ASST1 커널을 수행시키면, sy1과 sy2의 두 가지 테스트를 수행할 수 있다.

수행시켜보면, 동기화가 되지 않아 출력이 뒤섞이는 것을 볼 수 있다.

ASSIGNMENT 1에서는 lock 과 condtion variable을 구현하여 이 출력이 정상적으로 나오도록 하는 것이다.

 

4. 수정 파일

 

kern/synch.c 와 kern/include/synch.h를 보면, semaphore는 구현이 되어 있다.

lock 과 cv는 구현이되어 있지 않은 채 skeleton만 제공된다.

이 파일들을 수정하여 동작이 되도록 하라.

(중요) 수정 시에는 이미 구현된 semaphore 를 사용해서는 안됨.

 

5. 참고

 

lock = mutex 

Getting Started With Locks

Some tips for implementing the locks. Remember, a lock is a mutually exclusive resource, which means that only one process/thread can hold the lock at a time. A lock is always initialized in the unlocked state. This means that you can't create a lock and have a thread holding it when it is created. Think about how this relates to more basic P and V (wait and signal) semaphore functionality that can be found in kern/thread/synch.c. Is there a way that you can use existing kernel functionality to implement the locks more easily? Also, when creating a lock, what should the initial values be for its data members?

Additionally, there must be a way to find the owner of a lock. Think about a way that you can identify a process/thread that is holding the lock. How can you store this with the lock? How should you handle the owner when initializing, acquiring, releasing and destroying the lock?

Then finally keep in mind what areas of the code are critical sections. Here is a big hint: this is actually documented in the header file kern/include/synch.h.

Getting Started With Condition-Variables

A condition-variable (cv) is essentially just a condition that threads or processes are waiting on. Once the condition becomes true, then the thread(s) will get awoken.  So, in order to implement this, you have to think about how threads are put to sleep and then later woken up. How can you signal the sleeping threads that the condition-variable they are waiting on has become true? You will definitely want to look at: kern/include/thread.h and kern/thread/thread.c. As a hint, you may find it easier to implement a new function in the thread code to implement the waking of one thread. This will be very useful for simplifying cv_signal. You will also want to make sure to read over the commentary in kern/include/synch.h about condition-variables.

 

6. 제출물

 

- sy1 과 sy2 의 수행 결과 캡쳐

- synch.c 와 synch.h 소스 파일

 

7. 제출일

 

2012년 10월 23일