핀토스 project 1

Run·2021년 10월 4일
0

핀토스의 흐름을 이해하기 위해 함수들간의 관계도를 그려보면서 이해를 했다.
(자세히: https://www.figma.com/file/QrOpa8A4xUzhdK4Ga87C9V/Untitled?node-id=0%3A1)

이번 주차에서 가장 중요한 개념은 동기화이다.

스레드(Thread)

  • 쓰레드는 프로세스 내에서 실행되는 흐름의 단위

멀티스레드(multithread)

  • 하나의 프로세스 내에서 두 개 이상의 쓰레드

멀티 스레드 vs 멀티 프로세스

  • 공통점:여러 작업이 동시에 이루어 진다
  • 차이점:
    - 멀티 프로세스: 각 프로세스는 독립적으로 실행
    각 프로세스는 별개의 메모리 공간을 차지
    - 멀티 스레드: 프로세스 내의 메모리를 공유하여 사용 가능
    자원을 공유하는 특성 때문에 pintos 의 스레드 설계는 스레드간의 동기화(Synchronization) 에 신경을 써야함

Semaphores

  • 공유자원을 여러 스레드가 동시에 접근하지 못하도록 하는 도구
  • nonnegative integer 와 두 개의 operators 로 구성
    - nonnegative integer 는 사용 가능한 공유자원의 개수
    • 이 값이 2 라면 2개의 스레드가 동시에 접근 가능하고, 이 값이 0 이라면 사용 가능한 공유자원이 없음을 의미

Down or P
어떤 스레드가 임계구역으로 들어와서 공유자원을 사용하고자 요청할 때 실행되고, 현재 사용 가능한 공유자원의 개수가 1개 이상이면(양수개이면) 이 수를 1 줄이고 임계구역을 실행
현재 사용 가능한 공유자원의 개수가 0 이하면 이 값이 양수가 될 때까지 임계구역을 실행하지 않고 기다린다.

Up or V
스레드가 임계구역의 실행을 모두 마치고 공유자원을 반납할 때 실행된다. 사용 가능한 공유자원의 개수를 1 늘린다.

Locks
1 로 초기화된 세마포로 하나의 공유자원에 접근을 제어할 때 사용된다.lock "Up" 대신 "release", "Down" 대신 "acquire"를 사용
acquire 를 호출한 스레드만이 해당 lock 을 release 할 수 있다

Moitor
모니터는 공유자원, 모니터 락, 조건변수로 구성
lock 을 acquire 하면 이 스레드는 release 되기 전까지 "in the monitor" 상태가 된다
이 상태에 여러 개의 스레드들이 있을 수 있고, 여기에 있는 스레드들은 서로 Mutual Exclusion(상호배타), 즉 공유자원을 하나의 스레드만 사용할 수 있는 상태가 된다
별다른 조건이 없다면 여기에 있는 스레드들은 하나씩 차례로 실행되고 release 를 통해 빠져나간다
모니터에는 여기에 추가로 Condition variables(조건 변수)를 추가할 수 있다
임계구역을 실행중이던 스레드는 wait(condition) 명령을 통해 실행을 멈추고 대기 상태로 들어갈 수 있고, 이후 다른 대기중이던 스레드가 임계구역을 실행시킨다
상태의 스레드는 condition 이 true 가 될 때까지 대기하게 되는데, 실행중인 스레드에서 signal(condition) 명령을 통해 wait 되어 있는 스레드 중 하나의 condition 을 true 로 만들어 깨울 수 있다
broadcast(condition) 명령어는 현재 wait 중인 모든 condition 을 모두 true 로 만들어 깨운다.
아래의 예제를 보며 좀 더 자세히 이해해보자

void put (char ch) {
   lock_acquire (&lock);
   while (n == BUF_SIZE)
   	cond_wait (&not_full, &lock);
   buf[head++ % BUF_SIZE] = ch;
   n++;
   cond_signal (&not_empty, &lock);
   lock_release (&lock);
}

char get (void) {
   char ch;
   lock_acquire (&lock);
   while (n == 0)
   	cond_wait (&not_empty, &lock);
   ch = buf[tail++ % BUF_SIZE];
   n--;
   cond_signal (&not_full, &lock);
   lock_release (&lock);
}

더 자세한 내용은 이번 주차의 최고의 선생님이였던 포아림 선생님의 블로그를 참고하자: https://poalim.tistory.com/24?category=758538

profile
정글에서 살아남기

0개의 댓글