lottie
Seungjun's blog
blog
Program , Process, Processor, Thread

우선 각각 정의부터 하겠다.


프로그램(Program)이란?

어떤 작업을 위해 운영체제 위에서 실행할 수 있는 파일을 말한다. 어렵게 말하면 보조기억장치(Disk)에 저장되어 있는 실행되기를 기다리는 명령어(instruction)와 데이터의 묶음이다.


프로세스(Process)란?

운영 체제 위에서 실행중인 프로그램을 말한다. 프로그램 명령어와 데이터들이 메모리에 올라오고 실행 중 또는 실행 대기 중인 프로그램을 말한다


프로세서(Processor)란?

프로세스가 동작 될 수 있도록 하는 하드웨어(CPU)를 말한다. 여기서 동작이란 프로그램의 자원들이 메모리에 올라오고, 실행되어야 할 코드의 메모리 주소를 CPU의 레지스터로 올리는 것을 의미한다. 사실 CPU는 한번에 하나의 프로세스만 실행할 수 있다.


하지만 우리가 사용하는 기기들은 **멀티 태스킹(Multi-Tasking)**이 가능하다. 이는 운영체제가 순식간에 실행할 프로세스를 교체하여 우리가 이를 인지하지 못하기 때문이다.


*멀티 태스킹에선 한 프로세스 안의 스레드에 문제가 생기면 같은 프로세스 안의 다른 스레드에도 함께 문제가 발생하기 때문에 디버깅이 까다롭다. 또한 같은 데이터를 공유하기 때문에 데이터 동기화에 신경을 써야한다.


스레드(Thread)란?

스레드란 프로세스 내부에 있는 CPU 수행 단위를 말한다.


프로세스의 문맥 (context)

프로세스의 문맥이란 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보를 말합니다.


현대의 운영체제는 여러 프로세스가 함께 수행되는 시분할(time sharing) 시스템 환경입니다. 시분할 시스템 환경에서는 타이머 인터럽트에 의해 짧은 시간동안 CPU를 점유하고 다른 프로세스에게 넘겨주고 다시 차례가 되면 CPU를 점유하여 명령을 수행합니다. 다시 명령을 수행하기 위해서 이전에 어디까지 명령을 수행했는지 정확한 수행 시점과 상태를 재현할 수 있는 정보가 필요했습니다. 그 필요한 정보가 바로 프로세스 문맥(process context)입니다.

image

프로세스의 문맥은 크게 세 가지로 나눌 수 있습니다.

  1. CPU 수행 상태를 나타내는 하드웨어 문맥

    • Program Counter (현재 시점에 프로세스의 코드 영역에서 어떤 명령어를 가리키고 있었는지)

    • 각종 register (현재 시점에 레지스터에 어떤 값을 넣고 있었는지)

  2. 프로세스의 주소 공간

    • code, data, stack (현재 시점에 주소 공간에 어떤 값이 저장되어 있었는지)

  3. 프로세스 관련 커널 자료구조

    • PCB (Process Control Block)

    • Kernel stack (시스템 콜 되어 커널 함수가 호출될 때 데이터를 저장할 수 있는 커널의 주소 공간)

이러한 정보들을 가지고 있으면 프로세스가 현재 어떤 상태에서 수행되고 있었는지 정확하게 규명할 수 있습니다.


프로세스의 상태 (state)

프로세스는 상태가 변경되며 수행됩니다. 시분할 시스템 환경의 싱글 코어에서 멀티 프로세스가 수행되려면 각 프로세스가 하나의 CPU를 짧은 간격으로 공유하며 점유해야 합니다(문맥교환). 이러한 프로세스들은 상태가 변경되며 수행되는데 이것을 프로세스의 상태라고 합니다.

