[CS - 운영체제] 프로세스와 스레드의 차이는?

Jo HangJoon·2022년 9월 21일
0

CS 공부

목록 보기
1/17
post-thumbnail

질문의 핵심

  1. 운영체제에서 작업을 실행할 때, 자원을 할당하는 단위를 알고 있는지
  2. 멀티 스레드를 구현하는 것의 장단점을 알고 있는지
  3. 스레드 간 통신과 비교하여 프로세스 간 통신에 IPC 설비가 필요한 이유는?
  4. 프로세스 주소 공간을 영역으로 나눈 이유는?
  5. Stack 영역과 Data 영역을 나눈 이유는?
  6. IPC의 예시 모델은? 그 모델의 장단점은?

1. 프로세스와 스레드

프로세스(Process)란

  • 운영체제로부터 자원을 할당받는 단위.
  • 컴퓨터에서 하나 이상의 Thread로 실행되는 인스턴스.
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스.
  • 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것.
  • 실행되는 프로그램 자체와 프로그램이 실행되는 주변 환경을 포함하는 개념.

프로세스는 실행될 때 운영체제로부터 파일, 데이터, 메모리 주소 공간 등을 할당받는다. 프로세스는 각각 독립된 메모리 영역을 할당받기 때문에 다른 프로세스의 자원에 접근할 수 없다. 다른 프로세스의 자원에 접근하기 위해서는 IPC(Inter-Process Communication)를 사용해야 한다.

프로세스의 상태

  • New - 프로세스가 생성되는 도중의 상태.
  • Ready - 프로세스가 생성된 후, 프로세서(Processor)에 할당되기를 기다리는 상태.
  • Running - 프로세서에 할당된 후, 명령이 실행되는 상태.
  • Wait - 프로세스가 특정 이벤트(I/O 완료, 특정 신호 수신 등)를 기다리는 상태.
  • Terminated - 프로세스가 종료된 상태.

프로세스 주소 공간(Process Address Space)

  • 프로그램이 실행되면 프로세스 주소 공간이 메모리에 할당된다.
  • 프로세스 주소 공간은 각 구역으로 나뉘어져 있는데 데이터를 최대한 공유하여 메모리 사용량을 줄이기 위해서이다.

Stack 영역

  • 프로그램이 자동으로 실행하는 영역.
  • 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수 등)를 임시로 저장하는 공간.
  • 메모리의 높은 주소에서 낮은 주소 방향으로 할당됨.
  • LIFO 방식.

Heap 영역

  • 프로그래머가 필요할 때마다 사용하는 동적 메모리 영역.
  • 런타임에 크기가 결정됨.
  • 메모리 주소 값에 의해서만 참조되고 사용됨.
  • 메모리의 낮은 주소에서 높은 주소 방향으로 할당됨.
  • 스택과 같은 공간을 공유함. 상대 공간을 침범하면 각각 Stack Overflow, Heap Overflow 오류 발생.

Data 영역

  • 전역변수, 정적변수, 배열과 같은 구조체 등이 저장되는 공간.
  • 초기화되지 않은 데이터가 저장되는 BSS 영역, 초기화된 데이터가 저장되는 GVAR 영역으로 나뉨.

Text(Code) 영역

  • 코드가 저장되는 공간.
  • CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되어 있음.
  • Read-Only로 되어 있음.

PCB(Process Control Block)

프로세스의 현재 상태를 저장하는 데이터 구조체.

  • PCB에는 다음과 같은 정보들이 저장된다.
    • Process ID(PID): 프로세스 고유 번호.
    • Process State: 프로세스 상태.
    • Program Counter: 다음 Instruction의 주소를 저장하는 카운터.
    • CPU Register: CPU에서 사용한 레지스터 값.
    • CPU Scheduling Information: 프로세스 우선순위, 최종 실행시간, CPU 점유시간 등.
    • Memoery Information: 프로세스 주소공간 정보 저장.
    • Process Information: 페이지 테이블, 스케쥴링 큐 포인터 등.
    • Device I/O Status: 프로세스에 할당된 입출력 장치 목록 등.
    • Pointer: 부모/자식 프로세스에 대한 포인터, 자원에 대한 포인터 등.
    • Open File List: 프로세스를 위해 열려있는 파일 리스트.
  • 프로세스 생성 시 만들어지며 주기억장치(커널 영역)에 유지되고, 프로세스가 완료되면 제거된다.
  • PCB는 다른 프로세스들이 쉽게 접근할 수 없다.
  • Context Switching 에서 사용된다.

Context Switching(문맥교환)

CPU가 현재 작업 중인 프로세스에서 다른 프로세스로 넘어갈 때(ex. 인터럽트), 지금까지의 프로세스 상태를 저장하고 새 프로세스의 저장된 상태를 다시 적재하는 작업.

