프로세스와 스레드

Sawol·2021년 3월 24일
0

운영체제 뽀개기

목록 보기
2/7
post-thumbnail

프로세스

프로세스

프로그램이 실행중인 상태.
디스크에 코드같은 정적 데이터를 가진 프로그램이 메모리에 올라가면 프로세스가 된다.

프로세스 구조

  • 스택
    데이터를 일시적으로 저장하는 영역.
    지역변수, 호출한 함수의 반환 주소, 매개변수 등에 사용.
    힙과 인접한 방향으로 커지다가 스택과 힙이 만나면 메모리가 소진되었다는 의미.

  • 프로그래머가 동적으로 메모리를 할당할 때 사용되는 영역.
    정적 메모리 할당(프로세스 시작때 이미 정해진 메모리 양)인 스택과 달리 동적 할당은 프로세스 실행 과정 중에 필요한 메모리를 운영체제에 요구해 할당 받기 때문에 해제 또한 직접 해제해야한다.
  • 데이터
    전역 변수나 정적변수를 저장하거나 할당하고 실행하기 전에 초기화한다.
  • 코드
    프로그램의 실제 코드. 읽기 전용이므로 코드 영역을 프로그램이 침범하면 오류가 발생해 프로그램이 종료된다. 코드 영역은 공유 할 수 있으므로 자주 실행하는 프로그램의 사본 하나는 메모리에 존재한다.

프로세스의 종류

  • 시스템(커널) 프로세스
    모든 시스템 메모리와 프로세서의 명령에 엑세스 할 수 있는 프로세스.
  • 사용자 프로세스
    사용자 코드를 수행하는 프로세스.

프로세스 상태(Process State)

  • Running(실행)
    CPU를 잡고 instruction을 수행중인 상태.
  • Ready(준비)
    다른 조건을 모두 만족하고 CPU를 기다리는 상태.
    준비가 다 된 프로세스들이 큐에 저장되어 있다.
  • Blocked(wait, sleep)
    CPU를 줘도 당장 instruction을 수행 못하는 상태. blocked된 원인을 제거하면 준비 상태가 됨.
    ex - 아직 디스크에서 file을 읽어오지 않아 읽어와야하는 상태.
  • Suspended(stopped)
    swapper가 메모리에 너무 많은 양의 프로세스가 올라오는 것을 막기 위해 프로세스를 메모리에서 디스크로 swap out하여 수행이 정지된 상태. 또는 사용자가 프로그램을 일시 정지시킨 경우에도 Suspended 상태가 됨.
  • New
    프로세스가 생성중인 상태.
  • Terminated
    프로세스를 끝내는 중인 상태. PCB 정보를 제외한 모든 자원들은 반납된 상태.
    커널이 PCB 정보 수집을 완료하면 프로세스가 완전히 끝남.
  • dispatch
    준비 큐 맨 앞에 있던 프로세스가 프로세서를 점유하는 것.
  • Wakeup
    Blocked 상태에서 Ready 상태가 됨.

    interrupt clock
    하나의 프로세스가 프로세서를 독점하지 않도록 인터럽트 클록이라는 시간을 두어 그 시간동안만 프로세서를 점유하게 한다.
    타임아웃이 되어도 프로세스가 종료되지 않으면 실행상태에서 Ready상태가 되고, 준비 큐의 첫 번째 프로세스가 실행된다.

    프로세스 스케줄러
    PCB에 있는 우선순위를 이용하여 준비 큐의 프로세스의 순위를 변경한다.

프로세스 생성

사용자 프로그램이 운영체제에게 시스템 콜로 프로세스 생성을 요청해야함. 프로세스는 자원을 필요로 하는데 운영체제로부터 받거나 부모와 공유함. 부모의 주소 공간을 복사(fork)해서 자식 프로세스를 생성함. 자식은 그 공간에 새로운 프로그램을 올림. 그러나 좀 더 효율적인 일부 운영체제에서는 COW(Copy-On-Write) 방식을 이용하는데 이 방식은 먼저 자식이 부모의 자원을 복사하지않고 같이 사용하다가 부모와 달라질때, 즉 wirte 될 때 부모의 자원을 복사함.

프로세스 종료

