본문 바로가기

개발자 강화/CS 개념

프로세스, 스레드 / 동시성 제어 그리고 운영체제 레츠고

저번학기에 배운 건데도 기억이 안나다니

공부는 진짜 유산소와 같다

계속 해야함

면접용 CS 정리라서 운영체제 시험 준비를 하시는 분들은 안맞을 수도 있어용

 

프로세스와 스레드

  • 간단히 생각하면 프로세스>스레드. 프로세스 안에 스레드 있음
  • 프로세스
    • 실행 중인 프로그램의 인스턴스
    • 독립적인 메모리 공간을 가짐
    • 운영체제가 자원을 할당하는 기본 단위
  • 스레드
    • 프로세스 내에서 실행되는 작은 실행 단위
    • 같은 프로세스 내에서 다른 스레드들과 메모리 공유(코드, 데이터, 힙)
    • 공유 메모리 때문에 데이터 접근 시 동기화가 필요함
    • 스레드마다 독립적인 스택과 레지스터 가짐
  • 통신
    • 프로세스 간 통신 - IPC inter process communicaiton
      • 독립적인 메모리 공간을 사용하므로 통신 이 복잡함
      • 파일, 소켓, 파이프, 메시지 큐, 공유 메모리 등을 사용
    • 스레드 간 통신
      • 같은 메모리 공간을 공유하므로 간단하게 통신
      • 변수나 메모리 직접 사용 가능
  • 오버헤드
    • 프로세스
      • 독립적인 메모리와 자원을 관리하므로 오버헤드가 큼
      • 문맥 전환(context switch) 시 프로세스의 메모리 맵핑 필요
    • 스레드
      • 메모리 공유 덕에 문맥 전환 비용이 상대적으로 낮음
  • 안정성
    • 프로세스
      • 한 프로세스의 문제는 다른 프로세스에 영향 x. 독립적임. 높은 안정성
    • 스레드
      • 한 스레드의 오류가 프로세스 전체에 영향 줄 수 있음. 낮은 안정성.
  • 사용 사례
    • 프로세스
      • 독립적인 작업이 필요하거나 보안, 안정성이 중요한 경우
      • 예: 브라우저 각 탭은 프로세스 별로 분리해서 관리
    • 스레드
      • 작업이 밀접히 관련되어 있고, 자원을 효율적으로 공유해야 하는 경우
      • 예: 멀티스레드 웹 서버

 

동시성 제어의 필요성

  • 동시성 제어가 왜 필요한가?
    • 여러 작업이 동시에 실행되며 동일한 자원을 수정하면 결과에 문제가 생길 수 있음
    • 예시: 두 개의 은행 계좌 이체가 같은 계좌에 접근해 잔액을 잘못 계산
  • Race Condition 방지
    • 여러 스레드가 동시에 공유 자원에 접근해 실행 순서에 따라 결과가 달라지는 문제 방지
  • Deadlock 회피
    • 두 개 이상의 프로세스/스레드가 서로 자원을 기다리면서 무한 대기가 되는 상황을 방지
  • 성능 최적화
    • 효율적으로 동시성을 관리해 불필요한 대기 시간을 줄이고 시스템 성능 최대화

 

