Computer Science/Operating System16 Concurrency Problem의 종류 및 원인 Concurrency Problem이란? 하나의 process 안에서 여러 개의 thread를 사용하는 경우가 많다. 여러 개의 thread를 사용하면서 동시에 공유 자원에 접근하거나 잘못된 scheduling으로 인해 오류가 발생할 수 있다. 이렇게 동시에 여러 개의 thread를 관리하면서 생기는 문제들을 Concurrency Problem이라고 한다. 그렇다면 Concurrency Problem에는 어떤 것들이 있을까? 먼저 대표적인 Concurrency Problem인 Deadlock에 대해서 알아보고, 추가적으로 다른 Problem들을 알아보자. Deadlock Deadlock이란 여러 가지 원인으로 인해 아무도 lock을 획득하지 못하고 멈춰있는 교착상태를 말한다. 예를 들어 위와 같이 여러 .. 2019. 9. 24. Semaphore란? Semaphore란? Semaphore는 간단하게 말하면 정수 하나라고 생각할 수 있다. 여기에 wait와 post 함수를 통해서 이 정수 값을 바꿈으로써 thread를 통제한다. 어떻게 정수값을 통해 thread를 관리하는지 알아보자. Semaphore 사용법 Semaphore를 사용하기 위해서는 먼저 Semaphore 객체를 만들어주어야 한다. 객체를 만들어 준 뒤에는 init 함수를 통해 Semaphore 값을 초기화시킨다. 이 때, 첫번째 파라미터는 Semaphore 객체, 두번째 파라미터는 Semaphore를 사용할 범위 (0: 같은 process / 1: 다른 process), 세번째 파라미터는 Semaphore 값을 초기화 할 값이다. 객체를 초기화 했다면 이제 wait()와 post() 함.. 2019. 9. 16. Condition Variable이란? Condition Variable이란? Condition Variable은 특정 조건을 만족하기를 기다리는 변수라는 의미이다. 따라서 이를 이용하여 주로 thread간의 신호 전달을 위해 사용한다. 하나의 thread가 waiting 중이면 조건을 만족한 thread에서 변수를 바꾸고 signaling을 통해 깨우는 방식이다. Condition Variable 사용법 Condition Variable은 앞서 말했 듯 waiting과 signaling을 사용한다. 따라서 기본적으로 cond_wait()와 cond_signal() 함수를 사용하게 된다. 또한 wait와 signal 내부적으로 unlock()과 lock()이 각각 앞 뒤로 있기 때문에 외부를 lock()과 unlock()으로 감싸야 한다. 그.. 2019. 9. 5. Lock의 개념과 구현 방법 Lock이란? 앞서 설명했듯 critical section이란 여러 thread에서 동시에 실행되면 안되는 부분을 말한다. 따라서 critical section을 하나의 thread에서만 접근할 수 있도록 보호해야할 필요가 있다. 이 때 lock을 사용하면 critical section을 보호할 수 있다. lock은 기본적으로 lock을 획득한 thread만 critical section을 실행하며, 사용하고 난 뒤에 lock을 반환한다. 따라서 다른 thread가 lock을 갖고 있지 않을 때 lock을 획득하는 lock() 함수와 critical section을 모두 수행한 뒤에 lock을 반환하는 unlock() 함수가 사용된다. 그렇다면 lock은 어떻게 사용하고, 어떻게 구현하고 평가하는지 알아.. 2019. 9. 5. Thread와 Thread API Thread의 개념과 특징 Thread는 하나의 프로세스에서 동시에 여러 작업을 수행해야 할 때 사용한다. 특히 I/O 작업과 같이 대기하는 시간이 긴 작업을 할 때 Thread를 이용하여 다른 작업을 수행하는 것이 효율적이다. 서로 다른 프로세스는 주소공간을 공유하지 않지만 Thread의 경우는 모두 같은 주소공간을 사용한다. 이렇게 주소공간을 공유할 경우 동시에 같은 자원에 접근할 때 문제가 생길 수 있다. Concurrency Problem 두 개의 Thread가 각각 하나의 counter 변수를 증가시키는 상황에서 어떤 문제가 발생하는 지 알아보자. 각각의 Thread의 코드는 다음과 같다. ① counter 변수를 받아온다. ② 받아온 변수를 1 증가시킨다. ③ 증가시킨 변수를 counter 변.. 2019. 9. 4. Page Swapping이란? Swapping과 Swap Space 일반적으로 프로세스가 사용하는 자원은 RAM, 메인 메모리에 들어있다. 그러나 프로세스가 사용해야 할 모든 자원을 메인 메모리에 올리기에는 용량이 부족하다. 따라서 일부의 작업만 메인 메모리에 올리고 나머지는 다른 저장 공간에 저장한 뒤에 필요할 때 불러와 사용하게 된다. 이 과정을 Swapping이라 하며 메인 메모리에 올라가지 못한 자원이 저장되는 공간을 Swap Space라고 한다. Memory Access Flow 자원에 접근하기 위해서는 가상 메모리 주소를 물리적 주소로 변환하는 다음과 같은 translation 과정이 필요하다. 1. 먼저 TLB를 확인한다. -> TLB에 요청받은 주소가 있다면 물리적 주소를 반환받는다. (끝) -> 요청받은 주소가 없다면.. 2019. 9. 2. Advanced Page Table 기존 Page Table의 문제점 32bit 주소체계 / Page 크기 : 16KB 라 가정하자. 이 때 Offset은 페이지 크기인 16*2^10=2^14bit가 필요하다. 따라서 32-14=18bit가 VPN으로 사용 가능하므로 총 2^18개의 VPN을 표현할 수 있다. Page Table은 VPN 수로 크기가 정해지므로, 하나의 Entry가 4byte라면 4*2^18=2^20byte=1MB 크기가 될 것이다. Page Table은 프로세스 하나당 한개씩 생성되므로 프로세스가 100개라면 무려 100MB의 메모리를 차지하게 된다. 따라서 Page Table의 크기를 더 줄여야 할 필요가 있다. Page Table에는 위와 같이 할당받았지만 사용하지 않는 Page들에 대한 Entry들도 모두 저장되어있.. 2019. 4. 23. Translation Lookaside Buffers - TLB란? TLB란? Address Translation 과정에서 VPN을 PFN으로 변환하려면 Page Table에 접근하여야 한다. 이 과정을 더 빠르게 하기 위해 자주 쓰이는 Translation들을 Memory Management Unit(MMU)에 저장하여 사용하는데 이렇게 저장한 Cache를 TLB라 한다. TLB 기본 알고리즘 1. Translation 요청이 들어오면 주소값에서 VPN을 추출한다. 2. 해당하는 Translation이 TLB에 있는 지 확인한다. 3-1. TLB에 있다면 VPN을 PFN으로 변환하여 반환한다. (TLB Hit) 3-2. TLB에 없다면 Page Table에 접근하여 PFN으로 변환하여 반환한다. (TLB Miss) 그 후 해당 Translation을 TLB에 업데이트한.. 2019. 4. 23. Paging이란? Paging이란? Paging이란 가상주소공간을 일정한 크기의 Page로 나누는 것을 말한다. 물리적 메모리는 이런 Page들을 담기 위한 영역으로 나누는데 이를 Page Frame이라 한다. 또한 나뉘어진 가상주소공간의 Page가 물리적 메모리의 어떤 Page Frame에 저장되는지를 Page Table에 기록한다. 이렇게 일정한 단위로 주소공간을 나눔으로써 메모리 할당이나 Free List 관리 또한 용이해진다. Page와 Page Frame 가상주소공간이 64byte라 할 때 하나의 Page 크기를 16byte로 정하면 4개의 Page로 나눌 수 있고 이를 저장하기 위해서는 물리적 메모리에서 4개의 Page Frame을 할당해주어야 한다. Address Translation 이렇게 주소 공간을 기존.. 2019. 4. 23. 이전 1 2 다음