프로세스가 마지막 명령을 수행한 후 운영체제에게 알려줌.
부모 프로세스가 종료(kill)되면 그 아래 있는 모든 자식 프로세스도 종료된다.

프로세스 간 협력

프로세스는 보통 독립적이여서 서로의 수행에 영향을 미치지 못함. 그러나 예외적으로 협력이 필요할 때가 있는데 그럴 경우 협력 매커니즘(IPC, Interprocess Communication)이 있음.

  • message passing
    커널(OS)을 통해 프로세스 서로 간에 메세지를 보냄.
  • shared memory
    프로세스들이 서로의 주소공간을 공유함. 즉, 프로세스를 생성할 때 서로 주소공간을 겹치게 해서 겹쳐진 공간에 적힌 데이터를 공유하는 방식임.

프로세스 제어 블록(Process Control Block, PCB)

프로세스가 운영체제에게 알려주기 위해 프로세스마다 갖고있는 정보.
즉, 커널이 PCB를 갖고 있음.

  • OS가 사용하는 정보
    프로세스 상태, 프로세스 ID, 스케쥴링 정보, priority
  • CPU 관련 하드웨어 값
    Program counter, registers
  • 메모리 관련
    code, data, stack의 위치 정보

인터럽트(Interrupt)

인터럽트

외부에서 예상치 못한 이벤트가 발생함을 알리는 것.

종류

  • I/O interrupt
  • Clock interrupt
  • Console interrupt
  • System call interrupt

처리 과정

  1. 인터럽트 발생
  2. 프로세스 중단(커널 개입)
  3. 인터럽트 처리(interrupt handling)
    • 인터럽트 발생 장소 및 원인 파악
    • 인터럽트 서비스 할 것인지 결정
  4. 인터럽트 서비스 루틴 호출

프로세스 문맥(context)

프로그램이 실행되어 어디까지 실행되었는지 CPU 수행 상태를 나타내는 하드웨어 문맥.

  • 프로세스 문맥을 보면 Program Counter가 프로세스 주소공간의 code 부분에서 어떤 코드를 가리키고 있는지. 즉, 어느 코드까지 실행 했는지 알 수 있음.
  • 각 종 register에 어떤 값이 저장되어 있는 지 확인해보면 어디까지 실행되었는지 알 수 있음.
  • 프로세스 주소 공간의 code, data, stack을 통해 어디까지 실행되었는지 알 수 있음.
  • 프로세스가 시스템 콜을 이용해 운영체제에게 작업을 부탁 할 수 있음. 이러한 요청을 운영체제(커널)가 어떤 데이터를 갖고 있는 지를 통해 프로세스가 어디까지 실행 되었는지 알 수 있음.

이러한 모든 것들을 프로세스 문맥이라고 함. 이렇게 프로세스 문맥을 기록해놓는 이유는 CPU는 보통 time sharing으로 작업을 진행하기 때문에 시간이 지나 다음 작업으로 넘어갔어도 다시 돌아왔을 때 처음부터 시작하지 않고 프로세스 문맥을 참조해서 이전에 진행했던 부분 이후 부터 실행할 수 있기때문.

문맥 교환(Context Switch)

CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정.
문맥 교환이 일어나면 오버헤드가 발생함.
CPU를 내어주는 프로세스의 상태를 그 프로세스 PCB에 저장.
CPU를 새롭게 얻는 프로세스가 이전에 어디까지 작업했는지 알기위해 PCB를 읽어옴.
그렇다고 system call이나 interrupt가 발생했다고 무조건 문맥 교환이 일어나는 것은 아님.

예를 들어, 프로세스 A가 CPU를 사용하다가 interrupt나 system call이 발생해 CPU가 잠시 커널 모드(운영체제가 사용하는것)으로 넘어 갔다 다시 프로세스 A로 CPU가 왔을 때는 결국 프로세스 A -> 프로세스 A로 CPU가 넘어온 것이기에 문맥 교환이 발생한 것이 아님.
만약 프로세스 A가 CPU를 사용하다가 timer interrupt(시간초과)나 I/O 요청(시간이 오래걸림.) system call로 인해 CPU가 프로세스 B로 넘어가면 이는 문맥 교환이 발생한 것임.

스레드(Thread)

스레드