동시성 제어 주요 개념

  • 임계 구역 critical section
    • 공유 자원을 접근하거나 수정하는 코드 영역
    • 한 번에 하나의 스레드만 이 영역에 들어가도록 제한
  • 뮤텍스 mutex
    • 상호 배제를 통해 한 번에 하나의 스레드만 임계 구역에 접근하도록 보장하는 매커니즘
    • 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고, 사용한 후에는 unlock()으로 해제함
    • 자금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고, 해제는 접근할 수 있음
    • 오직 잠금 or 해제의 상태만을 가짐
    • 상호배제: 여러 프로세스나 스레드가 공유자원에 동시에 접근하지 못하도록 제어하는 개념
    • 상호배제 조건
      • 한 번에 하나의 프로세스/스레드만 자원에 접근 가능
      • 임계 구역에 자원을 요청한 프로세스가 있다면, 하나는 반드시 진입할 수 있어야 함
      • 유한 대기 조건, 어떤 프로세스도 무한히 대기해서는 안됨
      • 비선점 조건, 임계 구역에서 작업 중인 프로세스를 강제로 종료하거나 자원을 뺏으면 안됨
  • 세마포어 semaphore
    • 카운팅 방식으로 자원 접근 제어
    • 동시에 N개의 스레드가 자원에 접근할 수 있도록 허용
    • 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리함
    • wait()은 자신의 차례가 올 때까지 기다리는 함수이고, signal()은 다음 프로세스로 순서를 넘겨주는 함수
    • 바이너리 세마포어
      • 0과 1만 가지고 있어서, 뮤텍스와 비슷해보임
      • 그러나 뮤텍스는 잠금을 기반으로 상호배제를 하는 '잠금 매커니즘'이고
      • 세마포어는 신호를 기반으로 상호배제를 하는 '신호 매커니즘'
      • 신호 매커니즘의 예시는 어떤 작업을 하다가 새로운 작업 요청이 들어오면 이전 작업이 중단되고 새 작업이 실행되는... 그런 신호 베이스
    • 카운팅 세마포어
      • 여러 개의 값을 가질 수 있음. 여러 자원에 대한 접근을 제어함

    • 특정 자원을 다른 스레드/프로세스가 접근하지 못하도록 잠금
  • monitor
    • 뮤텍스와 조건 변수를 활용해 임계 구역을 제어하는 고수준 동기화 기술
    • 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 접근 인터페이스만 제공
    • 모니터는 모니터 큐를 통해 공유 자원에 대한 작업을 순차적으로 처리함
    • 세마포어보다 구현하기 쉽고, 상호배제가 자동으로 일어남
  • 스핀락
    • 락이 풀릴 때까지 대기하면서 cpu를 계속 점유하는 기법. 짧은 대기인 경우 유리

 

동시성 제어에서 발생하는 문제

  • race condition
    • 여러 작업이 동시에 자원에 접근하면서 실행 순서에 따라 예기치 않은 결과가 발생
    • 해결방법: 락, 뮤텍스, 세마포어 사용
  • deadlock
    • 두 개 이상의 작업이 서로 자원을 기다리면서 무한 대기 상태에 빠짐
    • 해결 방법: 락 오더링으로 순서 고정, 타임아웃 설정, 데드락 탐지 알고리즘 사용
  • starvation
    • 한 스레드가 계속해서 자원을 얻지 못하고 대기 상태에 빠지는 문제
    • 해결 방법: 공정한 자원 할당
  • live lock
    • 두 개 이상의 작업이 서로의 상태를 바꾸며 진전 없이 계속 대기하는 상태
    • 해결 방법: 작업 중단 타이머 설정

 

동시성 제어 기법

  • 락 기반
    • 락, 뮤텍스, 세마포어 등 전통 기법
    • 간단하지만 데드락, 기아 상태, 성능 저하의 우려가 있음
  • 낙관적 동시성 제어
    • 작업이 충돌하지 않을 것이라고 가정하고 실행한다
    • 출동 시 롤백
    • 데이터베이스 트랜젝션에서 사용
  • 비관적 동시성 제어
    • 자원 접근 전 락을 걸어 충돌 예방
    • 충돌 가능성이 높은 경우에 적합
  • 락프리 또는 cas
    • 락 대신 하드웨어 지원을 이용해 상태를 원자적으로 업데이트
    • java의 atomicInteger 등
  • 트랜잭션
    • 데이터베이스에서 동시성 관리에 사용
    • ACID 원자성 일관성 고립성 지속성을 기반으로 함

 

동시성 제어 예시

  • 파일 시스템
    • 여러 프로그램이 같은 파일에 접근할 때 공기화 필요
    • 예: 파일 읽기-쓰기 중 락을 걸어 충돌 방지
  • 웹 서버
    • 다수의 사용자 요청을 처리해 동일 데이터를 조회/수정하는 경우 동시성 제어
  • 데이터 베이스
    • 두 개의 트랜잭션이 동시에 같은 데이터를 업데이트 하려는 경우

 


 

