[CS] 프로세스와 스레드

·2025년 10월 18일
0

CS

목록 보기
16/19

💡프로세스와 스레드

프로세스와 스레드는 운영체제에서 프로그램이 실행될 때 사용되는 기본적인 단위이다.
웹 서버나 애플리케이션에서 동시에 여러 작업을 처리하려면 프로세스와 스레드에 대한 이해가 필요하다. 두 개념은 자원관리, 성능 최적화, 동시성 처리에 직접적인 영향을 주지만 관리와 자원사용 측면에서 차이점이 있다. 이 개념들을 이해하면 시스템에서 작업이 어떻게 실행되고 관리되는지 알 수 있다.


💡프로세스(Process)

✅프로세스란?

실행 중인 프로그램을 의미하며, 프로그램이 실행되면 운영체제가 메모리, CPU시간, 자원 등을 할당하여 독립적으로 실행되는 단위이다. 각각의 프로세스는 고유의 메모리 공간(코드, 데이터, 힙, 스택)을 가지고 있다.


✅프로세스의 특징

  • 독립적인 메모리 공간 : 각 프로세스는 운영체제로부터 자신만의 고유한 메모리 공간(스택, 레지스터, 데이터 등)의 자원을 할당 받아 독립적으로 실행된다. 따라서 다른 프로세스와 메모리를 공유하지 않으며, 프로세스 간에는 서로의 데이터에 접근할 수 없다. 다른 프로세스와의 상호작용이 필요할 때는 프로세스 간 통신(IPC, Inter-Process Communication)을 사용해야한다. 프로세스 간 통신은 파이프, 소켓, 공유 메모리 등의 다양한 방법이 있다.

  • 자원관리 : 프로세스는 운영체제로부터 실행에 필요한 시스템 자원(CPU, 메모리, 파일 디스크립터 등)을 할당받는다. 각 프로세스는 고유한 프로세스 ID(PID)를 통해 식별된다.

  • 무거움 : 프로세스는 각각의 독립적인 자원을 가지므로 시스템 자원을 많이 사용하며 생성 및 종료에 시간이 오래걸리며, 문맥 교환 비용이 크다.


✅프로세스의 자원 구조

하나의 프로세스는 독립적인 메모리 공간을 가지며, 크게 4가지 메모리 영역으로 나누어져 있다.

  • 코드(Code) : 프로그램의 실행 코드(기계어)
  • 데이터(Data) : 전역 변수, 정적 변수 등
  • 힙(Heap) : 런타임 중 동적으로 생성되는 객체(예시:new 연산자)
  • 스택(Stack) : 함수 호출, 지역 변수, 매개 변수 등

또한, 프로세스는 위 4가지 메모리 영역 외에도 여러 자원을 독립적으로 소유한다.

  • 파일 디스크립터 : 운영체제가 파일, 소켓, 파이프 등 I/O 자원을 식별하기 위해 부여하는 번호
  • 프로세스ID(PID) : 운영체제가 각 프로세스를 고유하게 식별하기 위해 부여하는 고유한 번호
  • PCB(프로세스 제어 블록) : 운영체제가 프로세스의 상태, 메모리 정보, CPU 레지스터 등을 저장해 프로세스를 관리하는 데 사용하는 데이터 구조로, 커널 영역에 생성된다.

코드 영역데이터 영역은 그 크기가 변하지 않아 정적 할당 영역이라고 부르며, 힙 영역스택 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역이라 동적 할당 영역이라고 부른다.


✅프로세스의 예시

  • 크롬을 두 번 실행하면 각각의 창은 독립적인 프로세스
  • IDE, 메모장, 그림판 등은 각각 별도의 프로세스로 동작함

✅프로세스의 상태

여러개의 프로세스들은 빠르게 번갈아 가면서 실행되는데, 그 과중에서 하나의 프로세스는 여러 상태를 거치며 실행된다. 그리고 운영 체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다. 프로세스가 가질 수 있는 대표적인 상태는 5가지로 나눌 수 있다.

1. 생성 상태(new)

  • 프로세스를 생성중인 상태
  • 이제 막 메모리에 적재되어 PCB를 할당받은 상태
  • 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비상태가 되어 CPU의 할당을 기다린다.

2. 준비 상태(ready)

  • 당장이라도 CPU를 할당받아 실행할 수 있지만, 자신의 차례를 기다리고 있는 상태
  • 차례가 되면 CPU를 할당받아 실행 상태가 된다.
  • 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라고 한다.

3. 실행 상태(running)

  • CPU를 할당받아 실행중인 상태
  • 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있으며, 할당된 시간을 모두 사용하면 다시 준비상태로 전환된다.
  • 실행 도중 입출력장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.

4. 대기 상태(waiting/blocked)

  • 프로세스는 실행 도중 입출력장치를 사용하는 경우가 있는데, 입출력 작업은 CPU에 비해 처리 속도가 느리다.
  • 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝날때까지 기다려야 한다.
  • 이렇게 입출력 작업을 기다리는 상태를 대기상태라고 한다.
  • 입출력 작업이 완료되면 해당 프로세스는 다시 준비 상태로 CPU 할당을 기다린다.

5. 종료 상태(terminated)

  • 프로세스가 종료된 상태
  • 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

💡스레드(Thread)

✅프로세스의 한계

과거에는 프로그램을 실행할 때 하나의 프로세스만을 사용했었다. 하지만 기술이 발전됨에 따라 프로그램이 복잡해지고 다채로워지면서 프로세스 작업 하나만을 사용해서 프로그램을 실행하기에는 한계가 있었고, 멀티 작업을 위해 여러 개의 프로세스를 만들게 되면 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다. 스레드는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생하였다.


