프로세스, 스레드

geonmyung·2020년 7월 25일
0

1. 프로세스

  • 컴퓨터에서 실행되고 있는 프로그램
  • 메모리에 적재되어 실행되고 있는 프로그램
    -> 실제 실행 중인 프로그램을 일컫기 때문에 동적이라고 표현하기도 한다.

※ 잠깐만!! 용어 정리!!

  • 프로그램이란?
    -> 실행 가능한 명령어의 집합

PCB (Process Control Block)

  • 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조
  • 운영체제는 프로세스 관리를 위해, 프로세스 생성과 동시에 고유한 PCB 생성
  • 프로세스는 작업 중, 프로세스간 전환이 발생하면 진행하던 작업의 상황을 모두 PCB에 저장하고 CPU를 반환한다.
    이후 다시 CPU를 할당받게 되면 PCB에 저장되어 있던 내용을 불러와 이전에 종료했던 시점부터 다시 작업을 진행한다.
  • PCB에 저장되는 정보
    • 프로세스 식별자 (PID : Process ID) : 프로세스 식별 번호
    • 프로세스 상태 : new, ready, running, waiting, terminated 등
    • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
    • CPU 레지스터
    • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케쥴 큐에 대한 포인터 등
    • 메모리 관리 정보 : 페이지 테이블, 세그먼트 테이블 등과 같은 정보
    • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
    • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정정보 등

특징

  • 프로세스마다 최소 1개의 스레드 소유(메인 스레드)
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 다른 프로세스의 변수나 자료구조에 접근이 불가하다.
    -> 다른 프로세스의 자원에 접근하기 위해서는 IPC를 사용해야 한다.
  • 프로세스는 각각 독립된 메모리 영역(Code(text), Data, Heap, Stack)을 할당받는다.

    -> Code(text) : 프로그램의 실제 코드 저장
    -> Data : 프로세스 실행 시 정의된 전역변수와 static 변수
    -> Heap : 프로세스 런타임 중 동적으로 할당되는 변수들 저장(함수 내에서 할당되는 변수 등)
    -> Stack : 함수에서 다른 함수를 실행하는 등의 서브루틴들의 정보 저장

2. 스레드

  • 프로세스 내에서 실행되는 여러 흐름의 실행 단위
  • 프로세스 안의 스레드들은 레지스터, 스택 공간을 제외한 프로세스의 나머지 공간과 시스템 자원을 공유한다.
    -> code 영역을 공유하기 때문에 프로세스 내부 스레드들은 프로세스가 가지고 있는 함수 호출 가능
    -> heap, data 영역을 공유하기 때문에 IPC 없이도 스레드간 통신 가능

스택을 스레드마다 독립적으로 가지는 이유

  • 스택은 함수 호출 시 전달되는 인자, 작업 후 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
  • 이에 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다.
  • 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

PC 레지스터를 스레드마다 독립적으로 가지는 이유

  • PC값은 스레드가 명령어의 어디까지 수행하였는지를 나타내게 된다.
  • 스레드는 CPU를 할당받았다가 스케쥴러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.

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

멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여 작업을 처리하도록 하는 것

장점

  • 여러 개의 프로세스 중 하나에 문제가 발생하더라도 다른 프로세스들은 아무런 문제가 없다.

단점

  • Context Switching에서의 오버헤드
  • 프로세스 사이에 복잡한 통신 기법 (IPC)

※ 잠깐만!! 용어 정리!!

  • Context Switching이란?
    -> CPU에서 여러 프로세스를 돌아가면서 상태 정보를 저장하고 복원하는 과정
    -> 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정을 말함

    운영체제 시간에 배운 내용을 토대로 Context Switching에 대해 다시 적어보자
    -> Context Switching의 발생 = 새로운 프로세스가 CPU에 올라온다는 뜻
    -> 기존 프로세스가 작업을 하면서 메모리에 있던 데이터를 캐쉬에 넣어뒀는데 이 프로세스가 나가면서 캐쉬에 있는 데이터가 필요 없게 됨
    -> 캐쉬 플러싱이 발생
    -> Context Switching이 되어 프로세스가 빠져나갈 때 이 캐쉬를 전부 다 없애준다 (값이 바뀐 캐쉬가 있다면 메모리에 써주고 값이 바뀌지 않았다면 다 없애준다.)

멀티 스레드

하나의 프로그램을 여러 개의 스레드로 구성하여 작업을 처리하도록 하는 것

장점

  • 스레드들은 각자의 stack, 레지스터 영역을 제외한 모든 메모리를 서로 공유하기 때문에 통신의 부담이 적다.
  • 스레드간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모 감소
  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소하여 자원의 효율적 관리가 가능

단점

  • 하나의 스레드가 데이터 공간 훼손 시, 모든 스레드가 작동 불가 상태
    -> 공유하는 메모리를 소유하기 때문!

멀티 프로세스(다리 한개인 문어가 8마리) vs 멀티 스레드(다리 8개 달린 문어 한 마리)

4. 스레드 풀

  • 스레드가 생성될 때, 운영체제(OS)가 요청을 받아들여 메모리 공간을 확보해주고 그 메모리를 스레드에게 할당해준다.
  • 스레드는 동일한 메모리 영역에서 생성되고 관리되지만, 생성 및 제거에 드는 비용을 무시할 수 없다.
  • 그렇기 때문에 요청이 들어올 때 마다 스레드를 생성하고 작업 후에 제거하는 작업은 프로그램 성능과 퍼포먼스에 큰 영향을 줄 수 있다.
  • 따라서 스레드를 미리 만들어놓는 것이다.
  • 미리 생성된 스레드 풀의 스레드들이 처리가 필요한 Task가 쌓이는 Task Queue에서 Task들을 꺼내 처리하는 구조

장점

  • 프로그램 성능 저하를 방지할 수 있다.
  • 다수의 사용자의 요청을 수용하고 빠르게 처리하고 대응하기 위해 스레드 풀을 사용한다.

단점

  • 너무 많이 만들어 놓았다가 메모리 낭비만 발생할 수 있다. (100개 중 10개만 일을 한다.)
  • 노는 스레드가 발생할 수 있다. (100개 다 병렬적으로 일을 하는데, 작업완료 소요시간이 다른 경우 노는 스레드가 발생)

참고자료

profile
옹골찬 개발자가 되기 위한 험난한 일대기

0개의 댓글