image

  • 프로세스 상태

    • 생성 (New)

      • 프로세스를 생성하고 있는 단계로 커널 공간에 PCB가 만들어진 상태.

    • 준비 (Ready)

      • 프로세스가 CPU 할당을 기다리는 상태. 수행될 프로세스를 CPU 스케줄러가 선택

    • 실행 (Running)

      • 프로세스가 CPU를 할당 받고 명령어(instruction)를 수행중인 상태.

    • 대기 (Waiting)

      • Blocked라고도 한다. event가 완료될 때까지 (스스로) 기다리는 상태. 완료되면 ready 상태로 넘어간다.

      • (예) 시스템 콜을 통해 I/O 요청을 한 경우 혹은 보조기억장치에서 file을 읽어와야 하는 경우

    • 종료 (Terminated)

      • 프로세스가 종료된 상태. 정상 종료인 exit과 비정상적인 종료인 abort를 포함한다.

    • 정지 (Suspended)

      • Stopped라고도 한다. 외부적인 이유로 프로세스의 수행이 강제로 정지된 상태.

      • 프로세스는 통째로 보조기억장치에 swap out된다.

      • (예) 사용자가 프로세스를 일시 정지시킨 경우 (break key)

      • (예) 중기 스케줄러(Medium-Term Scheduler)가 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)

      • 외부에서 다시 resume 해주어야 실행된다.

  • 프로세스 상태 전이

    • Dispatch

      • 준비(Ready) -> 실행(Running)

      • 프로세스 스케줄러에 의해 결정된 우선순위에 따라 프로세스가 CPU를 점유하게 되는 상태

    • Time out

      • 실행(Running) -> 준비(Ready)

      • 프로세스가 실행중이다가 제한된 시간을 다 소비하여 CPU 점유를 빼앗기는 상태

    • Block

      • I/O 등의 자원 요청 후 기다리고 있는 상태

    • Wake up

      • 프로세스가 자원을 할당받은 준비하고 있는 상태

    • Swap in (resume)

      • 프로세스가 주기억장치에 적재 되는 상태

    • Swap out (suspend)

      • 프로세스가 주기억장치에서 해제 되는 상태

    • Spooling

      • 입출력 장치의 공유 및 상대적으로 느린 입출력 장치의 처리속도를 보완하고 다중 프로그래밍 시스템의 성능을 향상시키기 위해 입출력할 데이터를 직접 입출력장치에 보내지 않고 나중에 한꺼번에 입출력하기 위해 디스크에 저장하는 과정


PCB (Process Control Block)

PCB란 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내 자료구조입니다. 커널 주소공간의 data 영역에 존재합니다.

image


PCB에 저장되어 있는 정보

  • OS가 관리상 사용하는 정보

    • Process state, Process ID

    • scheduling information, priority

  • CPU 수행 관련 하드웨어 값

    • Program Counter, Registers

  • 메모리 관련

    • code, data, stack의 위치 정보

  • 파일 관련

    • Open file descriptors..


문맥 교환 (Context Switch)

문맥 교환이란 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정을 말한다.


실행 상태에 있던 프로세스(A)가 입출력을 요청해야하는 경우가 생겼다고 가정해보자. 입출력을 하기 위해서 프로세스는 I/O를 요청하는 시스템 콜을 발생시키고, 프로세스는 device queue에 줄을 서게 되고 준비 상태로 상태가 변경된다. 그리고 ready queue에 있던 다른 프로세스(B)가 CPU를 할당받아 명령을 수행하게 될 것이다.


이렇게 프로세스(A)에게 있던 CPU 제어권이 프로세스(B)에게로 넘어가는 과정을 문맥 교환이라고 한다.


image


image


시스템 콜이나 인터럽트로 인해 CPU 제어권이 넘어가는 과정은 문맥 교환이라고 하지 않는다. 단지 하나의 프로세스가 사용자 모드에서 커널 모드로 실행 모드만 바뀌는 것(mode bit 1 → 0) 뿐이기 때문이다.

문맥교환이 발생할 때 레지스터에 새로운 PCB를 적재하는 과정동안 CPU가 아무런 일도 할 수 없는데 이 구간을 문맥교환의 오버헤드라고 한다. 타이머 인터럽트 시간을 너무 짧게하면 프로세스간 문맥 교환이 너무 자주 일어나 오버헤드가 커지게 된다.


