[42서울] Philosophers(2)

tamagoyakii·2022년 8월 19일
1

42seoul

목록 보기
11/19
post-thumbnail

프로세스와 스레드에 대한 기본적인 내용은 TIL 32일차 - [컴퓨터공학] 운영체제 에서 한번 공부한 적이 있다. 운영체제에 대한 내용이 궁금하다면 링크를 보시길!

항상 그랬지만 오늘의 TIL도 의식에 흐름에 따라 적을 예정이다. 이 포스트는 Philosophers 서브젝트를 하며 내가 배운 내용을 정리한 글이지, 서브젝트를 해결하기 위한 과정을 정리한 글이 아니기 때문에 혹시나 제목을 보고 과제에 대한 팁을 얻기 위해 들어온 분들은... 돌아가기를 추천..!

멀티 스레드(Multi-Thread)

멀티 프로세스는 애플리케이션 단위의 멀티태스킹이고, 멀티 스레드는 애플리케이션 내부의 멀티태스킹이다.

멀티 스레딩의 가장 큰 장점은 자신이 속한 프로세스의 메모리를 공유하므로 메모리 공간과 시스템 자원의 소모가 줄어든다는 것이다. 하지만 이로 인해 나타나는 문제점은 서로 다른 스레드가 힙 영역은 공유하며 같은 데이터에 접근하기 때문에 서로 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정하는 일이 발생할 수 있다는 것이다. 때문에 동기화 작업을 통해 작업 처리 순서를 제어하고 공유 자원에 대한 접근을 제어해야 한다.

임계 구역(Critical Section)

임계 구역은 임계 영역이라고도 부르며, 병렬 컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원에 접근하는 코드의 일부를 말한다. 임계 구역을 시작하는 코드 부분을 '입장 구역(entry section)', 임계 영역을 종료하는 부분을 '퇴장 구역(exit section)', 그 외의 부분은 '나머지 구역(remainder section)'이라고 부른다.

보호되지 않는 임계 구역에 두 처리 단위가 동시에 접근할 때 발생하는 문제를 임계 구역 문제라고 부르는데, 이를 해결하기 위해서는 3가지가 만족되어야 한다.

1. 상호 배제(mutual exclusion)

공유 자원을 한 개의 프로세스에서만 접근할 수 있도록 하는 것이다. 한 프로세스가 자신의 임계 구역에 접근했다면, 다른 프로세스들은 그들의 임계 구역에서 실행될 수 없다.

2. 진행(progress)

어느 스레드가 먼저 들어갈 것인지에 대한 결정이 유한 시간 내에 이루어져야 한다.

3. 유한 대기(bounded waiting)

대기하는 스레드가 있다면 유한 시간 내에 임계 구역에 접근할 수 있어야 한다.

동기화 기법(Synchronization)

동기화는 상호 배제의 한 기법으로, 관점에 따라 실행 순서의 동기화와 메모리 접근의 동기화로 나누어볼 수 있다.

  • 실행 순서의 동기화 : 스레드의 실행 순서를 정의하고, 그 순서에 반드시 따르도록 한다.
  • 메모리 접근의 동기화 : 메모리에 대한 동시 접근을 막는다.

Windows는 다양한 동기화 기법을 제공하는데, 크게 두 가지로 나뉜다.

1. 유저 모드 동기화(User Mode Synchronize)

동기화 과정에서 커널의 힘을 빌리지 않는 동기화 기법이다. 동기화가 진행될 때 커널 모드로의 전환이 필요 없기 때문에 성능적인 이점이 있지만, 커널 모드를 사용하지 못함에서 오는 기능의 제한도 있다.

e.g.) 크리티컬 섹션 동기화, 인터락 함수 동기화

2. 커널 모드 동기화(Kernel Mode Synchronize)

커널에서 제공하는 동기화 기능을 활용하는 방법이다. 동기화 관련 함수가 호출될 때마다 커널 모드로의 전환이 필요하기 때문에 성능 저하가 동반된다. 하지만 유저 모드 동기화에서는 사용하지 못하는 기능을 제공받을 수 있다는 장점이 있다.