CPU의 실행 단위를 스레드라고 함. 자원은 공유하고 제어 부분만 각 스레드별로 가짐. 여러 스레드로 구성된 프로세스에서 하나의 스레드가 blocked(waiting) 상태인 동안에도 동일한 프로세스 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있음. 빠른 응답성, 자원 공유, 프로세스 하나를 만드는 것보다 스레드 하나를 만드는 것이 훨씬 간단함 등의 장점이 있음.
스레드는 프로세스마다 가지고 있는 PCB에서 CPU 관련 정보만 각 스레드마다 별도로 가지고 있음. 주소공간에서는 data와 code는 공유하고 stack 부분만 각 스레드마다 갖고 있음. 즉, 같은 프로세스의 스레드들은 동일한 주소 공간을 공유한다.

스레드마다 가지는 부분

  • program counter
  • register set
  • stack space
  • 스레드 실행 환경 정보(Stack Pointer, 우선순위 등)

스레드가 다른 스레드와 공유하는 부분

  • code
  • data
  • OS resources
  • heap

스레드를 사용하는 이유

하나의 프로세스에 하나의 스레드만 사용하는 것보다 여러개의 스레드가 병렬로 처리하는 것이 훨씬 빠르다. 동일한 프로세스내에 스레드가 있기때문에 자원을 공유하여 스레드를 생성하는 것이 프로세스를 생성하는 것보다 빠르다. 당연히 스레드 간의 교환이나 종료도 훨씬 빠르다.
자원을 공유하기 때문에 문맥교환 발생 빈도가 줄어들고 그렇기때문에 커널의 개입을 피할 수 있다.

멀티 프로세싱과의 차이점
하나의 프로그램을 실행하기 위해 여러개의 실행 단위로 나뉘어져서 병렬로 처리한다는 점에서 멀티 프로세싱(CPU가 여러개) 방법과 비슷하지만, 멀티 프로세싱은 하나의 프로그램에 여러개의 프로세스를 병렬로 처리하는 방식이고, 멀티 스레드는 하나의 프로세스에 여러개의 스레드를 병렬로 처리하는 방식이다.
그렇기 때문에 멀티 스레드의 경우 자원을 공유하므로 훨씬 효과적으로 처리할 수 있다.

스레드의 장점

  • 사용자 응답성 증가
    병렬 프로그래밍으로 하나의 스레드가 긴 작업을 수행해도 다른 스레드들이 사용자와 상호작용할 수 있음.
  • 프로세스의 자원과 메모리 공유 가능
    프로세스 자원 하나와 메모리를 공유하므로 스레드를 여러개 실행하여 시스템 성능을 향상시킬 수 있다.
  • 경제성이 좋음
    무거운 프로세스보다 가벼운 스레드를 생성하면 문맥 교환시 발생하는 오버헤드가 줄어든다.

스레드의 단점

하나의 스레드에 문제가 생기면 그 프로세스 안에 있는 모든 스레드가 피해를 입는다.
같은 데이터를 공유하기 때문에 데이터 동기화에 신경을 써야한다.

스레드의 상태(Thread State)


프로세스와 많은 공통점이 있다. 한번에 한 스레드만 실행할 수 있고, 준비, 실행, 대기, 종료 상태가 있다.
프로세스를 생성하면 하나의 스레드도 함께 생성한다. 해당 프로세스가 스택과 레지스터를 제공하기 때문에 부모 프로세스와 공유할 자원을 초기화할 필요가 없다.
스레드 한 개가 대기 상태(blocked)로 변할 때 전체 프로세스를 대기 상태로 바꾸지 않는다. 대신 다른 스레드를 실행한다.

스레드 풀링
미리 생성한 스레드를 재사용하여 스레드 생성 시간을 줄여 시스템 부담을 줄여주는 방법.

스레드 제어 블록(Thread Control Block, TCB)

프로세스처럼 스레드 또한 정보를 TCB에 저장한다. 물론 PCB에도 TCB에 대한 정보가 기록된다.

  • 실행 상태
    프로세서 레지스터, 프로그램 카운터, 스택 포인터
  • 스케쥴링 정보
    상태(실행, 준비, 대기), 우선순위, 프로세서 시간.
  • 계정 정보
  • 스케줄링 큐용 다양한 포인터
  • PCB를 포함하는 포인터

0개의 댓글