[이것이 취업을 위한 컴퓨터 과학이다] : 운영체제 - 프로세스와 스레드

프로세스란?

실행중인 프로그램을 뜻한다.

 

프로세스의 유형

  • 포그라운드 프로세스
    사용자가 보는 공간에서 사용자와 상호작용하여 실행되는 프로세스
  • 백그라운드 프로세스
    사용자가 보지 못하는 곳에서 실행되는 프로세스
  • 데몬
    사용자와 별다른 상호작용 없이 주어진 작업만 수행하는 특별한 백그라운드 프로세스

✢ 윈도우 운영체제에서는 데몬을 서비스라 부른다.

 

프로세스의 구조

프로세스를 실행시키기 위해서는 코드의 데이터를 메모리에 올려 실행시켜야 한다.
이때, 프로세스마다 고유한 가상 메모리 공간을 제공하며, 이 공간은 아래 이미지와 같다.


프로세스의 유형을 막론하고 하나의 프로세스를 구성하는 메모리 내의 정보는 크게 다르지 않다.

(프로세스마다 구조는 다 비슷비슷하다)

✔️ 커널영역

  • PCB : 프로세스 제어 블록

✔️ 사용자 영역

코드 영역

  • 실행가능한 명령어가 저장되는 공간이다.
  • 텍스트 영역이라고도 불린다.
  • 읽기전용 공간이다.
  • 컴파일되어

데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다.
  • 데이터 영역에 저장되는 데이터는 정적 변수나 전역 변수가 대표적이다.

힙 영역

  • 프로그램을 만드는 사용자가 직접 할당 가능한 저장 공간이다.
  • 자유롭게 할당 가능한 대신 언젠가는 해당 공간을 반환해야한다. (메모리 누수주의)
  • 메모리 누수 문제 해결을 위해 가비지 콜렉터(GC)를 제공하는 언어도 있다.

스택 영역

  • 데이터 영역의 값들과는 달리 일시적으로 사용할 값들이 저장되는 공간이다.
  • 함수의 실행이 끝나면 사라지는 매개변수, 지역 변수, 함수 복귀 주소 등이 대표적이다.
  • 스택 트레이스라는 형태의 함수 호출 정보가 저장 될 수 있다. 
    스택 트레이스: 특정 시점에 스택 영역에 저장된 함수 호출 정보

 

PCB와 문맥교환

✔️ PCB: 프로세스 제어 블록

운영체제가 메모리에 적재된 다수의 프로세스를 관리하기 위해 필요한 프로세스를 식별할 수 있는 커널 영역 내 정보를 말한다. 

프로세스와 관련한 다양한 정보를 내포하는 구조체의 일종이다.

새 프로세스가 메모리에 적재됐을 때 커널 영역에 만들어지고, 프로세스의 실행이 끝나면 폐기된다.

✔️ 프로세스에 담기는 정보

  • 프로세스 ID
  • 프로세스가 실행과정에서 사용한 레지스터 값
  • 프로세스 상태
  • CPU 스케쥴링(우선순위) 정보
  • 메모리 관련 정보
  • 파일 및 입출력 장치 관련 정보

여러 PCB들은 프로세스 테이블(실행중인 PCB의 모음)의 형태로 관리되는 경우가 많다.

 

✔️ 문맥교환 (Context Switch)

기존 프로세스의 문맥을 PCB에 백업하고, 문맥을 복구하여 새로운 프로세스를 실행하는 것

 

프로세스가 실행된다. = 운영체제에 의해 CPU의 자원을 할당받았다.

일반적으로 메모리에 적재된 프로세스들은 한정된 시간동안 번갈아 가며 실행된다. 

프로세스의 사용시간은 타이머 인터럽트에 의해 제한된다.

위 그림과 같이 프로세스 A가 실행되다 타이머 인터럽트가 발생하면 프로세스 A에 대한 모든 정보를 백업해야되는데,

이 정보를 문맥이라한다. (문맥은 PCB에 명시됨)

프로세스 B가 실행되기 전에는 해당 프로세스의 문맥을 복구한다.

 

이 과정을 문맥교환이라한다.

 

