본문 바로가기

CS 전공지식

24.01.25 스레드와 멀티스레딩 그리고 공유자원과 임계영역

1. 스레드

    - 프로세스의 실행 가능한 가장 작은 단위

    - 프로세스는 여러 스레드를 가질 수 있다

    - 코드, 데이터, 스택, 힙을 각각 생성하는 프로세스와는 달리 스레드는 코드, 데이터, 힙은 스레드 끼리

      서로 공유하고 그 외의 영역은 각각 생성됨

 

2. 멀티스레딩

    - 프로세스 내 작업을 여러개의 스레드, 멀티스레드로 처리하는 기법

    - 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높다

    - 예) 웹 요청을 처리할 때 새 프로세스를 생성하는 대신 스레드를 사용하는웹 서버의 경우 훨씬 적은 리소스를

            소비하며 한 스레드가 중단되더라도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않은 빠른 처리 가능

    - 동시성에도 큰 장점이 있다

    - 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져있는 프로세스에 영향을

      줄 수 있는 단점이 있다

    * 동시성 : 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것

    - 멀티스레드의 예로는 웹 브라우저의 렌더러 프로세스를 들 수 있다 이 프로세스 내에는 아래와 같은 스레드가 존재

    * 메인 스레드 : 일당백 스레드

    * 워커 스레드 : 조수 스레드

    * 컴포지터 스레드 : 레이어를 합성하는 스레드

    * 레스터 스레드 : 화면을 픽셀로 변환하는 스레드

 

3. 공유 자원 (shared resource)

    - 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의

       자원이나 변수등을 의미

    - 공유 자원을 두개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁상태(race condition)라고 한다

    - 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영항을 줄 수 있는 상태

    - 예) 아래와 같이 종선코인 100개가 있다고 했을 때 프로세스 A 와 프로세스 B 가 동시에 접근하여 타이밍이

            서로 꼬여 정상 결과값은 300인데 200이 출력됨

 

4. 임계 영역 (critical section)

    - 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서등의 이유로 결과가 달라지는 코드 영역

    - 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세가지고 있고 이 방법 모두 상호 배제, 한정 대기,

      융통성이란 조건을 만족한다

    - 토대가 되는 메커니즘은 잠금이다

    - 예) 임계 영역을 화장실이라고 가정하면 화장실에 A 라는 사람이 들어간 다음 문을 잠급니다 그리고

            다음 사람이 이를 기다리다 A 가 나오면 화장실을 쓰는 방법

    * 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다

    * 한정 대기 : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안된다

    * 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해서는 안된다

 

  1) 뮤텍스 (mutex)

       - 프로세스나 스레드가 공유 자원을 lock( )을 통해 잠금 설정하고 사용한 후에는 unlock( )을 통해 잠금 해제하는 객체

       - 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고 해제는 그와 반대

       - 잠금 또는 잠금 해제라는 상태만을 가진다

 

  2) 세마포어 (semaphore)

       - 일반화된 뮤텍스

       - 간단한 정수 값과 두가지 함수 wait (P 함수라고도 함) 및 signal (V 함수라고도 함)로 공유 자원에 대한 접근을 처리

       - wait( )는 자신의 차례가 올 때까지 기다리는 함수, signal( ) 은 다음 프로세스로 순서를 넘겨주는 함수

       - 프로세스나 스레드가 공유 자원에 접근하면 세마포어에서 wait( ) 작업을 수행하고 공유자원을 해제하면

         세마포어에서 signal( ) 작업을 수행

       - 세마포어에는 조건 변수가 없고 프로세스나 스레드가 세마포어 값을 수정할 때 다른 프로세스나 스레드는

         동시에 세마포어 값을 수정할 수 없다

 

     (1) 바이너리 세마포어

           - 0과 1의 두가지 값만 기잘 수 있는 세마포어

           - 구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라고 할 수 있지만 엄밀히 말하면 뮤텍스는

             잠금을 기반으로 상호배제가 일어나는 잠금 메커니즘이고, 세마포어는 신호를 기반으로 상호배제가

             일어나는 신호메커니즘

           - 신호 메커니즘은 휴대폰에서 노래를 듣다가 친구로부터 전화가 오면 노래가 중지되고 통화처리 작업에

             관한 인터페이스가 등장하는 것

 

     (2) 카운팅 세마포어

           - 여러개의 값을 가질 수 있는 세마포어

           - 여러 자원에 대한 접근을 제어하는데 사용됨

 

  3) 모니터

       - 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해

         인터페이스만 제공함

       - 아래 그림처럼 모니터는 모니터큐를 통해 공유자원에 대한 작업들을 순차적으로 처리

       - 모니터는 세마포어보다 구현하기 쉬우며 모니터에서 상호배제는 자동인 반면, 세마포어에서는

         상호 배제를 명시적으로 구현해야 하는 차이점이 있다

'CS 전공지식' 카테고리의 다른 글

24.01.30 JVM 과 바이트 코드  (1) 2024.01.30
24.01.26 CPU 스케쥴링 알고리즘  (2) 2024.01.26
24.01.24 프로세스 2  (1) 2024.01.24
24.01.22 비선형 자료 구조 2  (0) 2024.01.22
24.01.19 비선형 자료 구조 1  (0) 2024.01.19