Computer Science/Operating System

[OS] Cuncurrency: 동시성 개요

kyxxn 2024. 5. 6. 20:00
728x90

스레드 개념이 도입됨

Thread 개념 및 관리

하나의 프로세스 내에 독립된 실행 흐름 (독자적 PC와 레지스터 보유)
프로세스 주소 공간 공유 → 데이터 공유 가능
여기서 병행성 문제가 발생함

Concurrency Control (병행성 제어)

공유 변수에 하나의 프로세스만 접근

→ 동기화된 방식으로 데이터를 접근하도록 강제하는 방법

스레드 관리

  1. 하나의 프로세스 주소 공간 내 여러 개의 스택

    스택 = 스레드 지역 저장소

  2. 독립된 실행 흐름

    상태 전이: 프로세스 상태와 동일함 (Running, Ready, Blocked)

    하나의 CPU에서는 한 번에 하나의 스레드씩 실행함

    → PC 및 레지스터를 독자적으로 유지 (별도의 Context)

    → TCB (Thread Control Block)에 관리 정보가 유지됨

    OS가 실행 스레드 교체 시 Context Switch

왜 스레드를 사용하는데 ? (스레드 장점)

  1. 프로세스에 비해 빠른 생성이 가능 (Process < Thread)
    프로세스는 무거움, 스레드는 가벼움

  2. 병렬 처리에 적합함 (Process = Thread)

  3. 처리와 대기를 분리하여 효율 증대 (Process = Thread)

    웹 서버, GUI 등

  4. 데이터 공유 (Process ≤ Thread)

멀티 스레드 프로그램

여러 개의 실행 흐름을 갖는 프로그램
여러 개의 PC 값을 동시에 유지함
하나의 주소 공간을 공유

주소 공간 - 스택/스레드

하나의 스레드 당 8MB를 할당받음

8MB가 넘는 변수를 선언하게 될 경우 전역변수로 빼야함

Shared Data

count ++; 는 3가지의 어셈블리어로 동작함
1번 2번 동작을 하다가 인터럽트가 걸리면 병행성 문제가 발생함

  1. 경쟁 조건 (Race Condition)

    스레드 실행 순서에 따라 결과가 달라지는 현상

    정확한 답을 보장할 수 없음

  2. 임계 영역 (Critical Section)

    경쟁 조건을 유발할 수 있는 코드

    공유 자원을 접근하므로 동시에 두 쓰레드가 실행해서는 안 됨

  3. 상호 배제 (Mutual Exclusion)

    반드시 하나의 스레드만 임계 영역을 실행할 수 있도록 보장

원자성 (Atomicity)

더 이상 쪼개질 수 없음

임계 영역의 명령들이 원자적으로 수행된다면 ? → 상호배제 사용

어떻게 한 구역의 원자적 실행이 가능 ?

  1. 인터럽트로 불가능하게 하는 것

    근데 요즘은 멀티 프로세스라 이건 X

  2. 하드웨어 명령어 추가

    short, int , float, double … 등등 고려할 게 많음

    현실성이 없음 - X

  3. 상호 배제용 API

    하드웨어 명령을 활용하여 동기화 함수를 구현함
    Lock, Condition Variable

동시성(병행성) 문제

  1. 상호 배제로 해결

  2. 동기화로 해결

    → 하나의 스레드가 다른 스레드의 어떤 동작이 끝나기를 기다림