✅스레드란?


스레드란 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이 스레드들은 프로세스의 자원을 공유하면서 동시에 실행될 수 있다.


✅스레드의 특징

  • 메모리 공유 : 스레드는 같은 프로세스 내의 메모리(코드, 데이터, 파일 등)를 공유한다. 즉, 프로세스 내에서 여러 스레드가 같은 데이터에 접근하고 수정할 수 있다. 이로 인해 스레드 간의 통신이 빠르고 효율적이지만, 동기화 문제가 발생할 수 있다.
  • 빠르고 가벼움 : 스레드는 독립적인 자원을 갖지 않기 때문에 프로세스에 비해 생성과 종료가 빠르고 자원을 적게 사용하며 문맥교환이 빠르다. 하지만 메모리를 공유하기 때문에 동시성 문제가 발생할 수 있다.
  • 독립적인 실행 흐름 : 스레드는 각자 독립적인 실행 흐름(스틱)을 가지며, 동시에 여러 작업을 수행할 수 있다. 이를 통해 CPU 활용도를 높일 수 있다.

📌Context Switching(문맥교환)


CPU가 작업A를 실행하다가 시간이 다 되어 작업B로 CPU 사용을 양보한다고 가정해보도록 하자.
이 상황에서 바로 직전까지 실행된 작업 A는 프로그램 카운터와 각종 레지스터 값, 메모리 정보 등 지금까지의 정보를 백업해야 한다. 그래야 다음 작업 차례에서 이전까지 실행했던 내용에 이어 다시 실행을 재개할 수 있으니까! 이러한 중간 정보를 문맥(Context)라고 한다.
문맥은 PCB에 저장되며, 실행 순서가 넘어갈 때마다 실행중인 작업의 문맥을 PCB에 백업하고, 새로운 작업을 실행하기 위해 문맥을 PCB에 복구하여 새로운 작업을 실행하는 것을 문맥 교환(Context Switching)이라고 한다.
문맥 교환 시 자원과 시간이 소모되며, 문맥 교환을 너무 자주 하게 되면 오버헤드가 발생할 수 있다.
스레드 간 전환은 가볍지만, 프로세스 간 전환은 무겁고 비용이 크다.


✅스레드의 자원 구조

스레드는 프로세스 내부의 실행 단위이기 때문에, 같은 프로세스 안의 여러 스레드들은 일부 자원을 공유하고, 일부는 개별로 소유한다.
스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행된다.

📍스레드 간 공유 자원

  • 코드 영역
  • 힙 영역
  • 전역/정적 변수

📍스레드 개별 소유 자원

  • 스택 영역(지역변수, 호출기록)
  • 레지스터, PC(프로그램 카운터)
  • 스레드 ID, 상태

✅스레드의 예시

  • 크롬 한 프로세스 내에서 각 탭은 별도의 스레드로 동작
  • 웹서버가 여러 요청을 처리할 때 각각의 요청을 별도의 스레드로 처리

☑️프로세스와 스레드의 차이

항목프로세스스레드
기본독립적인 실행 단위프로세스 내에서 실행되는 작업 단위
독립성각각 독립적스택만 독립적이고 그 외에는 공유
자원 할당CPU, 메모리, 파일 디스크립터 등 자원을 할당 받음프로세스의 자원을 공유함
통신 방법프로세스간 통신(IPC) 필요 -> 비효율적, 복잡공유 메모리 (효율적, 빠름)
안정성하나가 죽어도 다른 프로세스 영향 없음하나의 스레드 오류 → 전체 프로세스 영향 가능
생성 및 종료생성과 종료에 많은 자원과 시간 필요생성과 종료가 비교적 빠르고 가벼움
예시웹 브라우저, 텍스트 편집기 등 독립적인 프로그램웹 브라우저에서 여러 탭을 처리하는 스레드

💡멀티 프로세스

✅멀티 프로세스란

멀티 프로세스란 하나의 작업을 여러개의 프로세스로 나누어 동시에 실행하는 방식을 말한다.


✅멀티 프로세스의 특징

⭕멀티 프로세스의 장점

  • 메모리 침범 문제를 OS차원에서 해결가능
  • 여러 자식 프로세스 중 하나에 문제가 발생하여도 그 프로세스만 타격 -> 영향이 확산되지 않음

❗멀티 프로세스의 단점

  • Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 됨
  • 프로세스는 각각의 독립된 메모리 영역을 할당받기 때문에 프로세스 사이에서 공유하는 메모리가 없어 Context Switching이 발생하면 캐쉬에 있는 모든 데이터들을 모두 리셋하고 다시 캐쉬 정보를 불러와야 함
  • 프로세스 간의 복잡한 통신 (IPC) 가 필요함

💡멀티스레드

✅멀티 스레드란

멀티 스레드란 하나의 프로세스 안에서 여러 스레드가 동시에 실행되며 작업을 분담하는 방식이다.


✅멀티 스레드의 특징

⭕멀티 스레드의 장점

  • 메모리 공간, 시스템 자원의 효율성 증가
  • Data, Heap 영역을 이용해 데이터를 주고 받으므로 스레드간 통신이 간단함
  • context switching시 비용이 적음(교환해야 할게 적으니까) -> 시스템 처리량 향상, 프로그램 응답 시간 단축됨

❗멀티 스레드의 단점

  • 서로 다른 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있음
  • 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받음
  • 주의 깊은 설계가 필요하며 디버깅이 까다로움
profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글