프로세스의 상태

하나의 프로세스는 여러 상태를 거치며 실행된다.

  • 생성상태 (new)
    메모리에 적재되어 PCB를 할당받은 상태, CPU의 할당을 기다린다.
  • 준비상태 (ready)
    당장이라도 CPU를 할당받아 실행할 수 있는 상태, 자신의 차례가 아니기 때문에 기다리는 상태이다.
    디스패치(dispatch) : 준비상태 프로세스가 실행 상태로 전환되는 것
  • 실행상태 (running)
    실행중인 상태, 타이머 인터럽트가 발생하면 준비상태 또는 대기상태가 된다.
  • 대기상태 (blocked)
    입출력 작업을 요청하거나 바로 확보할 수 없는 자원을 요청하는 등의 바로 실행할 수 없다면 대기상태에 놓인다.
  • 종료상태 (terminated)
    종료된 상태, 운영체제가 PCB와 메모리를 정리한다.

 

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

✔️ 멀티프로세스

동시에 여러 프로세스가 실행되는 것

각기 다른 프로세스들은 기본적으로 자원을 공유하지 않고, 독립적으로 실행된다.

같은 작업을 수행하더라도 자원이 독립적으로 할당되어 다른 프로세스에 영향을 끼치지 않는다.

✔️ 멀티스레드

프로세스를 동시에 실행하는 여러 스레드

한 프로세스를 구성하는 코드를 동시에 실행하는 방법이다.

 

하나의 스레드는 스레드ID, 프로그램 카운터, 레지스터 값, 스택 등으로 구성된다.

 

✔️ 멀티프로세스 vs 멀티스레드

둘의 큰 차이는 자원의 공유여부에 있다.

프로세스는 자원을 공유하지 않기때문에 독립적이지만, 스레드는 프로세스의 자원을 공유한다.

따라서 쉽게 협력하고 통신할 수 있다는 장점이 있지만 한 스레드에 문제가 생기면 프로세스 전체의 문제가 될 수 있다.

 

❓ 스레드 조인

thread1.join()
join의 주체 스레드가 종료될 때까지 대기해야함을 의미한다.

 

프로세스간 통신 (IPC)

독립적인 프로세스가 자원을 공유하고 데이터를 주고 받을 수 있는 방법

✔️ 공유메모리

프로세스 간에 공유하는 메모리 영역을 토대로 데이터를 주고받는 통신방식

공유메모리를 프로세스 A는 쓰고 B는 읽으면 A가 B에게 데이터를 공유하는 것과 같다.

  • 마치 자신의 메모리 영역을 읽고 쓰는 것처럼 통신한다.
  • 데이터를 주고 받는 과정에 커널의 개입이 거의 없다.
  • 메시지 전달 방식보다 통신속도가 빠르다
  • 데이터의 일관성이 훼손될 수 있다. (레디스 컨디션)

✔️ 메세지 전달

프로세스 간에 주고받을 데이터가 커널을 거쳐 송수신되는 통신 방식

  • 보내는 수단과 받는 수단이 명확하다. (send(), recv())
  • 커널의 도움을 받으므로 레이스 컨디션이나 동기화등의 문제를 상대적으로 적게 고려한다.
  • 대표적인 수단으로 파이프, 시그널, 소켓, 원격 프로시저 호출(RPC) 등이 있다.

 

⚬ 파이프

단방향 프로세스간의 통신 도구 (데이터가 흐를 수 있는 공간)

양방향 통신 -> 읽기용 파이프와 쓰기용 파이프 2개를 이용

 

⚬ 시그널

프로세스에게 특정 이벤트가 발생했음을 알리는 비동기적인 신호

 

프로세스는 시그널이 발생하면 하던 일을 잠시 중단하고, 시그널 처리를 위한 시그널 핸들러를 실행한 뒤 다시 실행한다.

시그널도 비동기적으로 원하는 동작을 수행할 수 있는 좋은 수단이다.

 

원격 프로시저 호출(RPC)

원격 코드를 실행하는 IPC 기술 (대규모 트래픽 처리 환경, 서버 간 통신 환경에 사용)

⚬ 네트워크 소켓