프로세스를 스케줄링 하기 위한 큐 (Queue)

  • Job Queue

    • 보조기억장치에 있는 프로그램이 실행되기 위해 메인 메모리 할당을 기다리는 큐이다.

  • Ready Queue

    • CPU 점유 순서를 기다리는 큐이다.

  • Device Queues

    • I/O device의 처리를 기다리는 큐이다.


스케줄러 (Scheduler)

스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 모듈을 지칭한다. 스케줄러에 따라 프로세스 상태가 바뀌게 된다.

  • Long-Term scheduler (장기 스케줄러 or job scheduler)

    • 시작 프로세스 중 어떤 프로세스를 ready queue로 보낼지 결정

    • 프로세스에 메모리(및 각종 자원)을 할당해주는 문제

    • degree of Multiprogramming을 제어

    • 시분할 시스템(time sharing system)에는 보통 장기 스케줄러가 없음 (무조건 ready)

  • Short-Term scheduler (단기 스케줄러 or CPU scheduler)

    • 어떤 프로세스를 다음번에 Running 시킬지 결정

    • 프로세스에게 CPU 점유권을 주는 문제

    • 충분히 빨라야 한다.(millisecond 단위)

  • Medium-Term scheduler (중기 스케줄러 or Swapper)

    • 여유 공간 마련을 위해 프로세스를 swap out 시킴 (프로세스를 suspended 상태로 만든다.)

    • 프로세스에게서 memory를 뺏는 문제

    • degree of Multiprogramming을 제어


프로세스와 스레드의 차이

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이다.


스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이고 프로세스 내에 여러개 생길 수 있다.


프로세스가 동작 한다는 것은 프로세스의 특정 스레드가 실행 중 그 특정 스레드는 프로세스가 가진 데이터를 참조한다.


스레드의 구성


image


image

  • program counter, register set

    • 프로세스처럼 스레드도 스레드 간에 문맥 교환이 이루어진다. 그러므로 PCB 내부에 각 스레드의 program counter와 register set이 저장된다.

  • stack space

    • 스레드는 독립적인 실행 흐름이므로 스택 공간은 공유하지 않는다.

스레드가 동료 스레드와 공유하는 부분

image

  • code, data 영역

  • OS 자원들


스레드의 장점

  • 응답성

    • 하나의 스레드가 blocked 상태인 동안(I/O를 기다리거나 메모리 적재를 기다리는 중)에서도 다른 스레드가 실행(running)되어 빠른 응답성을 가질 수 있다.

    • (예) 크롬같은 웹 브라우저에서 렉이 걸릴 때 이미지보다 글이 먼저 불러와지는 것과 비슷하다. 그림을 가져오는 것은 blocked이지만 text를 가져오는 것은 따로 진행되기 때문에 글이라도 먼저 볼 수 있는 것이다.

  • 자원 공유

    • code 영역, data 영역, OS resources 들을 공유하여 자원을 효율적으로 사용한다.

  • 경제적

    • 스레드를 생성하는 것이 프로세스를 생성하는 것보다 비용이 적다.

    • 프로세스 간의 문맥 교환은 스레드 간의 문맥 교환보다 오버헤드가 더 크다.(프로세스 문맥 교환시 TLB가 flush 되기 때문. 스레드는 Stack 영역만 처리하면 된다.)

  • 병렬성

    • 멀티 코어 환경에서 서로 다른 스레드가 서로 다른 CPU에서 병렬적으로 처리되어 높은 처리율과 성능 향상을 기대할 수 있다.

  • 커널의 도움없이 상호간에 통신이 가능

    • Stack을 제외한 메모리 공간을 공유하므로 스레드간 통신이 간단하다.


주의점

  1. 각 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있다.

  2. 하나의 스레드에 문제가 발생하면 프로세스 전체가 영향을 받는다.

  3. 주의 깊은 설계가 필요하며 디버깅이 까다로움 (프로그래머의 역량)