본문 바로가기
반응형

반도체 그 다음 학문73

운영체제 Reader-Writers & Dining Philosophers 고전적인 동기화 문제 중에 Reader-Writers문제와 Dining Philosophers문제를 어떻게 해결하는지 알아보자. Reader-Writers 데이터베이스에서 데이터에 접근할 때, Reader와 Writer가 존재한다. Reader는 읽기만 하고 데이터를 수정하진 않고 Writer는 읽고 수정도 할 수 있다. 이런 상황에서 writer가 수정하고 있는데 다른 누군가가 읽거나 수정한다면 동기화의 문제가 생긴다. 이렇게 데이터를 수정할 때는 하나의 writer만 할 수 있도록 해야 하고 수정할 때는 reader도 읽어갈 수 없어야 한다. binary semaphore로 해결하면, "mutex"라는 공유 변수를 만들어서 1로 초기화한다. 다음으로 "read_count"라는 int 변수를 만들어 0.. 2022. 5. 12.
운영체제 Monitors & Liveness Monitors 동기화 문제를 상위 수준에서 해결하기 위해 나온 것이 Monitors이다. 클래스와 같은 구조로 지원해준다. 즉, 직접 접근이 어렵고 monitors를 통해서만 접근할 수 있다는 의미로, 공유자원을 보호할 수 있다. 각 언어마다 다 다르지만, 공통적인 부분은 여러 프로세스들에 의해 공유될 수 있다. Monitors는 한순간에 하나의 프로세스만 사용 가능하고 모니터를 누군가 사용하고 있다면 다른 프로세스들은 대기해야 하며, 공유 자원은 Monitors가 지원하는 동작으로만 접근할 수 있다. Liveness Progress와 bounded-waitiing이 모두 만족하는 상황을 Livenss라고 부른다. 이 liveness를 저해하는 요소가 3가지 있다. 1. Deadlock - 두 개 이상.. 2022. 5. 12.
운영체제 Mutex Locks & Semaphore Mutex Locks (Mutual exclusion) 프로그래머들이 하드웨어의 지원을 가지고 쉽게 동기화를 사용할 수 있게 API를 만들었는데 이 중 하나가 Mutex이다. boolean변수로 lock이 가능한지 안 한 지 알려준다. 즉, True, False로 CS에 들어갈 수 있나 없나를 판단한다. 이러니 프로세스가 하나밖에 들어갈 수 없다는 의미다. CS를 사용하고 싶을 때는 "acquire()"라는 API를 사용하고, CS를 나왔을 때는 다른 프로세스에게 넘겨주기 위해 "release()"라는 API를 사용한다. 다음 프로세스는 busy waitiing을 할 수밖에 없다는 단점이 있다.( CPU를 계속 사용하면서 대기함 == spin lock ) 하지만 실제로 리눅스에선 RQ (ready que.. 2022. 5. 12.
운영체제 비순차적 명령어 처리 ( Reorder , Out-of-order execution , OoOE ) Reorder or Out-of-order execution (OoOE) (비순차적 명령어 처리) 말 그대로 명령어를 순차적으로 실행하는 것이 아니라 cpu의 효율을 최대화하기 위해 비순차적으로 처리하겠다는 의미다. 간단히 예를 들어보자. 2개의 core는 boolean flag = false;와 int x = 0;이라는 공유 변수를 사용한다 했을 때 코드를 보자. # share var boolean flag = false; int x = 0; # core 1 while(!flag); print(x); # core 2 x = 100; flag = true; 이렇게 돼 있으면 core1과 core 2는 동시에 두 공유 변수를 가져와서 실행한다. 이때 core1에서는 무한루프에 빠지고, core 2에서 x를.. 2022. 5. 12.
운영체제 Sychronization ( 동기화, Mutual Execlusion, Progress, Bounded waiting, Interrupt-based solution, Peterson's solution, Memory Barrier ) 먼저 Race condition에 대해 알아보자 Race condition이란 한정된 자원을 동시에 이용하려고 프로세스끼리 경쟁을 벌리는 걸 말한다. 예를 들어보자, 네이버에 서버 접속하면 fork()를 통해 고유의 PID를 배정받고 thread가 생성된다. 근데 동시에 네이버에 접속하는 사람이 있다면 누구에게 다음 PID를 배정해야 할까?? 이렇게 동기화의 문제가 생긴다. 이렇듯 중요한 정보를 가지고 있는 부분을 critical section이라고 부른다. critical section에는 공유 변수(common variables), updating tabel, writing file 등과 같은 것들이 있다. 이런 부분에는 혼자만 수정해야 한다. 그래야 동기화 문제가 생기지 않는다. 크게 4개의 부분으.. 2022. 5. 12.