[운영체제]프로세스 & 스레드

이재민·2024년 1월 1일

운영체제

목록 보기
1/3

프로그램

프로그램이란 윈도우의 .exe파일이나 mac의 .dmg 파일과 같은 컴퓨터에서 실행 할 수 있는 파일을 말합니다.
컴퓨터에서 실행할 수 있는 명령어들의 집합 즉, 코드 덩어리라고 말할 수 있습니다.

프로세스

프로세스는 컴퓨터에서 실행중인 프로그램을 말합니다.
모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 합니다.
운영체제로부터 CPU를 할당받아 프로그램이 실행되고 있는 상태입니다.

단일 프로세스 시스템

한 번에 하나의 프로그램만 실행됩니다.
프로세스가 I/O 작업이 이뤄진다면 해당 작업이 완료될때까지 CPU는 노는 시간이 증가하기에 사용률이 좋지 않습니다.

멀티 프로그래밍

단일 프로세스 시스템의 단점을 해결하기 위해 멀티 프로그래밍이 등장을 하였습니다.
여러개의 프로그램을 메모리에 올려놓고 동시에 실행을 합니다.
I/O 작업이 발생하면 다른 프로세스가 CPU를 할당받아 작업을 수행하게 됩니다.
다만 특정 프로세스의 CPU 점유 시간이 길어진다면 다른 프로세스는 대기를 해야 합니다.

멀티 태스킹

멀티 프로그래밍이 갖고 있는 단점을 극복하기 위한 해결책으로 멀티 태스킹이 등장을 하였습니다.
프로세스는 한 번 CPU를 이용할 때 아주 짧은 시간(quantum)만 CPU에서 실행되도록 합니다.

  • 멀티 태스킹은 프로세스의 응답 시간을 최소화 시키는데 목적을 가지고 있습니다.
  • 그러나, 하나의 프로세스가 동시에 여러 작업을 수행하지는 못합니다. -> 각 프로세스 작업을 쪼개서 진행하는 것입니다.
  • 프로세스의 Context Switching은 무거운 작업입니다.
  • 프로세스의 데이터 공유가 까다롭습니다. 또한 듀얼 코어를 효과적으로 사용할 수 없습니다.

멀티 프로세싱

두 개 이상의 프로세서나 코어를 활용하는 시스템입니다.

멀티 프로세스 vs 멀티 프로세서
프로세스(process)는 프로그램의 실행 상태를 말하고, 프로세서(processer)는 CPU 코어를 말합니다. 단어는 유사하나 의미는 완전히 다릅니다.
멀티 프로세스는 하나의 프로그램에서 여러 개의 프로세스를 실행하는 것을 의미하고, 멀티 프로세서는 여러 개의 CPU 코어가 하나의 시스템에서 동시에 실행되는 것을 의미합니다.

스레드

스레드는 프로세스의 한계(아쉬움)를 해결하기 위해 탄생하였습니다.

  • 하나의 프로세스는 한 개 이상의 스레드를 가집니다.
  • CPU에서 실행되는 단위(Unit of execution)라고 표현할 수 있습니다.
  • 같은 프로세스의 스레드들끼리는 Context Switching 작업이 가볍습니다.
  • 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유합니다.

프로세스 & 스레드의 메모리

프로세스의 자원 구조

  • 코드 영역
    • 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있습니다.
  • 데이터 영역
    • 코드가 실행되면서 사용하는 전역 변수나 데이터가 모여있습니다.
      .data: 전역 변수 또는 static 변수
      .BSS: 초기값 없는 전역 변수, static 변수 저장
      .rodata: const같은 상수 키워드 선얻뇌 변수나 문자열 상수가 저장
  • 스택 영역
    • Stack은 함수 호출과 함께 할당되며 함수의 호출이 완료되면 소멸합니다. 만약 Stack 영역을 초과하면 stack overflow 에러가 발생합니다.
  • 힙 영역
    • 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들이 존재하는 공간입니다.

스레드의 자원 구조

스레드는 프로세스가 할당 받은 자원을 이용하는 실행 단위입니다.
이때 프로세스의 4가지 메모리 영역 중 스레드는 stack만 할당받아 복사하고 Code, Data, Heap은 프로세스내의 다른 스레드들과 공유합니다.

멀티 스레드

멀티 스레드는 하나의 프로세스 안에 여러개의 스레드가 존재하는 것을 말합니다. 따라서 하나의 프로그램에서 두 가지 이상의 동작을 동시에 처리가 가능합니다.

