본문 바로가기

CS/운영체제

[운영체제] Program vs Process vs Thread

반응형

Program

어떤 작업을 위해 실행할 수 있는 정적인 파일

ex) file system 의 .exe file


Process

메모리에 올라와 CPU를 할당받아 실행중인 동적인 프로그램

 

Process의 특징

프로세스는 각각 code, data, stack, heap의 구조로 되어있는 독립된 메모리 영역을 할당 받는다.

각 프로세스는 별도의 주소 공간에서 실행되어 메모리 공간을 공유할 수 없다.

따라서 다른 프로세스의 자원에 접근하려면 프로세스간 통신(IPC)을 사용해야한다.

또한 프로세스는 최소 하나 이상의 Thread를 포함한다.

 

각 영역은 다음과 같은 역할을 한다.

 

  • code(text) : 실행할 프로그램의 코드가 저장. CPU는 이 영역에서 명령어를 하나씩 가져와 처리한다.
  • data : 전역 변수와 정적 변수 가 저장. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸된다.
  • heap : 동적 데이터 영역으로 메모리 주소 값에 의해서만 참조되고 사용하는 영역. 따라서 런타임 시 크기가 결정된다.
  • stack : 지역 변수, 매개변수, 리턴값, return address 등 잠시 사용되었다가 사라지는 데이터를 저장. 함수 호출 시 할당되고 함수 반환 시 소멸된다.

code, data 영역은 컴파일 시 크기가 결정되고,

heap, stack 영역은 런타임 시 크기가 결정된다

 

 

 

heap, stack은 같은 공간을 공유해 화살표 방향처럼 heap은 낮은 주소부터 할당되고, stack은 높은 주소부터 할당된다.

각 영역이 상대 공간을 침범하게 될 때 이를 heap overflow, stack overflow 라고 한다.


Thread

프로세스 내에서 프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위

 

Thread들은 같은 프로세스 안에서 실행되므로 code, data, heap은 공유하지만,

별도의 레지스터와 스택을 갖고 있다.

 

왜 별도의 레지스터와 스택을 갖고 있을까?

각 Thread는 각각의 실행 시퀀스/코드를 가질 수 있다.

따라서 함수가 호출되고 반환될 때 각각의 Program Counter를 push/pop 해야하기 때문이다.

즉 Thread 사이의 보호를 위해 구분한다.

 

 

Process vs Thread

  Process Thread
생성/종료 시간 오래 걸림 덜 걸림
컨텍스트 전환 시간 오래 걸림 덜 걸림
커뮤니케이션 측면 비효율적 효율적
리소스 측면 비효율적 효율적
전환 운영 체제의 인터페이스 사용 운영체제 호출 필요 없음
용어 heavy-weight process light-weight process

멀티 프로세스 vs 멀티 스레드

멀티 프로세스 

하나의 응용프로그램을 두개 이상의 프로세스로 구성하여 각 프로세스가 하나의 작업을 목표로 작업을 처리

 

ex) 크롬 브라우저의 각 탭

      한 프로세스가 비정상 종료되어도 다른 프로세스에 영향이 없도록 하는 경우 사용

장점

  • 하나의 프로세스가 비정상 종료되어도 다른 프로세스가 영향을 받지 않음
  • 멀티 스레드처럼 동기화 작업이 별도로 필요하지 않음

단점

  • 자원 소모, 메모리 낭비, 문맥교환으로 인한 비효율성
  • IPC 통신으로 인한 비용 발생

 

멀티 스레드

하나의 프로세스에 여러 스레드로 자원을 공유하여 작업을 나누어 수행

스레드들은 heap, data, code 영역을 공유하고, stack과 register 만 각각 할당됨

 

ex) 워드 프로세스와 같은 응용 소프트웨어

      여러 기능과 메모리를 공유하는 경우 사용

장점

  • 스택 영역만 문맥교환이 일어나 멀티 프로세스에 비해 문맥교환 시간이 적음
  • 자원을 공유하기 때문에 메모리 낭비가 적음

단점

  • 하나의 스레드 장애로 전체 스레드가 종료될 위험 존재
  • 전역 변수를 통해 스레드 간 자원 공유가 이루어져 동기화 문제 (병목현상, 데드락) 발생 가능

 

따라서 메모리 측면에서 보았을 때 code, data, heap 영역을 공유하는 Thread 가 메모리 낭비가 적으며

문맥교환 측면에서 보았을 때도 stack 영역만 문맥교환이 일어나기 때문에 효율적이다.

 

프로세스 문맥교환이 일어났을 경우, 공유하는 데이터가 없기 때문에 새로 캐시정보를 쌓아야한다.

하지만 스레드는 공유하는 데이터가 있기 때문에 문맥교환이 일어나도 캐시 적중이 발생하기에 속도면에서 유리하다.

 

 

멀티 프로세스는 병렬 형식(Parallelism), 멀티 스레드는 동시성 형식(Concurrency) 이다

 

 


멀티 프로세스보다 멀티 스레드를 지향하는 이유

  • 자원의 효율성 증대
  • 응답 시간 단축 및 처리 비용 감소

하지만 여러개의 스레드가 동일한 데이터 공간(Critical Section)을 공유하며 수정한다는 점에서

안정성 측면의 문제가 존재한다

 


 

reference

https://www.charlezz.com/?p=44590

https://www.youtube.com/watch?v=RrfASw-jfZ4

https://zangzangs.tistory.com/109?category=458016

반응형

'CS > 운영체제' 카테고리의 다른 글

Blocking vs Non-blocking / Sync vs Async  (0) 2023.03.14
[운영체제] Context Switching  (0) 2021.10.29