DEADLOCK

 

  • 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
  • 교착 상태 원인
    • 상호배제: 한 프로세스가 자원을 독점. 다른 프로세스는 접근 불가
    • 점유대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청함
    • 비선점: 다른 프로세스의 자원을 강제적으로 가져오지 못함
    • 환형 대기: 프로세스 a는 프로세스 b의 자원을 요구, 프로세스 b는 프로세스 a의 자원을 요구
  • 교착 상태 해결
    • 자원 할당 시 애초에 조건이 성립되지 않도록 설계함
    • 교착 상태 가능성이 없을 때 자원 할당, 프로세스당 요청 자원의 최대치를 통해 자원 할당 여부 파악하는 은행원 알고리즘
      • 은행원 알고리즘: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정/불안정 상태를 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘
    • 교착 상태가 발생하면 사이클이 있는지 확인하고, 관련된 프로세스를 하나씩 지움
    • 교착 상태는 매우 드물게 일어나므로, 이를 처리하는 비용이 더 큼. 그냥 작업을 종료하는 방법. "시스템 응답 없음"

 


CPU 스케줄링 알고리즘

  • CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야하는 일을 스레드 단위로 CPU에 할당
  • 비선점 방식
    • 프로세스가 CPU 소유권을 스스로 포기하기 전까지 강제로 프로세스를 중지하지 않음
    • 문맥 전환 부하가 적음
    • FCFS
      • 선입선출, 가장 먼저 온 것 가장 먼저 처리
      • 긴 프로세스가 오래 점유해버리면 준비 큐에서 오래 기다리는 convoy effect가 있을 수있음
    • SJF
      • 실행이 짧은 프로세스 먼저 실행
      • 긴 시간을 가진 프로세스가 뒤로 계속 밀리는 기아 현상이 일어날 수 있음
      • 평균 대기 시간이 가장 짧음
      • 실제로는 실행 시간을 알 수 없기 때문에 과거 실행 시간을 토대로 추측해서 사용
    • 우선순위
      • 오래된 작업일수록 우선순위를 높여서 보완함
      • 선점형도 있고 비선점형도 있음
  • 선점형 방식
    • 현대 운영체제 채택
    • 지금 사용하고 있는 프로세스를 알고리즘에 의해 강제 중단 후 다른 프로세스에 cpu 할당
    • 라운드 로빈
      • 각 프로세스에 동일한 할당 시간을 주고, 그 시간 안에 안끝나면 준비 큐로 돌려보냄
      • q만큼 할당시간, n개의 프로세스  = (n-1)*q 시간 후에는 반드시 자기 차례가 옴
      • 할당 시간이 너무 크면 FCFS랑 다를 게 없고, 짧으면 문맥 전환이 잦아서 오버헤드
      • 일반적으로 전체 작업 시간은 길어지지만 평균 응답시간은 짧아짐
      • 로드밸런서에서 트래픽 분산 알고리즘으로도 쓰임
    • SRF
      • SJF는 실행 중에 더 짧은 작업이 들어와도 기존 짧은 작업은 모두 수행함
      • 그러나 SRF는 중간에 더 짧은 게 들어오면 프로세스 중지하고 짧은거 수행
    • 다단계 큐
      • 우선순위에 따른 준비 큐를 여러 개 사용
      • 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용
      • 큐 간의 프로세스 이동이 안되므로 스케줄링 부담이 적지면 유연성이 떨어짐
  •  

  • 운영체제의 역할
    • CPU 스케줄링과 프로세스 관리
    • 메모리 관리
    • 디스크 파일 관리
    • 입출력 디바이스 관리
  • PCB
    • 프로세스 컨트롤 브록
    • 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
    • 프로세스가 생성되면 PCB를 생성함
    • 프로세스 생성 시 스택, 힙 구조 기반으로 메모리 할당되고, 이 메타데이터들을 PCB에 저장함
    • 프로세스의 중요한 정보를 포함하므로 일반 사용자가 접근하지 못하게 커널 스택의 가장 앞부분에서 관리함
  • 메모리 계층
    • 레지스터: CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억용량 가장 작음
    • 캐시: L1,L2캐시, 휘발성, 속도 빠름, 기억 용량 작음
    • 저장장치
      • 주기억: RAM, 휘발성, 속도 보통, 기억 용량 보통
      • 보조기억: HDD, SSD, 비휘발성, 속도 낮음, 기억 용량 높음

'개발자 강화 > CS 개념' 카테고리의 다른 글

디자인패턴 MVC MVP MVVM FLUX  (0) 2024.12.12
HTTP  (0) 2024.12.12
TCP와 UDP부터 출발하는 컴퓨터 네트워크의 생활  (0) 2024.12.11