Process & Thread

happiyoung_·2026년 1월 30일

운영체제

목록 보기
3/11

1. 프로세스

CPU에 의해 수행되는 시스템 및 사용자 프로그램

  • 프로그램 카운터의 값과 처리기 레지스터의 내용으로 대표되는 현재 활동을 포함
  • 프로그램은 디스크에 저장된 파일의 내용과 같은 수동적인 존재 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 연관된 자원의 집합을 가진 능동적인 존재

특징

  • 실행중인 프로그램
  • 프로세서가 할당되는 개체
  • 프로시저가 실행중인 것
  • 샐행중인 프로시저 제어의 경로
  • 비동기적 행위
  • 디스패치가 가능한 단위
  • PCB를 가진 프로그램

프로세스 상태 전이도

  1. 생성상태 : 사용자가 요청한 작업이 커널에 등록되어 커널공간에 PCB 생성된 상태
  2. 준비 (Ready) 상태 : 프로세스가 기억장치를 비롯한 모든 필요한 자원들을 할당받은 상태에서 프로세서를 할당받기위해 기다리고 있는 상태
  3. 실행 (Execute) 상태 : 프로세스의 프로그램코드가 기억장치로부터 읽혀지면서 프로세서에 의해 실행되고 있는 상태
  4. 대기 (Block) 상태 : 프로세스가 원하는 자원을 할당받지 못해서 기다리고 있는 상태
  5. 완료(Finish) 상태 : 프로세스가 자신의 연산을 모두 마치면 완료상태로 전환되고 그 프로세스에 할당되었던 모든 자원 해제

프로세스가 전이되는 시기와 이유

  1. dispatch : 준비상태 → 실행 상태
    • 준비상태의 프로세스들 중에서 우선순위가 가장 높은 프로세스를 선정하여 CPU 할당
    • 단기 프로세스 스케줄러에 의해 선택된 프로세스가 실질적으로 CPU를 할당
  2. Time Run Out : 실행상태 → 준비상태
    • 지정된 CPU의 할당 시간을 모두 사용한 프로세스는 다른 프로세스가 CPU를 선점하고, 그 프로세스는 준비상태로 전환
  3. Block : 실행 → 대기
    • 실행중인 프로세스가 입출력명령을 만나면 입출력 인터럽트가 발생하여 입출력 전용 프로세서 (DMA)가 입출력을 완료할 때까지 CPU를 반납하고 대기상태로 전환
  4. Wake up : 대기 → 준비
    • 입출력 완료를 기다리다가 입출력 완료 신호가 들어오면, 대기중인 프로세스는 준비상태로 전환

프로세스 제어블록 (PCB)

운영체제에게 프로세스에 대한 모든 정보를 제공해 주는 자료구조 테이블

  • 운영체제가 CPU를 다른 프로세스에게 넘기고 다시 그 프로세스를 가져올때 저장된 PCB 재사용

PCB의 정보

  • 프로세스의 현상태
  • 프로세스의 고유한 식별자
  • 부모프로세스 포인터
  • 자식프로세스 포인터
  • 프로세스 우선순위
  • 프로세스가 위치한 메모리에 대한 포인터
  • 할당된 자원에 대한 포인터
  • 프로그램 카운터
  • 중앙처리장치 레지스터 보관장소

2. 스레드 (Thread)

프로세스 구성을 제어흐름부분과 실행환경부분으로 나눌때, 프로세스의 실행부분을 담당. 실행의 기본단위

  • 각 스레드는 독립적인 제어흐름을 가지고, 자신만의 스택과 레지스터 가짐
  • 한 프로세스 안에 있는 다른 스레드들과 코드, 데이터, 운영체제 자원등을 공유
  • 스레드들도 중앙처리장치를 공유, 준비, 블록, 수행, 종료 등 여러 상태들중 하나의 상태로 있기 가능
  • 한 프로세스 내에 여러개의 스레드 존재 가능
  • 빠른 속도의 문맥 교환가능
  1. 공유 영역 : 코드, 정적 전역 데이터, 힙, 커널데이터
  2. 사유영역 : 스택, 지역데이터, 프로그램카운터, 레지스터 집합

다중 스레드 장점

  • 응답성: 응용프로그램의 일부분 봉쇄가능, 긴 작업수행시 프로그램 수행 계속되는 것을 허용
  • 자원공유
  • 경제성
  • 다중처리기 구조의 활용 : 병렬 가능
구분코드데이터스택레지스터
단일 프로세스공유공유공유1개1개
다중 스레드공유공유공유스레드별스레드별

3. 스레드 구현 방법

1) 커널 수준 (시스템 호출 ) 스레드

  • 커널이 스레드 관리
  • 스레드가 봉쇄형 시스템 콜을 수행하면 커널은 응용프로그램내의 다른 스레드의 수행을 스케줄 가능
  • 인터럽트를 통한 이전 → 수행시간 많음
  • 태스크 내의 스레드도 독립적으로 스케줄 가능

2) 사용자수준 (라이브러리) 스레드

  • 커널위에서 지원되며 사용자 수준의 스레드 라이브러리에 의해 구현
  • 모든 스레드 생성과 스케줄링은 커널의 개입없이 사용자 공간에서 이루어짐
  • 운영체제는 스레드 인식 못함 → 운영체제의 호출 시에 프로세스 전체가 기다리게 됨 (스케줄링 불공평)

프로그램 실행시 메모리 영역 구조

  1. 컴파일 시 크기 결정
    1. code (text) : 함수, 제어문, 상수 (쓰기 금지)
    2. data : 전역변수, 정적 변수
    3. bss (blocked stated symbol) : 초기화 안된 전역변수
  2. 실행중 메모리 할당
    1. heap : 동적할당 malloc, new
    2. stack : 지역변수, 매개 변수

0개의 댓글