Skip to content

Latest commit

 

History

History
196 lines (119 loc) · 10.1 KB

프로세스와 스레드.md

File metadata and controls

196 lines (119 loc) · 10.1 KB

프로세스

: 실행 중인 프로그램
하드 디스크와 같은 보조 기억 장치에 저장되어 있는 (수동적인)실행코드를 프로그램이라고 하며,
이 프로그램을 메모리에 로드해서 실행되고 있는 작업 단위를 프로세스라고 한다.
운영체제로부터 시스템 자원을 할당받는 작업의 단위이자, CPU 스케줄링의 대상이 되는 작업의 단위이다.

프로세스의 구성요소

image

  • 프로그램 실행 코드(code)
  • data, heap, stack
  • program counter (PC)
  • CPU register contents
PCB (Process Control Block)

PCB

Process Control Block.
PCB는 운영 체제가 프로세스를 표현한 것이다.

운영체제에 따라 PCB에 포함되는 항목이 다를 수 있지만, 일반적으로는 다음과 같은 정보가 포함되어 있다.

PCB 포함 정보

  • Process number (process id = pid) : pcb 개수 만큼 프로세스 생성 가능
  • program counter (PC) : 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
  • CPU registers : 프로세스가 실행되는 중에 사용하던 레지스터, 누산기(accumulator), 색인 레지스터(index register), 스택 포인터(stack pointer)와 같은 레지스터의 값이 저장된다. 이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관한다.
  • 프로세스 상태
  • CPU 스케쥴링 정보 : 우선 순위, 최종 실행시각, CPU 점유시간 등
  • 메모리 관리 정보 : 해당 프로세스의 주소 공간 등 (ex. memory limits)
  • 프로세스 계정 정보 : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
  • 입출력 상태 정보: 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등

프로세스 상태

image

  • New : 프로세스가 생성되었을 때
  • Running : 프로세스(명령)가 실행되고 있을때 (프로세서(코어)당 오직 한개의 running 프로세스만 가질 수 있음)
  • Waiting : 어떠한 이벤트의 발생(ex. I/O)을 기다리고 있는 상태 (ex. 전화를 받고 있는 학생..)
  • Ready : 프로세스가 프로세서에 할당되기를 기다리고 있는 상태 (당장 CPU를 할당받을 수 있는 상태)
  • Terminated : 프로세스가 실행을 끝낸 상태

interrupt 예 : 프로세스에 할당된 시간 초과시 scheduler dispatch : CPU가 할당할 프로세스를 고르는 일

프로세스 스케쥴링 큐

  • Job Queue : 시스템(한 대의 컴퓨터?)내의 모든 프로세스들의 집합
  • Ready Queue : 메인 메모리에 존재하는 모든 프로세스들의 집합. 실행될 준비가 되었거나 실행을 기다리고 있는 작업들이 모여있는 큐. 적당량의 프로세스 개수가 유지된다.
  • Device Queues : 입출력 device를 기다리고 있는 프로세스들의 집합 (device마다 하나의 device queue를 가짐)

프로세스들은 이 큐들을 이동함

프로세스 연산

프로세스 생성

프로세스는 부모 프로세스가 자식 프로세스를 생성하는 방식이다. 따라서 프로세스는 트리(계층) 구조로 되어있다.

  • fork()

    프로세스의 생성은 fork( ) 시스템 콜을 이용한다. fork( )를 이용하면 부모를 그대로 복사하여 현재 프로세스와 pid만 다른 프로세스를 생성한다. 즉, 같은 동작을 하는 프로세스가 두 개 존재하게 되며, 새로운 프로세스는 원래의 프로세스 주소 공간의 복사본을 포함한다.

    두 프로세스는 fork( ) 뒤의 명령어들을 계속 수행한다. 이때 현재 프로세스가 부모 프로세스인지 자식 프로세스인지는 fork( )의 반환 값으로 구분한다. 부모는 fork()의 반환 값으로 0보다 큰 수(자식 프로세스의 pid)를 갖고, 자식은 fork()의 반환 값으로 0을 갖는다.

  • exex()

    fork( ) 다음에 이어지는 exec( ) 시스템 콜은 새로운 프로그램을 메모리에 올려 실행시킨다. exec( ) 시스템 콜은 어떤 프로그램을 완전히 새로운 프로세스로 태어나도록 하는 역할을 하며, 프로세스는 exec( ) 시스템 콜을 통해 다른 프로그램을 수행할 수 있다. 따라서 기존엔 부모 프로세스를 그대로 복사한 상태지만 exec( ) 시스템 콜로 인해 다른 새 프로그램으로 덮어씌워진다.

    image

  • wait()

    wait( ) 시스템 콜은, 만약 프로세스 A가 wait( )를 호출하면 커널은 자식이 종료될 때까지 A를 Sleep(blocked)시킨다. 그리고 자식 프로세스가 종료되면 커널이 A를 깨워 Ready 상태로 만든다.

    따라서 만약 자식이 먼저 수행되기를 원하면 위와 같이 wait( )를 else문(parent가 실행하는 코드)에 넣어주면 된다.

    image

