프로세스와 스레드

프로세스의 두 가지 특성

  • 자원 소유권

    • 프로세스는 자신의 이미지를 위한 가상주소 공간 포함
    • 프로세스 이미지
      • 프로세스 제어 블록에 정의되어 있는 프로그램과 데이터, 스택, 속성들의 집합
    • 자원들에 대한 제어와 소유권을 할당 가능
    • 운영체제의 보호 기능
      • 프로세스들 간에 자원에 대한 불필요한 간섭 방지
  • 스케줄링/수행

    • 하나 이상의 프로그램을 통화하는 수행 경로(궤적)을 따름
    • 다른 프로세스들과 번갈아가면서(인터리빙) 수행될 수 있음
    • 수행 상태와 디스패칭 우선순위를 가지며, 운영체제에 의해 스케줄되고 디스패치
  • 이러한 두 가지 특성은 서로 독립적이며 운영체제에 의해서 독립적으로 취급될 수 있다.

  • 디스패칭 단위

    • 스레드(thread) 또는 경량 프로세스(lightweight process)
  • 자원 소유권의 단위

    • 프로세스 또는 태스크(task)

멀티스레딩(Multithreading)

하나의 프로세스 내에서 수행되는 여러 개의 스레드를 지원하는 기능 각 운영체제 따라서 프로세스와 스레드를 지원하는 범위가 다르다.

  • MS-DOS

    • 단일 프로세스
    • 단일 스레드
  • UNIX 계열 일부

    • 다중 사용자 프로세스
    • 프로세스당 하나의 스레드
  • Java 실행 환경(JRE)

    • 단일 프로세스
    • 다수의 스레드
  • Windows, Solaris, 많은 UNIX

    • 다수 프로세스
    • 프로세스당 다수의 스레드
  • 멀티스레드 환경에서 프로세스는 보호의 단위와 자원할당의 단위로 정의됨

프로세스

  • 프로세스의 이미지를 유지하는 가상 주소 공간(virtual address space)
  • CPU, 다른 프로세스, 파일, 입출력 자원에 대한 접근 제어(보호된 접근)
  • 장점
    • 짧은 생성시간, 종료시간, 쓰레드 간 교환 시간
    • 효율적인 통신

스레드

  • 프로세스는 하나 이상의 스레드를 가지며 다음 사항들을 포함
    • 스레드 수행 상태(수행, 준비 등)
    • 수행중이 아닐 때 저장되어 있는 쓰레드 문맥
    • 수행 스택
    • 지역변수 저장을 위해 각 스레드가 사용하는 어떤 정적 저장소
    • 프로세스의 메모리 및 자원에 대한 접근으로, 메모리 및 자원은 프로세스 내의 모든 스레드에 의해 공유

스레드와 프로세스의 차이점

단일 스레드 프로세스

  • 프로세스 제어블록
  • 사용자 주소공간
  • 사용자 스택과 커널 스택(하나의 스택 형태에서 나뉘어져 있음)
    • 프로세스 수행 중 함수 호출/복귀 행위 관리
  • 프로세스 수행/비수행 상태에 따라 처리기 레지스터에 대한 동작
    • 수행 상태 처리기 레지스터 내용 제어
    • 비수행 상태 처리기 레지스터 내용 저장

멀티스레드 프로세스

단일스레드와의 공통점

  • 하나의 프로세스 제어블록(공유)
  • 하나의 사용자 주소공간(공유) 프로세스 내의 모든 스레드들은 그 프로세스 상태와 자원 공유(같은 주소 공간 + 동일한 데이터 접근)

멀티스레드만의 차이점

  • 스레드마다의 별도 스택(사용자 스택 + 커널 스택)
  • 스레드마다 레지스터값, 우선순위, 그 외의 스레드 관련 상태 정보를 포함하는 별도의 제어블록(사용중인 레지스터를 회피하기 위함)
  • 수행에 관련된 대부분의 상태 정보가 스레드 수준의 자료구조에 의해 유지됨

스레드의 주된 장점 📚📚📚

  • 새로운 프로세스 생성 시간보다 새로운 스레드 생성 시간이 더 짧음
  • 프로세스 종료시간보다 스레드 종료시간이 더 짧음
  • 프로세스들 간 교환보다 같은 프로세스에 있는 두 스레드 간 교환이 효율적임(커널의 개입 없이 문맥 교환만 이루어지기 때문)
  • 서로 다른 수행 프로그램 간 통신에서 효율적임

