스레드

imeline·2024년 1월 5일
post-thumbnail

멀티프로세싱

  • 여러 개의 프로세스로 동시에 여러 일을 수행할 수 있는 것
  • 하나 이상의 일을 병렬로 처리 가능
  • 특정 메모리나 프로세스에 문제가 발생해도, 다른 프로세스로 처리 가능 -> 신뢰성 높음

웹 브라우저

  • 웹 브라우저는 멀티프로세스 구조를 가지고 있음
    • 브라우저 프로세스 : 주소 표시줄, 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당하며 네트워크 요청이나 파일 접근 같은 권한을 담당
    • 렌더러 프로세스 : 웹 사이트가 보이는 부분의 모든 것을 제어
    • 플러그인 프로세스 : 웹 사이트에서 사용하는 플러그인(확장 프로그램)을 제어
    • GPU 프로세스 : GPU(그래픽 처리 프로세서)를 이용해서 화면을 그리는 부분을 제어

IPC

  • 프로세스 간 통신(Inter-Process Communication) : 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로
    • 프로세스끼리 데이터를 주고받는 공유 데이터를 관리하는 메커니즘
  • 멀티프로세스에서 가능
  • 예시 : 클라이언트가 데이터를 요청하고, 서버는 클라이언트 요청에 응답하는 것
  • 종류 : 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메세지 큐
  • 메모리가 완전히 공유되는 스레드보다 속도 ⬇️ -> 프로세스는 독립적인 메모리를 사용하므로 IPC를 통해 통신
    • 프로세스는 각각의 독립적인 메모리 공간을 할당받아 실행되므로, 프로세스 간의 자원 공유나 통신을 위해서는 별도의 IPC 기법을 사용해야 하지만, 스레드는 같은 프로세스 내에서 메모리를 공유하기 때문에, 스레드 간의 자원 공유나 통신이 비교적 쉽다.

IPC 기법

공유 메모리

  • 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어, 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성하는 것
  • 공유 메모리를 통해, 여러 프로세스가 하나의 메모리 공유 가능
    (기본적으로 각 프로세스의 메모리에 다른 프로세스가 접근 불가능)
  • 메모리 자체를 공유하기 때문에
    -> 불필요한 데이터 복사의 오버헤드(처리 시간)가 발생하지 않음
    -> 가장 빠르고, 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화 필요

파일

  • 디스크에 저장된 데이터 or 파일 서버에서 제공한 데이터
  • 이를 기반으로 프로세스 간 통신

소켓

  • 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미
  • IP address 와 Port 넘버가 합쳐진, 네트워크 상에서 서버 프로그램과 클리어언트 프로그램이 통신을 할 수 있도록 해주는 소프트웨어 장치
  • TCP, UDP가 있음
    • TCP : 인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜
    • UDP : 데이터를 데이터그램 단위로 처리하는 프로토콜

익명 파이프

  • 프로세스 간에 FIFO(선입선출) 방식으로 읽히는 임시공간인 파이프를 기반으로 데이터 교환
  • 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
  • 부모, 자식 프로세스 간에만 사용 가능
  • 다른 네트워크상에서는 사용 불가 (한 로컬 네트워크 안에서만 사용 가능)

명명된 파이프

  • 파이프 서버와 하나 이상의 파이프 클라이어트 간의 통신을 위한, 명명된 단방향 or 이중 파이프 (읽기, 쓰기 가능)
  • 클라이언트/서버 통신을 위한 별도의 파이프 제공, 여러 파이프를 동시에 사용 가능
  • 컴퓨터의 프로세스끼리나 다른 네트워크상의 컴퓨터와도 통신 가능
  • 그림처럼 서버용 파이프와 클라이언트용을 구분해서 작동
  • 하나의 인스턴스를 열거나 여러개의 인스턴스를 기반으로 통신

메세지 큐

  • 메세지를 큐 데이터 구조 형태로 관리하는 것을 의미
  • (커널의 전역변수 형태 등) 커널에서 전역적으로 관리
  • 다른 IPC 방식에 비해, 사용 방법이 직관적이고 간단
    -> 다른 코드의 수정 없이, 코드 몇 줄 추가로 메세지 큐에 접근 가능
  • 공유 메모리를 통해 IPC 구현 시, 쓰기 및 읽기 빈도가 높으면 동기화 때문에 기능 구현 복잡해짐 -> 대안으로 메시지 큐 사용

스레드와 멀티스레딩

스레드

  • 스레드 : 프로세스의 실행 가능한 가장 작은 단위
  • 프로세스 : 여러 스레드를 가질 수 있음

  • 코드, 데이터, 힙은 스레드끼리 서로 공유, 스택 등 그 외의 영역은 각각 생성
    (프로세스는 전부 각각 생성)

