멀티스레드 프로그래밍, 프로세스 동기화

갱두·2021년 10월 19일
0

📚 운영체제

목록 보기
4/14

하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 말함

멀티 스레딩의 장점

✔️ 메모리 공간과 시스템 자원 소모가 줄어들게 됨
✔️ 스레드 간의 통신이 필요한 경우에도 별도의 자원 이용 ❌, 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고 받을 수 있다.
그래서 프로세스에 비해 스레드의 통신 방법이 훨씬 간단하고, 빠름

따라서 시스템의 throughput이 향상되고 자원 소모가 줄어들며 자연스럽게 프로그램의 응답 시간이 단축 됨
이러한 장점 때문에 여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 스레드로 나눠 수행하는 것임

멀티 스레딩의 문제점

멀티 스레딩을 기반으로 할 때는 프로세스 간 공유하는 자원이 있기 때문에 동일한 자원에 동시에 접근하는 것을 신경써줘야 함
서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있음.

그렇기 때문에 멀티스레딩 환경에서는 동기화 작업이 필요함.
동기화를 통해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤 하는 것이다.
➡️ 병목현상 발생해서 성능 저하될 가능성이 있으므로 과도한 락으로 인한 병목현상 줄여야 함

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

✔️ 멀티 스레드
멀티 프로세스보다 작은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 갖고 있음

✔️ 멀티 프로세스
하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재

Thread-safe

두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태
쉽게 말해, 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의함.

프로세스 동기화

Critical Section (임계 영역)

동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역을 Critical Section이라 함

CS 문제

프로세스들이 Critical Section을 함께 사용할 수 있는 프로토콜을 설계하는 것

해결을 위한 조건

  • Mutual Exclusion (상호 배제)
    프로세스 P1이 CS에서 실행 중이라면, 다른 프로세스들은 그들이 가진 CS에서 실행될 수 ❌
  • Progress
    CS에서 실행 중인 프로세스가 없고 별도의 동작이 없는 프로세스들만 CS 진입 후보로서 참여할 수 있음
  • Bounded Waiting
    P1이 CS에 진입 신청 후부터 받아들여질 떄까지 다른 프로세스들이 CS에 진입하는 횟수는 제한이 있어야 함

해결책

1. Lock
하드웨어 기반 해결책으로써, 동시에 공유 자원에 접근하는 것을 막기 위해 CS에 진입하는 프로세스는 Lock을 획득, CS를 빠져나올 때, Lock을 방출해서 동시 접근을 방지함
✔️ 문제점
시간적인 효율성

2. 세마포어
소프트웨어 상에서 CS 문제를 해결하기 위한 동기화 도구
✔️ 종류

  • Counting Semaphore
    가용한 개수를 가진 자원에 대한 접근 제어용 으로 사용되며, 세마포어는 그 가용한 자원의 개수로 초기화됨.
    자원을 사용하면 세마포어가 감소, 방출하면 세마포어가 증가함
  • Binary Semaphore = MUTEX
    이름 그대로 0과 1사이의 값만 가능하며, 다중 프로세스들 사이의 CS문제를 해결하기 위해 사용함

✔️ 문제점

  • Busy Waiting
    CS에 진입해야 하는 프로세스는 진입 코드를 계속 반복 실행하며 CPU 시간을 낭비함. 이게 Busy Waiting이고 특수한 상황이 아니면 비효율적임
    💡 해결한 방법
    세마포어에서 CS에 진입을 시도했지만 실패한 프로세스에 대해 블락시키고 CS에 자리가 날 때 다시 깨우는 방식 사용
  • Deadlock
    세마포어가 레디큐를 갖고 있고, 둘 이상의 프로세스가 CS진입을 무한정 기다리고 있고, CS에서 실행되는 프로세스는 진입 대기 중인 프로세스가 실행되어야만 빠져나올 수 있는 상황
    💡 발생 조건
    ✔️ 상호 배제 (한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 함)
    ✔️ 점유 대기 (할당된 자원을 가진 상태에서 다른 자원을 기다림)
    ✔️ 비선점 (다른 프로세스가 자원의 사용을 끝낼 때까지 자원을 뺏을 수 없음)
    ✔️ 순환 대기 (각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있음)
    💡 해결한 방법
    • 예방
    • 회피
    • 회복
    • 무시

세마포어 VS 뮤텍스

뮤텍스는 락을 건 스레드만 CS를 나갈 때 락을 해제할 수 있음
하지만 세마포어는 락을 걸지 않은 스레드도 락을 해제할 수 있고, 세마포어의 카운트를 1로 설정하면 뮤텍스랑 같음

출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://github.com/ksundong/backend-interview-question

profile
👩🏻‍💻🔥

0개의 댓글