멀티 스레드의 장점

  1. 프로세스보다 가볍다
    스레드는 프로세스 내에서 생성되기 때문에 스레드 실행 환경을 설정하는 작업이 간단하다.
    프로세스와 달리 Code, Data, Stack 영역을 제외한 나머지 자원을 서로 공유하기에 프로세스보다 가볍다.

  2. 자원의 효율성
    멀티 스레드는 Heap 영역과 같은 공유 메모리에 대해 스레드 간에 자원을 공유할 수 있다. 이응 통해 프로세스 간 통신(IPC)을 사용하지 않고도 데이터를 공유할 수 있기 때문에 자원의 효율적인 화용이 가능하다.

  3. Context Switching 비용 감소
    스레드에도 컨텍스트 스위칭 오버헤드가 존재하지만, 프로세스 컨텍스트 스위칭 오버헤드보다 훨씬 낮은 비용을 갖고 있다.
    프로세스 컨텍스트 스위칭 비용은 스위칭할 때마다 CPU 캐시에 있는 내용을 모두 초기화하고, 새로운 프로세스 정보를 CPU 캐시에 적재해야 하므로 높은 비용이 든다.
    반면에 스레드 컨텍스트 스위칭 비용은 스위칭할때 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만 교체하면 되기에 저렴하다.

  4. 응답 시간 단축
    멀티 프로세서 환경에서 멀티 스레드를 사용하여 작업을 처리하는 것이 멀티 스레드를 사용하는 것보다 더 효율적이다.

멀티 스레드의 단점

  1. 안정성 문제
    멀티 프로세스 모델은 각 프로세스가 독립적으로 동작하므로 하나의 프로세스가 죽어도 다른 프로세스에는 문제를 주지 않습니다.
    하지만, 멀티 스레드는 하나의 스레드에 문제가 발생한다면 전체 프로그램이 종료될 수 있습니다.
    그래서 이를 프로그래머가 적절한 예외 처리를 통해 프로그램 종료를 방지할 수 있습니다.

  2. 동기화로 인한 성능 저하
    멀티 스레드 모델은 여러 개의 스레드가 공유 자원에 동시에 접근할 수 있기 때문에 동기화 문제가 발생할 수 있습니다.
    따라서 스레드 간 동기화(Synchronized)는 데이터 접근을 제어하기 위해 필수적인 기술입니다.
    하지만 동기화 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하될 가능서잉 높다는 단점이 있습니다.
    이를 해결하기 위해 임계 영역(Critical Section)에 대하여 뮤텍스(Mutex) 또는 세마포어(Semaphore) 방식을 활용합니다.

임계영역(Critical Section)
멀티 스레드 프로그래밍에서 임계 영역은 공유 자원을 접근하는 코드 영역을 말합니다.대표적으로 전역 변수나 heap 메모리 영역을 말할 수 있습니다.

뮤텍스(Mutex)
공유 자원에 대한 접근을 제어하기 위한 상호 배제 기법 중 하나로, 임계 영역에 진입하기 전에 락을 획득하고, 임계 영역을 빠져나올 때 락을 해제하여 다른 스레드들이 접근할 수 있도록 합니다.
오직 1개의 ㅡ레드만이 공유 자원에 접근할 수 있도록 제어하는 기법입니다.

세마포어(Semaphore)
세마포어는 동시에 접근 가능한 스레드의 개수를 지정할 수 있습니다.
세마포어의 값이 1이면 뮤텍스와 동일한 역할을 하고, 값이 2 이상이면 동시에 접근 가능한 스레드의 수를 제어할 수 있습니다.
스레드가 임계 영역에 진입하기 전에 세마포어 값을 확인하고 값이 허용된 범위 내에 있을 때만 락을 획득할 수 있는 방식입니다.

  1. 데드락(교착 상태)
    데드락이란 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 상태를 말합니다.

  2. 컨텍스트 스위칭 오버헤드
    멀티 스레드 컨텍스트 스위칭 비용이 멀티 프로세스 컨텍스트 스위칭 비용보다는 저렴하다고 했지만, 스레드 수가 많을 수록 그만큼 컨텍스트 스위칭이 많이 발생되고 성능 저하로 이어진다.
    스레드가 많으면 많을 수록 성능이 좋아지지는 않다.

profile
문제 해결과 개선 과제를 수행하며 성장을 추구하는 것을 좋아합니다.

0개의 댓글