Home 프로세스와 쓰레드
Post
Cancel

프로세스와 쓰레드

프로세스와 쓰레드의 차이

  • 프로세스
    • 컴퓨터의 메모리에 올라와 실행되고 있는 프로그램.
    • task와 같은 의미로 쓰인다.
  • 쓰레드
    • 프로세스 내 작업의 흐름을 지칭한다.

하나의 쓰레드로 이루어진 싱글 쓰레드 프로세스, 여러 개의 쓰레드로 이루어진 멀티 쓰레드 프로세스로 나뉜다.

차이

  • 메모리 영역의 차이
    • 프로세스는 코드, 데이터, 스택, 힙 메모리 영역을 기반으로 작업한다.
      • 코드, 데이터, 스택, 힙 메모리를 프로세스마다 생성.
    • 쓰레드는 프로세스 내의 스택 메모리를 제외한 다른 메모리 영역을 프로세스 내의 다른 쓰레드들과 공유한다.
      • 각각 생성하지 않고 공유해 사용하여 메모리에 이점이 있다.
  • 각각의 격리.
    • 프로세스는 다른 프로세스와 격리되어 있다.
    • 쓰레드는 서로 격리되어 있지 않다.
    • 따라서 각각 서로 통신하려면 프로세스는 IPC를 사용해야하고, 쓰레드는 그냥 통신할 수 있으므로 프로세스보다 더 빠르다.
  • 격리에 의한 영향.
    • 프로세스는 격리되어 있어 다른 프로세스에 영향을 미치지 못한다.
    • 쓰레드는 격리되어 있지 않아 한 쓰레드에 문제가 생기면 다른 쓰레드에 영향을 끼칠 수 있다.
  • 생성과 종료 시간차이
    • 프로세스가 생성과 종료에 더 많은 시간이 든다.
    • 쓰레드는 비교적 더 적은 시간이 든다.

프로그램의 컴파일 과정

프로그램은 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 된 것을 의미한다.

  • 전처리
    • 소스코드의 주석 제거, #include 등 헤더파일을 병합하고 매크로를 치환.
  • 컴파일러
    • 오류처리, 코드최적화 작업을 하여 어셈블리어로 변환.
  • 어셈블러
    • 어셈블리어를 목적코드로 변환한다.
  • 링커
    • 프로그램 내 있는 라이브러리 함수 등과 결합해 실행파일이 만들어진다.

프로세스의 메모리 구조

운영체제는 프로세스에 아래와 같은 구조로 적절한 메모리를 할당한다.

위에서부터 스택, 힙, 데이터 영역(Data Segment, BSS Segment), 코드 영역으로 나뉜다.

  • 스택 - 지역변수, 매개변수, 함수가 저장되고 컴파일 시 크기가 결정된다.
    • 함수가 함수를 호출하는 등에 따라 런타임시에도 크기가 변경될 수 있다.
  • 힙 - 동적할당 시 사용되며 런타임 시 크기가 결정된다.
  • 데이터영역 - BSS 영역과 Data 영역으로 나뉘고 정적할당에 관한 부분을 담당한다.
  • 코드영역 - 소스코드가 들어간다. (정적인 특징)

정적할당

컴파일 단계에서 메모리를 할당하는 것을 말한다.

  • BSS segment
    • 전역변수, static, const로 선언되어 있는 변수 중 0으로 초기화 또는 초기화가 어떠한 값으로도 되어있지 않은 변수들이 이 메모리 영역에 할당된다.
  • Data segment
    • 전역변수, static, const로 선언되어 있는 변수 중 0이 아닌 값으로 초기화된 변수가 이 메모리 영역에 할당된다.
  • Code/Text segment
    • 프로그램의 코드가 들어간다.

동적 할당

런타임 단계에서 메모리를 할당받는 것이며 스택과 힙으로 나뉜다.

  • Stack
    • 지역변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역
    • 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 stack에 계속 저장된다.
    • 재귀함수가 호출된다고 하면 새로운 스택 프레임이 매번 사용되기 때문에 함수 내 변수 집합이 해당 함수의 다른 인스턴스 변수를 방해하지 않는다.
  • Heap
    • 동적으로 할당되는 변수들을 담는다.