단일 사용자 멀티프로세싱 시스템에서 스레드 사용 예시

  • 전면(foreground)과 후면(background) 작업
    • 프로그램에서 이전 명령이 완료되기 전에 다음 명령을 신속하게 수행함으로써 응용의 속도 향상
  • 비동기(asynchronous) 처리
    • 운영체제를 통한 주기적인 백업 및 직접 자신을 스케줄 하는 작업 복잡한 코드 작성 필요가 줄어듦
  • 빠른 수행
    • 어떤 데이터 묶음(batch)를 계산하면서 동시에 어떤 장치로부터 데이터 묶음을 읽어들일 수 있음 한 스레드가 특정 데이터 묶음을 읽기 위해 입출력 작업 완료를 기다리면서 블록(block)될지라도 또 다른 스레드 수행
  • 모듈 프로그램 구조
    • 다양한 활동 or 입출력 연산에 대한 다양한 출발 및 목적지를 포함하고 있는 프로그램의 경우 스레드를 통한 구현이 편리
  • 보류(suspension)
    • 모든 스레드는 같은 주소 공간을 공유하기 때문에 swap out될 경우 모든 스레드가 동시에 보류 상태가 되므로 주의

스레드 기능

스레드 상태

  • 생성(spawn)
    • 프로세스가 생성되면 프로세스를 위한 스레드도 함께 생성
    • 프로세스 내에서 다른 스레드 생성 가능
    • 새로 생성된 스레드를 위한 명령 포인터와 인자 제공
    • 새로운 스레드는 자신의 레지스터 문맥과 스택 공간을 가지며 준비 큐에 위치
  • 블록(Block)
    • 스레드가 어떤 사건을 기다려야 할 때 스레드는 블록
    • 블록 될 때 자신의 사용자 레지스터, 프로그램 카운터, 스택 포인터 저장
    • 동일 프로세스 내 or 다른 프로세스 내에 있는 준비 상태의 다른 스레드 수행 가능
  • 비블록(Unblock)
    • 스레드가 블록되어 기다리던 사건이 발생되었을 때 그 스레드는 준비 큐로 이동
  • 종료(Finish)
    • 스레드가 작업을 완료하면 레지스터 문맥과 스택이 해제

스레드의 블록과 프로세스의 블록 연관성

한 스레드의 블록이 전체 프로세스를 블록시키는지의 여부 사용자 수준 스레드(user-level thread)커널 수준 스레드(kernel-level thread) 따라 다름

전체 프로세스를 블록시키지 않는 스레드의 성능상 장점 - 두 개의 원격 프로시저 호출(RPC: Remote Procedure Call)

  • 단일 스레드를 이용한 RPC의 경우 결과를 순차적으로 얻게 됨 각 서버로부터 응답이 오기를 순서대로 기다려야 함

  • 단일 처리기 상에서 서버마다 한 스레드를 사용한 RPC의 경우 각각의 RPC에 대하여 독립된 스레드 사용 처리 속도의 향상
  • 단일 처리기일 경우 요청이 순차적으로 생성되고 결과 또한 순차적으로 처리되지만 프로그램은 두 응답을 동시에 기다림

  • 단일 처리기 상에서 멀티프로세싱과 멀티스레드
    • 멀티프로그래밍으로 인해 여러 프로세스 내의 여러 스레드들이 번갈아가며 수행
    • 수행 중인 스레드가 블록되거나 정해진 시간 할당량을 모두 소비하면 수행 흐름은 한 스레드에서 다른 스레드로 넘어감
    • 스레드 A와 B는 각각 번갈아가며 실행됨
    • 다른 프로세스에서 생성된 스레드 C는 프로세스 1 전체와 프로세스 2가 번갈아 실행되면서 스레드가 수행됨

스레드 동기화

프로세스 내의 모든 스레드는 주소 공간과 열린 파일과 같은 자원 공유 하나의 스레드에 의한 자원의 변경은 같은 프로세스 내에 존재하는 모든 스레드의 환경에 영향 스레드들이 서로 간섭하지 않도록/자료 구조를 손상시키지 않도록 스레드의 행위를 동기화