Process, Thread

프로세스

프로세스는 실행중에 있는 프로그램이다.

프로세스의 Context

프로세스의 컨택스트란 CPU 스케쥴링이 일어나면 프로세스의 이전 상태를 재현해야하는데 필요한 정보이다.

  1. CPU 수행 상태를 나타내는 하드웨어 문맥 : PC 값, 레지스터 정보

    • PC값 : 프로세스가 명령어를 어디까지 수행했는지 나타내는 포인터 정보

  2. 프로세스의 주소 공간 : code, data, stack

  3. 프로세스 관련 커널 자료구조 : PCB, Kernel Stack

    • PCB : 운영체제가 프로세스를 관리하기 위해 사용하는 커널의 자료구조. 커널의 데이터 영역에 프로세스 PCB를 저장한다

    • Kernel Stack : 프로세스가 시스템콜을 수행하면 PC가 커널의 code영역을 가리키면서 명령어를 수행한다. 이때 함수 호출이 일어나면 관련 정보가 Kernel Stack에 쌓인다.

위와 같은 정보는 각 프로세스마다 독립적으로 존재한다.

프로세스 상태

  • Running : CPU 점유권을 가지고 명령을 수행중인 상태

  • Ready : 메모리에 적재되어 바로 명령을 수행할 수 있는 조건을 만족하는 상태(Ready Queue에 대기중)

  • Blocked(Wait, Sleep) : CPU를 할당받더라도 당장 명령을 수행하지 못하는 상태 (IO 작업처럼 요청한 이벤트가 바로 수행 결과를 반환하지 않아 다음 명령을 수행하지 못하는 상태)

  • Suspened(Stopped) : 외부적인 이유로 중기 스케쥴러에 의해 메모리를 빼앗겨 수행이 정지된 상태 (디스크로 swap out된다)

  • New : 프로세스가 생성중인 상태

  • Terminated : 프로세스의 수행이 완료된 상태

Blocked와 Suspended

  • Blocked는 프로세스가 IO와 같이 처리 시간이 긴 작업을 수행하는 상태이다. Blocked 상태의 프로세스가 작업을 마치면 Ready 상태로 전환된다.

  • Suspeneded는 CPU 또는 외부(사람, 중기 스케쥴러)에 의해 강제로 정지된 상태이다. 메모리를 빼앗겨 디스크로 swap out된다. 외부에서 resume해줘야 active한 상태가 된다.

프로세스의 상태 전이

  • New → Ready : 프로세스가 생성되면 Ready Queue에서 CPU 점유권을 얻기 위해 대기중인 Ready 상태가 된다.

  • Ready → Running : Ready 상태의 프로세스가 CPU 점유권을 얻으면 작업을 수행할 수 있는 Running 상태가 된다.

  • Running → Terminated : 프로세스의 수행이 끝나 CPU 점유권을 반환할 경우

  • Running → Waiting : 수행 결과를 바로 반환하지 못하는 작업(IO 또는 공유 데이터)을 수행할 경우

    • Running 상태의 프로세스가 IO 작업을 수행하면 IO Queue에 들어가 Blocked 상태가 된다. (공유 데이터에 접근할 경우 Resource Queue에 들어가 Blocked 상태가 된다)

    • IO 작업을 마치면 IO Controller가 CPU에게 Interrupt를 보내 알린다

    • CPU는 해당 프로세스를 Ready 상태로 변환하고 Ready Queue에 대기시킨다.

  • Running → Ready : timer interrupt가 발생하여(할당된 시간이 만료되어) CPU 점유권을 반환할 경우

Queue

Queue는 운영체제 Kenel의 Data 영역에서 자료구조로 구현되어 있다.

PCB

운영체제가 프로세스를 관리하기 위해 프로세스 마다 유지하는 정보를 담는 구조체이다.

프로세스 문맥 교환

프로세스의 문맥교환이란 CPU 점유권이 현재 프로세스에서 다른 프로세스로 넘어가는 과정이다.

  1. CPU 점유권을 빼앗기는 상황 : 현재 시점의 문맥을 기억하기 위해서 해당 프로세스의 PCB에다 CPU의 PC값, 레지스턷 값을 저장한다.

  2. CPU 점유권을 얻는 상황 : 운영체제 커널의 Data 영역에 저장된 프로세스의 PCB에 저장된 PC값과 레지스터값을 CPU에 복원시킨다.

시스템콜, 인터럽트가 발생하면 문맥교환이 항상 발생하는가? → NO!

시스템 콜이란 프로세스에게 원한이 없는 작업을 운영체제에게 요청하는 것이고, 인터럽트는 CPU에게 이벤트가 발생했음을 알리는 수단이다.

  • 시스템 콜이나 인터럽트가 발생하면 CPU 제어권이 프로세스에서 운영체제 커널로 넘어간다. (유저모드의 사용자 프로세스가 커널 모드로 전환된다 해서 문맥교환이 일어나지 않는다)

    1. 사용자 프로세스 A → 운영체제 커널 모드 → 사용자 프로세스 A

      사용자 프로세스 A가 CPU 점유권을 가지고 있을 때, 시스템 콜이나 인터럽트가 발생하여 운영체제 커널 모드로 수행되다가 CPU 점유권을 유지한 채 사용자 프로세스 A로 돌아오면 문맥 교환이 일어나지 않는다.

    2. 사용자 프로세스 A → 운영체제 커널 모드 → 사용자 프로세스 B

      문맥 교환이 일어난다