PCB (Process Control Block)

운영체제에서 관리하는 프로세스에 대한 메타 데이터를 저장한 데이터 블록이다. 커널 스택에 저장(안전한 저장)되며 각 프로세스가 생성될 때 마다 고유의 PCB가 생성되고 프로세스가 종료되면 PCB는 제거된다.

메타 데이터

데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터.

대량의 정보 가운데 찾고 있는 정보를 효율적으로 찾아내기 위해 부여되는 데이터.

커널 스택

가상 메모리의 사용자 공간과 커널공간은 모두 스택 자료구조를 기반으로 관리된다하여 사용자 스택, 커널 스택이라고도 불린다.

PCB의 구조

구조는 이보다 더 복잡하지만 중요한 부분만 본다.

  • Process State : 대기 중, 실행 중 등 프로세스의 상태
  • Process Number(PID) : 각 프로세스의 고유 식별 번호(프로세스 ID)
  • Program Counter : 해당 프로세스에 대해 실행될 다음 명령의 주소에 대한 포인터.
  • Registers : 레지스터 관련 정보
  • Memory Limits : 프로세스의 메모리 관련 정보
  • List of Open Files : 프로세스를 위해 열린 파일 목록

컨텍스트 스위칭 (context switching)

PCB를 기반으로 프로세스의 상태를 저장하고 다시 복원시키는 과정.

컨텍스트 스위칭은 쓰레드도 가능하다.

프로세스 기준으로 프로세스가 종료되거나 인터럽트에 의해 발생된다.

  • 프로세스 1이 실행되고 있다.
  • 인터럽트나 시스템 콜이 발생했다.
  • 프로세스 1의 PCB1을 save한다.
  • 프로세스 2의 PCB2를 불러온다. 이것을 기반으로 프로세스 2를 실행한다.
  • 다시 인터럽트나 시스템콜이 발생하면 프로세스 2가 잠깐 실행됐던 부분을 PCB2에 저장한다.
  • 그리고 다시 PCB1을 불러온다. 프로세스1에 대한 작업을 CPU가 실행하게 된다.

컨텍스트 스위칭의 비용

Idle time (유후시간)

  1. 유후시간의 발생 : 컨텍스트 스위칭을 할 때 마다 유후시간이 생겨 CPU의 가용성이 떨어지는 비용이 발생한다. 즉 CPU의 쉬는 시간이 발생한다.
  2. 캐시미스 : 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 메모리 주소 변환이 생기므로 캐시 클리어 과정이 무조건 일어나게 되고 이 때문에 캐시미스가 발생한다.

(위의 예시로 보면 p1을 계속 쓰면 캐시되어있는 것을 그대로 써도 되지만 p2로 변환하기 위해 캐시 클리어를 해야한다. 이 비용이 드는 것이다.)

쓰레드에서의 컨텍스트 스위칭

쓰레드는 스택 영역을 제외한 모든 메모리 영역을 공유하기 때문에 비용이 더 적고 시간도 더 적게 걸린다.

프로세스의 상태

  • 생성 상태 (create or new)
    • 프로세스가 생성된 상태를 의미하며 fork() 또는 exec() 함수를 통해 프로세스가 생성된 상태이다.
    • 이 때 PCB가 할당된다.
  • 대기 상태 (ready)
    • 처음 프로세스가 생성된 이후 메모리 공간이 충분하면 메모리를 할당받지만 충분하지 않아 준비큐에 들어가 대기중인 상태를 말한다.
    • CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태.
  • 대기 중단 상태(ready suspended)
    • 준비큐가 꽉 찬 상태. 즉 메모리 부족으로 일시 중단된 상태.
  • 실행 상태 (run)
    • CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태.
  • 중단 상태 (blocked)
    • 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태.
    • ex) 프린트 인쇄 버튼을 눌렀을 때 실행하고 있던 프로세스가 잠깐 멈춘 듯 할 때가 있는데 이는 프린트 인쇄에 관한 I/O 요청으로 인터럽트가 발생되어 현재 실행하고 있던 프로세스가 중단상태로 잠시 변경된 것.
  • 일시 중단 상태 (blocked suspended)
    • 중단된 상태에서 프로세스가 실행되려 했지만 메모리 부족으로 일시 중단된 상태.
    • 대기 중단과 비슷.
  • 종료 상태 (terminated or exit)
    • 프로세스 실행이 완료되어 해당 프로세스에 대한 자원을 반납하며 PCB가 삭제되는 상태.
    • 종료는 자연스러운 종료도 있지만 부모 프로세스가 자식 프로세스를 강제적으로 종료시키는 비자발적 종료(abort)로 종료되는 것도 있다.
      • 자식 프로세스에 할당된 자원의 한계치를 넘거나 부모 프로세스가 종료되거나 하는 등의 상황에서 발생한다.