Context Switching은 다음과 같은 경우에 발생한다.

  • 인터럽트 발생
  • 실행 중인 프로세스가 CPU 사용 시간 전부 소모
  • I/O 입출력을 위해 대기

Context Switching 과정은 시간과 메모리가 소요되므로 Overhead가 발생하는 과정이다.

IPC(Inter-Process Communication)

프로세스간 통신을 위한 메커니즘

IPC는 커널 영역(메모리에 상주하는 운영체제의 핵심적인 부분)에서 제공된다. 크게 공유 메모리(Shared Memory)와 메시지 전달(Message Passing), 두 가지 모델이 있다.

공유 메모리(Shared Memory)

  • 프로세스끼리 특정 공통의 메모리 영역을 공유하며 상호간 통신하는 방법이다.
  • 데이터 자체를 공유하도록 지원하며, 한 프로세스에서 변경(Write)한 메모리 공간의 내용을 다른 프로세스에서 접근(Read)할 수 있다.
  • 커널의 관여없이 메모리를 직접 사용하여 IPC 속도가 빠르다.
  • 프로그램 레벨에서 통신 기능을 제공하여, 자유로운 통신이 가능하다.
  • 별도의 동기화 기술이 필요하다.
  • 동시에 같은 메모리 위치를 접근할 수도 있다.

메시지 전달(Message Passing)

  • 커널이 제공하는 API를 이용해서 커널 공간을 통해 통신한다.
  • 별도의 동기화 로직이 없어도 된다.
  • 공유 메모리 모델보다 느리다.
  • 다음 종류가 있다.
    • Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시하여 메시지를 직접 전달하는 방식. 대부분 양방향으로 구성됨.
    • Indirect Communication: mailbox(or port)를 통해 메시지를 간접 전달하는 방식. 다:다 관계가 가능함.
  • 다음 예시가 있다.
    • 파이프: 두 개의 프로세스를 연결하여 하나의 프로세스는 쓰기만, 하나의 프로세스는 읽기만 하는 모델. 1:1 통신이면서 단방향 통신. 용량 제한이 있음. 스트림 기반 동작.
    • 메시지 큐: FIFO 자료 구조. 양방향 통신. 메시지(or 패킷) 단위로 동작. 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음. 오버헤드 발생 가능.
    • 소켓: 양 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고 받는 방식. 네트워크 통신 기법으로 많이 사용되는 방법. 로컬과 원격에서 사용 가능. 양방향 통신.

스레드(Thread)란

  • 프로세스 내에서 할당받은 자원을 이용해 동작하는 실행 단위.
  • 프로세스 내에서 동작되는 여러 실행의 흐름.
  • 프로세스 내부에서 프로세스의 자원을 공유하거나 공유하지 않고 실행되는 작업의 단위.

스레드는 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에서 스레드끼리 공유하면서 실행된다. 각각의 스레드는 별도의 Register와 Stack을 갖고 있지만 Code, Data, Heap은 공유한다. 따라서 똑같은 공간을 여러개 만들지 않고 메모리를 절약할 수 있다.

스레드의 구성

  • Program Counter
  • Register Space
  • Stack Space

2. 멀티프로세스와 멀티스레드

멀티 프로세스(Multi-Process)란

하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 task를 처리하도록 하는 것.

멀티 프로세싱을 하면 어떤 프로세스가 잘못 되어도 다른 프로세스는 계속 실행되기 때문에 프로그램은 계속 동작한다는 장점이 있다. 하지만 Context Switching을 위한 Overhead가 발생하고 프로세스간의 통신을 위한 IPC를 사용해야 하는 단점이 있다.

  • Context Switching이란 Interrupt를 발생시켜 CPU에서 실행중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정을 말한다. 현재 실행중인 프로세스의 상태(Context)를 미리 저장한 후, 다음 프로세스를 동작시켜 task를 처리한 후에, 이전에 저장한 프로세스의 상태를 다시 복구한다. 현재 프로세스 내에 캐시에 있는 데이터를 모두 리셋하고 다시 캐시 정보를 불러와야 한다.

멀티 스레드(Multi-Thread)란

하나의 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 task를 처리하도록 하는 것.

스레드는 스레드끼리 메모리 및 자원을 공유하기 때문에 프로세스를 위해 자원을 할당하는 System Call이 줄어들어 자원을 효율적으로 사용할 수 있다. 또, 프로세스 간의 통신보다 스레드 간의 통신의 비용이 적으므로 통신의 부담이 줄어들게 된다. 즉, 멀티 스레딩은 멀티 프로세싱보다 메모리 공간과 시스템 자원 소모가 줄어든다. 하지만 하나의 스레드가 문제가 생기면 전체 프로세스에 영향이 가고, 여러 스레드가 하나의 자원에 접근하면 자원 공유(동기화)의 문제가 발생할 수 있는 단점이 있다. 많은 운영체제들이 멀티 스레딩을 기본으로 하고 있으며 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.


참조

0개의 댓글