프로세스는 다음과 같이 각 연산시 취하는 모델에 따라 분류된다.

▶ 자원 공유 (Resource sharing option)

  • 부모와 자식이 모든 자원을 공유하는 모델
  • 부모와 자식이 자원의 일부를 공유하는 모델
  • 전혀 공유하지 않는 모델

▶ 수행 (Execution)

  • 부모와 자식이 공존하며 동시에 수행되는 모델
  • 자식이 종료될 때까지 부모가 기다리는 모델

▶ 주소 공간(Address space)

  • 자식이 부모의 공간을 복제하는 모델
  • 자식이 해당 공간에 새로운 프로그램을 올리는 모델

프로세스 종료

  • exit(자발적 종료)

    끝까지 다 끝나서 정상적으로 종료하는 것 (정상 종료)

    현재 프로세스가 마지막 statement를 수행하면, 운영체제에 exit() 명령어를 통해서 이를 알려준다.
    그러면 부모 프로세스가 현재 프로세스의 실행을 종료시키고, wait를 통해 자식으로부터 상태 값(status value)을 수집한다. 프로세스의 각종 자원들은 운영체제에 반납된다.

  • abort (비자발적 종료)

    부모가 자식 프로세스를 강제로 종료시킨 것 (비정상 종료)

    부모 프로세스가 자식 프로세스의 수행을 종료시킬 수도 있다. 자식이 할당된 자원의 한계치를 넘어서거나, 자식에게 할당된 작업이 더 이상 필요하지 않거나, 부모 프로세스가 종료되는 경우이다.
    운영체제는 부모 프로세스가 종료되는 경우 자식이 계속 수행되는 것을 허용하지 않기 때문에 단계적으로 자식들을 종료시켜나간다.
    프로세스의 비정상적인 종료로 인해 Zombie processOrphan process 같은 유형의 프로세스가 존재할 수 있다.

Inter-Process Communication(IPC)

프로세스 간 통신 방법(프로세스 협력 메커니즘)에는 크게 두가지 모델이 있다.

image

  • Shared Memory Model : 공유 메모리 영역을 사용하는 방법
  • Message Passing Model : 메세지를 전달하는 방법 (2가지로 나뉨)

스레드

image

  • 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.
  • 프로세스는 하나 이상의 스레드를 갖고 있다. (메인스레드 포함)
  • 멀티 코어 시스템에서 task들을 병렬적으로 실행하기 위해 고안됨
  • 한 프로세스의 스레드들끼리는 code와 data 영역을 서로 공유한다.

이점

  • 반응성 향상

    상호작용하는 응용 프로그램 (조금씩(thread하나씩)) 로딩되는게 사용자에게 보임

  • 자원 공유

    threaded process 와 coorperationg processes 두 방식 모두 자원을 공유한다.
    하지만 coorperation processes 방식은 프로세스간의 통신(IPC)이 필요한 반면
    한 프로세스의 스레드들끼리는 code와 data 영역을 서로 공유하기 때문에 별도의 통신이 필요하지 않다.
    따라서 비용이 적게드는 스레드 방식이 더 효율적이다.

  • 경제적

    스레드를 생성하고 context-switching 하는 방법이
    프로세스를 생성하고 context-switching 하는 방법보다 간단하다.

  • 멀티 프로세스 아키텍처의 사용

    싱글 스레드 프로세스는 오직 하나의 CPU에서만 실행될 수 있지만
    멀티스레스 프로세스는 프로세스 하나의 작업을 여러개의 CPU에서 실행할 수 있다.
    멀티프로세서 환경에서 멀티 스레드를 사용함으로써 한 프로세스 작업의 Paralleism이 가능하다. (병렬처리)

스레드 종류

User Threads

OS는 큰단위(프로세스)만 알고 있고 관리하며
user level의 threads library가 스레드를 관리하는 방법 (스레스 스케쥴링 등)
ex. POSIX Pthreads, Win32 threads, Java threads

Kernel Threads

OS도 스레드를 알고 있고 OS가 스레드를 관리하는 방법
스레드 스케쥴링도 OS가 함
ex. Windows XP/2000, Solaris, Linux, Tru64 UNIX, Max OS X

출처
심광섭 교수님 운영체제 교안
https://ko.wikipedia.org/wiki/스레드_(컴퓨팅)
https://rebro.kr/172 https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html