fork()

부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수.

exec()

새롭게 프로세스를 생성하는 함수.

멀티 프로세싱

여러 개의 프로세스, 즉 멀티 프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것.

특정 프로세스 중 일부에 문제가 발생하더라도 다른 프로세스에 영향을 미치지 않으며 격리성과 신뢰성이 높은 강점이 있다.

멀티 쓰레딩

프로세스 내의 작업을 멀티 쓰레드로 처리하는 기법이며 쓰레드끼리 서로 자원을 공유하고 프로세스보다는 가볍기 때문에 효율성이 높은 장점이 있다.

하지만 한 쓰레드에 문제가 생기면 다른 쓰레드에도 영향을 끼쳐 쓰레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점이 있다.

브라우저는 멀티 프로세스이자 멀티 쓰레드 아키텍처를 가진 소프트웨어이다.

브라우저의 여러 프로세스들 중 우리가 보는 화면을 렌더링하는 Renderer 프로세스의 내부에는 위와 같이 여러 스레드들로 구성되어 있는 것이다.

IPC (Inter-Process Communication)

프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 매커니즘을 뜻한다.

IPC의 종류로는 공유메모리, 파일, 소켓, 파이프, 메시지 큐가 있다.

예를 들어 브라우저를 띄워 네이버 서버와 HTTP 통신해 html을 가져오는 것도 IPC라고 볼 수 있다.

공유 메모리

여러 프로세스가 서로 통신할 수 있도록 메모리를 공유하는 것을 말한다.

IPC 방식 중 어떠한 매개체를 통해 데이터를 주고 받는 것이 아닌 메모리 자체를 공유한다.

따라서 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르다.

같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요하다.

파일

디스크에 저장된 데이터를 기반으로 통신하는 것을 말한다.

소켓

네트워크 인터페이스(TCP, UDP, HTTP 등)를 기반으로 통신하는 것을 의미한다.

파이프

익명 파이프, 명명 파이프로 나뉜다. 파이프는 통신의 통로라고 보면 된다.

  • 익명 파이프 : 프로세스 사이에 FIFO 기반의 통신 채널을 만들어 통신하는 것을 의미한다.
    • 파이프 하나당 단방향 통신이기 때문에 양방향 통신을 위해서는 2개의 익명 파이프가 필요하다.
    • 부모 자식 프로세스 간에만 사용 가능하다.
    • 데이터 용량은 제한되어있고 쓰기 프로세스가 읽기 프로세스보다 더 빠르게 데이터를 사용할 수 없다.
  • 명명 파이프 : 익명 파이프의 확장된 개념이며 부모, 자식 뿐 아니라 다른 네트워크 상에서도 통신할 수 있다.
    • 보통 서버, 클라이언트용 파이프를 구분해 동작한다.

메시지 큐

메시지를 큐 자료구조 형태로 관리하는 버퍼를 만들어 통신하는 것을 의미한다.

아래와 같은 과정을 가진다.

  • 프로세스가 메시지를 보내거나 받기 전에 큐를 초기화한다.
  • 보내는 프로세스의 메시지는 큐에 복사되어 받는 프로세스에게 전달된다.
This post is licensed under CC BY 4.0 by the author.