CS/운영체제

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

ummchicken 2023. 1. 25. 12:59

운영체제란?

운영체제는 컴퓨터 하드웨어가 컴퓨터 소프트웨어와 통신하고 작동하도록 하는
소프트웨어 프로그램이다.

 

 

운영체제의 주목적은 무엇인가?

운영체제에는 두 가지 주요 목적이 있다.

 

  1. 컴퓨터 시스템의 계산 활동을 관리하여 컴퓨터 시스템이 제대로 작동하도록 한다.
  2. 프로그램 개발 및 실행을 위한 환경을 제공한다.

 


프로세스와 스레드의 차이 (Process vs Thread)

 

※ 참고 : 메모리 영역
코드(Code) 영역 : 프로그램 소스 코드를 저장 (프로그램 명령)
데이터(Data) 영역 : 전역변수, 정적변수, 배열 등
스택(Stack) 영역 : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
힙(Heap) 영역 : 동적 할당 시 사용 (new(), malloc() 등)

✔️ 프로그램이 CPU에 의해 실행됨 → 프로세스가 생성되고 메모리에 프로세스 주소 공간이 할당됨

✔️ 프로세스 주소 공간

더보기
프로그램이 CPU에 의해 실행됨 → 프로세스가 생성되고 메모리에 '프로세스 주소 공간'이 할당됨

 

✔️ 메모리 영역

 

1) Code (Text)

  • 우리가 작성한 소스코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역 이라고도 부른다.
  • 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
  • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다.

 

2) Data

  • 프로그램의 전역 변수정적(static) 변수가 저장되는 영역이다. 즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.
  • 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
  • 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다.
  • 초기화 된 데이터는 Data 영역에 저장되고,초기화 되지 않은 데이터는 BSS(Block Stated Symbol)영역에 저장된다.

 

3) Stack

  • 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
  • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다. 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.

 

4) Heap

  • 런타임에 크기가 결정되는 메모리 영역이다.
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 참조형의 데이터의 값이 저장된다.
  • 예를 들어 클래스가 이 부분에 해당 된다.
  • Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • HEAP과 STACK영역은 사실 같은 공간을 공유한다. HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭합니다.

 

※ 스택과 힙은 동적 할당이 되며, 동적 할당은 런타임 단계에서 메모리를 할당받는 것이다.

※ 데이터 영역과 코드 영역은 정적으로 할당되며, 정적 할당은 컴파일 단계에서 메모리를 할당하는 것이다.

 

 

 

✔️ 프로세스

  • 정의 : 컴퓨터에서 실행 중인 프로그램.

 

  • 특징
    • 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
    • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
    • 프로세스들은 독립적이기 때문에, 통신하기 위해 IPC(inter-process communication, 프로세스 간의 통신)를 사용해야 한다.
    • 프로세스는 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있다.

 

프로세스

 

 

✔️ 쓰레드

  • 정의 : 프로세스 내에서 실행되는 여러 흐름의 단위.

 

  • 특징
    • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고, 메모리 영역(Code, Data, Heap)은 공유한다.
    • 따라서 다른 쓰레드의 실행 결과를 즉시 확인할 수 있다. (∵ 자원 공유)
    • 프로세스 내에 존재하며, 프로세스가 할당받은 자원을 이용하여 실행된다.

 

멀티스레드

 

 

 

✔️ 정리

프로세스운영체제로부터 자원을 할당받는 작업의 단위이고, 
스레드프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

프로세스는 운영체제로부터 메모리, 주소 공간 등을 할당받고, 
스레드는 할당받은 자원들을 내부 스레드끼리 공유하면서 실행된다.

 

 


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

 

 

 

✔️ 멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스가 병렬적으로 작업을 수행하는 것.

 

  • 장점
    • 안정성 (메모리 침범 문제를 OS 차원에서 해결)
    • 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행

 

  • 단점
    • 각각 독립된 메모리를 갖고 있어, 작업량이 많을수록 오버헤드 발생. Context Switching으로 인한 성능 저하
    • 멀티 쓰레드보다 많은 메모리 공간과 CPU 시간을 차지

 

Context Switching이란?
- 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정

- 즉, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 
대기하고 있던 다음 순번의 프로세스가 동작하면서 
이전에 보관했던 프로세스 상태를 복구하는 과정이다.

→ 프로세스는 각 독립된 메모리 영역을 할당받아 사용되므로, 
캐시 메모리 초기화 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재함.

 

 

 

✔️ 멀티 쓰레드

하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것.

때문에 스레드들이 공유 메모리를 통해 다수의 작업을 동시헤 처리하도록 해줌.

 

  • 장점
    • 적은 메모리 공간을 차지하고 문맥 전환이 빠름.
    • 프로세스를 위해 자원을 할당하는 시스템콜이나, Context Switching의 오버헤드를 줄일 수 있음.
    • 쓰레드는 메모리를 공유하기 때문에, 통신이 쉽고 자원을 효율적으로 사용할 수 있음.

 

  • 단점
    • 하나의 쓰레드에 문제가 생기면, 전체 프로세스가 영향을 받는다. (∵ 공유 메모리를 갖기 때문)
    • 여러 쓰레드가 하나의 자원에 동시 접근하는 경우, 자원 공유(동기화)의 문제가 발생할 수 있음.
    •  교착상태를 발생시킬 수 있다.

 

 

 

✔️ 멀티 프로세스 대신 멀티 스레드를 사용하는 이유는?

프로그램을 여러 개 키는 것보다, 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.

 

1. 자원의 효율성 증대

- 스레드는 프로세스 내의 메모리를 공유하기 때문에 

독립적인 프로세스와 달리 스레드 간 데이터를 주고받는 것이 간단해지고, 

시스템 자원 소모가 줄어들게 된다.

 

- 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 

프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.

(프로세스 간의 Context Switching 시, 단순히 CPU 레지스터 교체 뿐만 아니라 

RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화 되므로 오버헤드가 크기 때문)

 

 

2. 처리 비용 감소 및 응답 시간 단축

- 프로세스 간의 통신(IPC)보다 스레드 간의 통신 비용이 적으므로, 

작업들 간의 통신의 부담이 줄어든다.

(스레드는 Stack 영역을 제외한 모든 메모리를 공유하기 때문)

 

- 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

(Context Switching 시, 스레드는 Stack 영역만 처리하기 때문)

 

 

 

 

 


출처