프로세스와 스레드

ideafy·2025년 8월 27일

CS

목록 보기
12/17

프로세스

컴퓨터에서 실제로 동작되고 있는 프로그램.

프로세스의 자원구조

프로그램이 실행돼 프로세스가 만들어지면 OS로부터 Code, Data, Heap, Stack. 4가지 메모리 영역을 할당받는다.

  • Code 영역
    프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장돼 있다.
  • Data 영역
    코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다. Data 영역은 .data, . rodata, .bss 영역으로 세분화 된다.
  • Heap 영역
    생성자, 인스턴스와 같이 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • Stack 영역
    지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. Stack은 함수의 호출과 함께 할당되고, 함수의 호출이 완료되면 소멸한다.

Code 영역과 Data 영역은 선언할 때 그 크기가 결정되는 정적 영역이지만, Stack 영역과 Heap 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역이다.

기본적으로 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.

스레드

프로세스가 할당 받은 자원을 이용하는 실행의 단위.
스레드들끼리는 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능하다. 그래서 하나의 프로세스에 여러개의 스레드가 들어있다.

프로세스의 4가지 메모리 영역 중 스레드는 Stack만 할당받아 복사하고 Code, Data, Heap은 프로세스 내의 다른 스레드들과 공유된다.

스레드가 독립적인 Stack 영역을 가진다는 것은 독립적인 함수 호출이 가능하다는 의미이고 이는 독립적인 실행 흐름이 추가된다는 것이다.
즉, Stack을 가짐으로써 스레드는 독립적인 실행흐름을 가질 수 있게 된다.

이렇게 구성된 이유는 하나의 프로세스를 다수의 실행단위인 스레드로 구분해 자원을 공유하고, 자원의 생성과 관리의 중복을 최소화하여 수행 능력을 올리기 위해서이다.

프로세스의 자원 공유

기본적으로 각 프로세스는 메모리에 별도의 주소 공간에서 실행되기 때문에, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
하지만 특별한 방법을 통해 프로세스 간 정보를 공유하는 다음과 같은 방법이 있다.
1. IPC(Inter-Process Communication) 사용
2. LPC(Local inter-Process Communication) 사용
3. 별도의 공유 메모리를 만들어 정보를 주고 받도록 설정

하지만 프로세스 자원 공유는 단순히 CPU 레지스터 교체뿐만 아니라 RAM과 CPU 사이의 메모리까지 초기화되기 때문에 자원부담이 크다는 단점이 있다. 그래서 다중 작업이 필요한 경우 스레드를 이용하는 것이 훨씬 효율적이라, 다중 스레딩을 기본으로 하고 있다.

프로세스 & 스레드의 생명주기

프로세스와 스레드는 각각의 생명주기를 갖고 있으며, 운영체제는 이러한 생명주기를 관리하고 프로세스와 스레드를 조정하여 시스템 자원을 효율적으로 사용할 수 있게 된다.

프로세스 스케줄링

프로세스 스케줄링은 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업을 말한다. 프로세스 스케줄링은 프로세스의 우선순위, 작업량 등을 고려해 효율적으로 배치하여 운영체제는 CPU를 효율적으로 사용하며 시스템의 전반적인 성능을 향상시킨다.
스케줄링은 멀티 태스킹 작업을 만드는데 있어 핵심적인 부분이다.

스케줄링은 운영체제의 특징과 시스템 요구사항에 따라 다양한 알고리즘 방식으로 동작된다. 대표적인 알고리즘의 종류는 FCFS, SJF, Priority, RR, Multilevel Queue 등이 있다.

프로세스 상태

  • 생성 (new)
    프로세스가 생성되고 아직 준비되지 않은 상태
  • 준비 (ready)
    프로세스가 실행을 위해 기다리는 상태
    CPU를 할당 받을 수 있는 상태이며, 언제든지 실행될 준비가 돼있다.
  • 실행 (running)
    프로세스가 CPU를 할당 받아 실행되는 상태
  • 대기 (waiting)
    프로세스가 특정 이벤트 (입출력 요청 등)가 발생해 대기하는 상태
    CPU를 할당받지 못하며, 이벤트가 발생하여 다시 ready 상태로 전환될 때까지 대기한다.
  • 종료 (terminated)
    프로세스가 실행을 완료하고 종료된 상태
    더 이상 실행될 수 없으며, 메모리에서 제거된다.

스레드 스케줄링

스레드의 우선순위, 실행시간, 입출력 요청 등의 정보를 고려해 CPU를 사용할 수 있는 스레드를 선택하는 스트레 스케줄링 알고리즘은 프로세스 스케줄링 알고리즘과 유사하게 동작한다.
대표적으로는 Round Robin, Priority-based scheduling, Multi-level Queue scheduling 등이 있다.

다만 스레드 스케줄링은 프로세스 스케줄링과 다르게, 하나의 프로세스 내에서 다수의 스레드가 동작하는 형태이기 때문에 스레드 간 상호작용과 동기화 문제를 고려해야 한다는 차이점이 존재한다.

그러니까 프로세스 끼리는 자원을 공유하지 않기 때문에 문제가 없지만, 스레드는 stack을 제외한 자원을 한 프로세스 내에서 공유하면서 발생할 수 있는 데이터 불일치 문제에 대해 신경써야한다.

스레드 상태

  • new
    스레드가 생성되고 아직 호출되지 않은 상태
  • runnable
    스레드가 실행되기 위해 기다리는 상태
    CPU를 할당 받을 수 있는 상태, 언제든 실행될 준비가 돼있다.
  • blocked
    스레드가 특정 이벤트(입출력 요청 등)가 발생해 대기하는 상태
    CPU를 할당받지 못하며, 이벤트가 밸생하여 다시 runnable 상태로 전환될 때까지 대기한다.
  • terminated
    스레드가 실행을 완료하고 종료된 상태
    더 이상 실행될 수 없으며, 메모리에서 제거된다.

참고
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

profile
재밌게 공부하고 싶어요

0개의 댓글