해피 코딩!

[OS] 프로세스와 스레드 본문

OS

[OS] 프로세스와 스레드

지속가능한 성장을 2020. 12. 24. 23:50

운영체제 기본 개념에 대한 생각을 정리할 겸 블로그 글을 작성합니다.

프로그램

프로그램은 하드디스크에 저장된 실행 파일을 칭합니다.

더블클릭해서 실행하지 않는 이상 하드디스크에 계속 남아 있으며, 같은 경로에 같은ㅇ ㅣㅇ름으로 동시에 존재할 수는 없습니다.

1. 프로세스

프로세스는 더블 클릭으로 프로그램을 실행한 상태 즉, 하드디스크에서 메인 메모리로 코드와 데이터를 가져와 현재 실행되고 있는 상태를 말합니다.

프로세스는 동시에 여러 개가 존재할 수 있습니다. 같은 프로그램을 동시에 여러 번 클릭하면 창이 여러 개 뜨는 것과 같습니다. 예를 들어 메모장을 두 개 실행하면 독립적인 프로세스 두 개가 생성됩니다. 독립적이라는 의미는 프로세스가 사용하는 메모리 공간도 서로 다르다는 의미 입니다.
운영체제는 이름이 같은 두 프로세스를 구분하는 방법으로 프로세스마다ID를 부여하여 구별합니다.

1.1 프로세스의 구조

프로세스는 일반적으로 코드, 데이터, 힙, 스택 영역으로 이루어져있습니다.

코드 영역은 프로그램 코드가 저장되고,
데이터 영역은 전역 변수등이 저장되며,
힙 영역은 동적으로 할당된 메모리를 위한 공간이고,
스택 영역은 함수 실행을 위한, 지역 변수등이 저장됩니다.

1.2 프로세스 상태

프로세스

  1. 생성 (New)
    프로그램을 더블클릭 했을 때 프로세스가 생성되면서 실행 가능 상태가 됩니다. 곧바로 실행 상태가 되는 것이 아니라, 우선 실행 가능 상태가 되어 실행 중인 프로세스와 우선순위를 비교한 다음 우선순위가 높으면 실행하고 아니면 실행 가능 상태에서 순서를 기다리는 식 입니다.

  2. 실행 가능 (Ready)
    실행 가능 상태의 프로세스는 언제든지 실행될 준비가 되어 있스빈다.
    운영체제는 인터럽트가 발생하였을 때 실행 간으 상태의 프로세스 중 다음으로 CPU를 할당받아 실행될 프로세스를 결정한 후 실행 중인 프로세스와 교체합니다.
    이때 다음으로 실행될 프로세스에 CPU를 할당하는 것을 디스패치라고 하고, 실행 중이던 프로세스에서 CPU를 해제하는 것을 프리엠션이라고 합니다.

  3. 실행 (Running)
    프로세스가 운영체제로부터 CPU를 할당받아 실행되고 있는 상태입니다.

  4. 보류 (Waiting)
    프로세스가 I/O 작업을 하면 CPU 를 해제하고 보류 상태로 변경됩니다.
    이때 실행 가능한 상태의 프로세스 중 하나가 CPU를 할당 받습니다. 보류 상태에 들어간 프로세스는 I/O 작업이 모두 끝나면 실행 가능 상태로 변경됩니다. 중요한 점은 I/O 작업이 완료된 다음 바로 실행 상태로 변경되는 것이 아니라, 실행 가능 상태가 되어 실행되기를 기다린다는 것 입니다.

실행 대기 상태는 언제든지 다시 실행될 수 있는 상태를 말하지만, 보류 상태는 I/O 작업이 끝나기 전에는 실행이 불가능한 상태를 말합니다.

  1. 소멸 (Terminated)
    프로세스 실행이 완료되어 메인 메모리에서 사라집니다.

1.3 스케줄링