스케쥴러

스케쥴러란 어떤 프로세스에게 자원을 할당할지 결정하는 운영체제 커널의 코드를 지칭한다.

  1. 장기 스케쥴러 (Job 스케쥴러) : 메모리 및 각종 자원을 할당해 줄 프로세스를 선택한다.

    • new 상태의 프로세스들 중 메모리를 할당해줄 프로세스를 선택한다.

    • 시분할 시스템에서는 new 상태의 프로세스가 곧바로 ready 상태가 되기 떄문에 장기 스케쥴러를 이용하지 않는다.

  2. 단기 스케쥴러 (CPU 스케쥴러) : CPU 점유권을 할당해 줄 프로세스를 선택한다.

  3. 중기 스케쥴러 (Swapper) : 메모리를 빼앗아 디스크로 Swap Out할 프로세스를 선택한다

    • 중기 스케쥴러에 의해 메모리를 빼앗긴 프로세스는 Suspended 상태가 된다.

    • degree of multiprogramming 을 제어한다. (메모리에 동시에 올라갈 프로세스의 수를 제어)

스레드

스레드란 프로세스가 할당받은 자원을 이용하는 실행 단위이다.

  • 스레드마다 별도의 PC값, 레지스터 값을 가진다 → 독립적인 CPU 수행을 위해서

  • 스레드마다 stack이 별도로 존재한다 → 함수 호출이 일어나면 stack 영역에 함수 관련 정보를 쌓는다. (독립적인 작업을 수행하기 위해서)

  • 하나의 프로세스 속 모든 스레드는 code, data 영역과 OS 자원을 공유한다

멀티 프로세스 & 멀티 스레드

멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여 프로세스가 병렬적으로 작업을 수행하는 것이다.

  • 프로세스간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야할 때 사용한다.

장점

  1. 안정성 : 프로세스마다 독립된 주소 공간을 가지기 때문에 하나의 프로세스에 문제가 발생해도 다른 프로세스에 영향을 주지 않는다.

단점

  1. 오버헤드 : 프로세스끼리 독립된 주소공간을 갖기 때문에 문맥교환이 자주 일어난다.

  2. 프로세스간의 통신 방식이 따로 필요하다 : 프로세스 간의 통신이 원칙적으로 제한되어 있기 때문에 IPC(inter process communication) 방식으로 별도의 통신을 수행한다.

    • 메시지 큐, 공유 메모리, 파이프, 시그널 등

멀티 스레드

하나의 프로세스에 여러 스레드로 병렬 작업을 수행하는 것이다

장점

  1. 응답성 : 하나의 스레드가 blocked되어도 같은 프로세스 내의 다른 스레드가 running 상태로 실행되어서 빠른 처리가 가능하다

    • 멀티 프로세스 환경에서는 CPU 점유권을 갖고 있다가 blocked되면 해당 프로세스가 수행중인 작업이 지연된다.

  2. 자원 공유 : 여러 스레드가 하나의 프로세스의 code, data와 OS 자원을 공유하기 때문에 효율적인 자원 활용 및 통신이 자유롭다 (대신 동기화 문제가 발생할 수 있음)

  3. 경제성 : 스레드간의 문맥교환이 프로세스간의 문맥교환보다 오버헤드가 적다 (캐시 메모리를 초기화할 필요도 없고 stack 영역만 문맥교환하면 되기 떄문)

단점

  1. 동기화 문제 : 하나의 자원을 공유하기 때문에 병목현상이나 데드락과 같은 동기화 문제가 발생할 수 있다. (Locking 기법으로 이를 해결, 뮤텍스, 세마포어)

  2. 불안정 : 하나의 스레드에 오류가 발생하면 나머지 스레드에 영향을 미친다.

크롬 브라우저

크롬 브라우저는 멀티 스레드, 멀티 프로세스 환경이다.

  1. 멀티 프로세스 : 각각의 탭들은 프로세스로 구성한다. 따라서 하나의 탭에 오류가 발생하여도 다른 탭들에 영향을 미치지 않는다.

  2. 멀티 스레드 : 하나의 탭은 멀티 스레드로 구성한다. 파일을 다운로드 하면서 웹 서핑을 할 수 있다.

IPC

IPC(Inter Process Communication)이란 프로세스간에 통신 매커니즘이다.

  1. Message Passing: 프로세스간에 공유 데이터를 사용하지 않고 커널을 통해 메시지를 주고 받으면서 통신하는 방식이다.

    • Direct Communication : 통신하려는 프로세스 이름을 명시적으로 표시하여 전달하는 방식

    • Indirect Communication : mailbox나 port를 통해 메시지를 간접적으로 전달하는 방식 (mailbox에 있는 메시지를 임의의 프로세스가 꺼내어 확인할 수 있다. 특정 프로세스에게 메시지를 전달할 수 없는 방식)

  2. Shared Memory : 서로 다른 프로세스들이 일부 주소 공간을 공유하여 통신하는 방식

    • 프로세스는 원칙적으로 자신의 독립적인 주소 공간만 볼 수 있지만 Kernel에게 요청하여 Shared Memory를 할당받아 해당 주소 공간을 공유할 수 있다.

    • 프로세스간 동기화 문제를 스스로 책임져야 한다 (OS가 책임지지 않는다는 의미?)

Last updated