멀티스레딩

  • 프로세스 내의 작업을, 여러개의 스레드(멀티 스레드)로 처리하는 기법
  • 스레드끼리 자원 공유하므로 효율성 ⬆️
    • 웹 요청 처리 시, 새 프로세스 생성 대신 스레드 사용 -> 훨씬 적은 리소스 소비
    • 한 스레드 중단 시, 다른 스레드 실행 상태일 수 있음 -> 중단되지 않은 빠른 처리 가능
  • 동시성(서로 독립적인 작업들을 작은 단위로 나누고, 동시에 실행되는 것처럼 보임)에도 장점
    • 병렬성 (실제로 동시에 작업)과 차이 : 동시성은 하나의 싱글코어가 Context Switch를 통해 여러 개의 스레드를 번갈아가며 실행하며 마치 동시에 실행하는 것처럼 보이는 형태이고, 병렬성은 멀티코어로서 물리적으로 작업을 나눠서 처리
  • 한 스레드 문제 시, 다른 스레드에도 영향을 끼쳐, 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점
  • 멀티스레드 예시 : 웹 브라우저의 렌더러 프로세스 -> 메인 스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드 존재

공유 자원과 임계 영역

공유 자원

  • 공유 자원 : 시스템 안에서 각 프로세스, 스레드가 함께 접근 가능한 모니터, 프린터, 메모리, 파일, 데이터 등의 컴퓨터 자원이나 변수
  • 경쟁 상태 : 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
    -> 동시에 접근 시도 시, 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태

임계 영역

  • 공유 자원에 접근할 때, 순서 등의 이유로 결과가 달라지는 영역을 의미
  • 해결 방법 : 뮤텍스, 세마포어, 모니터 -> 상호 배제, 한정 대기, 융통성이란 조건에 만족
    • 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때, 다른 프로세스는 들어갈 수 없음
    • 한정 대기 : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 됨
    • 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해서는 안 됨
  • 토대 메커니즘 : 잠금
    -> ex) 임계 구역이 화장실이라 치면, A 사람이 문을 잠그고 들어가기 때문에 다음 사람은 A가 나와야 화장실 사용 가능

뮤텍스

  • 공유 자원을 사용하기 전에 설정하고, 사용한 후에 해제하는 잠금
  • 잠금 설정되면, 다른 스레드는 잠긴 코드 영역에 접근 불가
  • 하나의 상태(잠금 or 잠금해제)만 가짐

세마포어

  • 일반화된 뮤텍스
  • 간단한 정수 값과 두 가지 함수 wait(P 함수) 및 signal(V 함수)로 공유 자원에 대한 접근 처리
    • wait() : 자신의 차례가 올 때까지 기다리는 함수
    • signal() : 다음 프로세스로 순서를 넘겨주는 함수

  • 프로세스가 공유 자원에 접근하면, wait() 작업을 수행
  • 프로세스가 공유 자원을 해제하면, signal() 작업을 수행
  • 세마포어에는 조건 변수가 없음
  • 세마포어 값을 수정할 때, 다른 프로세스는 동시에 세마포어 값 수정 불가
1) 바이너리 세마포어
  • 0과 1의 두 가지 값만 가질 수 있는 세마포어
  • 구현의 유사성으로 인해, 뮤텍스는 바이너리 세마포어 아님
  • 뮤텍스는 리소스에 대한 접근을 동기화하는 데 사용되는 잠금 메커니즘
    세마포어는 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘
    -> 휴대폰에서 노래를 듣다가, 전화가 오면 노래가 중지되고, 통화 처리 작업 인터페이스가 등장
2) 카운팅 세마포어
  • 여러 개의 값을 가질 수 있는 세마포어
  • 여러 자원에 대한 접근 제어에 사용

모니터

  • 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록, 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
  • 위 그림처럼, 모니터는 모니터큐를 통해, 공유 자원에 대한 작업들을 순차적으로 처리
  • 모니터는 세마포어보다 구현하기 쉬우며 상호 배제는 자동인 반면, 세마포어에서는 상호 배제를 명시적으로 구현해야하는 차이점

뮤텍스, 세마포어, 모니터 차이점

  • 뮤텍스와 세마포어 차이점
    • 뮤택스는 임계 영역에 들어가는 스레드가 하나, 세마포어는 복수 개 가능
    • 뮤택스는 우리(프로세스)가 방(자원)에 들어가려 할때, 방에 있는 사람이 열쇠를 줘야 들어갈 수 있지마느 세마포어는 열쇠는 다 가지고 있지만 사람이 방에 있으면 못들어감 -> 뮤텍스는 자원을 소유하는 개념
  • 뮤텍스와 모니터의 차이점 : 뮤텍스는 다른 프로세스 간의 동기화할 때 사용, 모니터는 하나의 프로세스 내에서 다른 스레드 간의 동기화에 사용

참고

교착 상태

  • 두 개 이상의 프로세스들이 서로 가진 자원을 기다리며 중단된 상태
  • ex) 프로세스 A가 프로세스 B의 자원을 요청할 때, B도 A의 자원을 요청하는 것

교착 상태의 원인

  • 상호 배제 : 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능
  • 점유 대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
  • 비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없음
  • 환형 대기 : 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황

교착 상태의 해결 방법

  • 1) 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계한다.
  • 2) 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘"을 쓴다.
    • 은행원 알고리즘 : 총 자원의 양과 현재 할당한 자원의 양을 기준으로, 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘
  • 3) 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지운다.
  • 4) 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 교착 상태가 발생하면 사용자가 작업을 종료합니다.
    • 현대 운영체제는 이 방법을 채택
    • 예시 : 프로세스를 실행시키다 '응답 없음'이라고 뜰 때 -> 교착 상태 발생한 경우

0개의 댓글