e.g.) 뮤텍스 동기화, 세마포어 동기화, 이벤트 동기화

유저 모드와 커널 모드에 대한 내용은 위의 링크에 누군가 야무지게 정리를 해놓으셨는데, 나도 기회가 될 때 한번 써보도록 하겠다.

여러가지 동기화 기법이 있지만, 오늘은 철학자 과제에서 사용할 뮤텍스 동기화에 대해서 알아보도록 하겠다.

뮤텍스(Mutex)

뮤텍스는.. 상호 배제(Mutual Exclusion)의 약자이다...! 상상도 못한 정체.. ㄴㅇㄱ

뮤텍스는 key에 해당하는 어떤 오브젝트를 소유하고 있어야만 공유 자원에 접근할 수 있도록 하는 상호 배제 기법이다. 흔히 화장실 열쇠가 하나밖에 없는 식당을 예시로 든다. Philosophers 서브젝트의 경우 "포크"를 key, "스파게티"를 공유 자원으로 치환할 수 있겠다.

뮤텍스가 제공하는 기능은 간단하게 아래의 두 가지다.

1. lock

임계 구역에 들어갈 권한을 얻어온다. 만일 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할 때까지 대기한다.(entry section)

2. unlock

현재의 임계 구역을 모두 사용했음을 알린다. 대기 중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다.(exit section)

뮤텍스는 세마포어와 비교되곤 한다. 세마포어는 현재 공유 자원에 접근할 수 있는 프로세스/스레드의 수를 나타내는 값을 두어 상호 배제를 달성하는 기법이다. 뮤텍스와 세마포어의 가장 큰 차이는 스레드를 세는 Count 기능이다. 즉, 뮤텍스는 임계 영역에 접근하는 스레드의 수를 조절하는 기능을 가지고 있지 않지만, 세마포어는 가지고 있다.

임계 영역에 접근하는 스레드의 수를 하나로 제한하는 세마포어를 바이너리 세마포어라고 부르는데, 이 경우 바이너리 세마포어는 뮤텍스와 같은 기능을 하게 된다. 때문에 "뮤텍스는 세마포어의 일종이다"라고 이야기하기도 한다.

데드락(Deadlock)

데드락, 즉 교착 상태는 시스템 자원에 대한 요구가 뒤엉킨 상태를 의미한다. 둘 이상의 스레드가 이미 다른 스레드가 점유하고 있는 자원을 기다릴 때 block 된 상태로 무한 대기에 빠진다. 데드락의 발생 조건은 다음과 같다.

1. 상호 배제(Mutual Exclusion)

하나의 프로세스만 공유 자원에 접근할 수 있으며, 사용 중인 자원에 접근하려면 해당 자원이 해제될 때까지 기다려야 한다. 즉, 자원 자체를 동시에 쓸 수 없는 경우를 일컫는다.

2. 점유 대기(Hold and Wait)

자원을 붙잡은 상태에서 다른 자원을 기다려야 한다. 여러 개의 자원을 동시에 써야 하는 경우, 몇몇의 자원은 이미 할당을 받았는데 남은 자원을 다른 프로세스에서 사용하고 있어서 무한 대기에 빠지는 것이다.

3. 비선점(No Preepmtion)

다른 프로세스가 사용하고 있는 자원을 뺏어올 방법이 없다.

4. 원형 대기(Circular Wait)

대기 프로세스들이 순환 형태로 자원을 기다리고 있다. 즉, 대기 체인을 어떻게든 해결해보려고 해도 결국 대기중인 자신으로 돌아온다는 것이다.

데드락은 위의 네 가지 조건을 충족해야만 하기 때문에 굉장히 드물게 발생하는데, 컴퓨터에 치명적이며 오류 해결이 힘든 편이다.

참고

https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD
https://namu.wiki/w/%EB%AE%A4%ED%85%8D%EC%8A%A4
https://namu.wiki/w/%EB%8D%B0%EB%93%9C%EB%9D%BD
https://8iggy.tistory.com/184?category=1023741

0개의 댓글