스케줄링이란 운영체제가 여러 프로세스의 CPU할당 순서를 결정하는 것 입니다.
이 일을 하는 프로그램을 스케줄러라고 합니다.

스케줄링은 CPU를 언제 할당하는지에 따라 선점형 스케줄링과 비선점형 스케줄링으로 구분됩니다.

선점형 스케줄링은 어떤 프로세스가 실행 중에 있어도 스케줄러가 강제로 실행을 중지하고 다른 프로세스에 CPU를 할당할 수 있습니다. 이에 반해 비선점형 스케줄링에서는 실행중인 프로세스가 종료되거나 I/O 작업에 들어가거나 명시적으로 CPU를 반환하기 전까지 계속되서 실행됩니다.

우선순위가 높은 프로세스가 생성되어도 실핼 중인 프로세스가 자발적으로 CPU를 양보하기 전까지 실행될 수 없습니다.

윈도우를 포함한 최근 운영체제는 멀티태스킹을 위해 선점형 스케줄링을 사용합니다.

1.4 컨텍스트 스위칭

컨텍스트 스위칭이란 멀티 태스킹등 프로세스 스위칭이 필요할 때, 실행할 프로세스를 CPU에 교체해주는 기술입니다.

구체적으로는 현재 실행중인 프로세스의 프로세스 ID, PC/SP와 같은 레지스터값등 주요 프로세스 상태 정보를 해당 프로세스의 PCB에 저장하고,
다음에 실행할 프로세스의 PCB정보에서 주요 프로세스 상태 정보를 CPU에 업데이트한 후, 해당 프로세스를 실행시킵니다.

2. 스레드

스레드(thread)란 프로세스 안의 실행 흐름의 단위로 스커줄러에 의해 CPU를 할당 받을 수 있는 인스트럭션의 나열 입니다. 프로세스는 하나 이상의 스레드로 구성됩니다.

파이썬 스크립트 파일을 예로 들자면, 파일을 실행시키는 명령어 한 줄 한 줄이 스레드인 것이다.

일반적으로 스레드를 추가하지 않는 한, 모든 프로그램은 메인 스레드 하나로 실행된다.

운영체제적으로는 한 프로세스 안의 스레드들은 스택 공간을 제외한 프로세스의 나머지 공간과 시스템 자원을 공유한다.

2.1 스레드의 장점

  • 프로세스 간 통신에 비해 스레드 간 통신이 훨씬 간단하다.

    • 서로 공유하는 변수를 변경하기만 하면 된다.
  • 시스템 자원 소모가 줄어든다.

    • 기존 프로세스의 자원을 다른 스레드와 공유하기 땜누에 자원을 새로 할당하지 않아도 된다.
  • 전체 응답시간이 단축된다.

    • 시간도 자원이기에 오버헤드가 줄어들어 전체 응답이 짧아진다. 또한 병목이 걸리는 작업과 다른 작업을 구분할 수 있어서 전체 실행 시간을 줄일 수 있다.

위와 같은 장점은 웹 서버가 각각의 HTTP 통신을 멀티 프로세스가 아닌 멀티 스레드로 구현하는지 설명한다. 각 통신은 고유한 자원을 할당해야 하고 서로 간 통신도 까다로운 프로세스로 구현할 필요가 없기 때문이다.

2.2 스레드의 단점

  • 여러 스레드를 이용하는 프로그램의 경우 설계가 어렵다.
  • 디버깅이 어렵다.

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

멀티 프로세스

  • 멀티 프로세스는 모든 프로세스가 서로 다른 메모리 공간을 가지므로 데이터를 공유하려면 IPC를 이용해야 한다.

  • 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)를 처리하도록 하는 것.

  • 장점: 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽고 다른 프로세스에 영향을 주지 않는다.

  • 단점: 컨텍스트 스위칭은 CPU에서 데이터를 저장하고 데이터를 가져오는 것은 시스템에 부담을 준다.

멀티 스레드

  • 하나의 응용 프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것.
  • 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.

출처

Comments