DEVELOP
article thumbnail

본 게시물은 운영체제 과목의 강의영상과 강의자료를 바탕으로 작성한 학습용 게시물입니다.


프로세스 정의

# 프로세스

: 실행 중인 프로그램 

  • 시스템 콜을 통해 자원을 요구하는 주체 
  • 멀티 프로세싱 혹은 멀티 태스킹 
  • 사용자 프로세스 - 응용 프로그램이 실행되는 것 
  • 시스템 프로세스 - 운영체제가 필요에 의해 생성 

문맥과 문맥교환

# 문맥 (Context)

 : 프로세스의 실행 중단 시 보존되고, 속개 시 다시 원상 복구되어야하는 프로세스의 모든 실행 정보

  • 사용자 수준 문맥 (User-level context)  - 메인 메모리 현재 상태 
    - 텍스트 영역 : 프로그램 코드 부분 
    - 자료 영역 : 프로그램 광역변수 부분 
    - 스택 영역 : 프로그램 실행시간 스택 부분
  • 커널 수준 문맥 (Kernel-level context) - 커널이 관리하는 내용 
    - CPU 내의 각종 특수 레지스터의 내용 : 프로그램 카운터 (PC), 스택 포인터 (SP), CPU 상태 레지스터(PCR)
    - CPU 내의 각종 범용 레지스터 내용 
    - 프로세스의 현재의 각종 자원 사용 정보 
    - 커널의 프로세스 관리 정보 

# 커널 수준 문맥 

  • CPU 내의 특수 레지스터의 내용 
    - 프로그램 카운터 (PC)
    - 스택 포인터 (SP)
    - CPU 상태 레지스터(PCR) (모드비트)
  • CPU 내의 각종 범용 레지스터 - 일반 계산용 
  • 프로세스의 현재의 각종 자원 사용 정보 
  • 커널의 프로세스 관리 정보 

# 문맥 교환 

  • CPU를 다른 프로세스로 넘기는 작업
  • 실행이 정지되는 프로세스의 문맥은 보존되고, 새로 실행되는 프로세스의 문맥이 활성화됨
    - 사용자 수준 문맥은 메모리에 남아 있음
    - CPU에 있던 레지스터의 내용들은 추후의 복구를 위해 저장되고, 스케쥴링된 새로운 프로세스의 문맥이 적재(store) 됨

# 문맥교환 시점 

  • 비자발적 문맥교환 
    - 시분할 기반의 스케쥴링(타임 슬라이스 소진)
    - 인터럽트로 인해 CPU 선점 당함 
  • 자발적 문맥교환
    - 프로세스 스스로 입출력 요청을 함
    - 프로세스 스스로 다른 프로세스가 보낼 시그널에 대한 대기 요청을 하여 CPU를 반납

 


프로세스의 상태 천이

# 프로세스의 상태

  • 생성 : 프로세스가 생성된 상태 
  • 준비 : CPU의 배정을 기다리는 상태
  • 실행 : 프로세스가 CPU에 의해 실행되고 있는 상태 
  • 대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태 
  • 종료 : 프로세스가 종료된 상태 

프로세스 상태 천이도

# 준비 상태 

  • 스케쥴링에 의해 언제든지 실행이 될 수 있는 상태 
    - 준비 리스트 또는 준비 큐에서 기다리고 있게 됨 
  • 준비상태로 천이되어 오는 경우 
    - 프로세스 생성 후, 선정되어 CPU 할당을 대기 
    - 프로세스가 실행되던 도중에 비자발적인 문맥교환 일어남 
    - 대기하고 있던 입출력 또는 시그널 사건이 완료된 경우 

# 실행 상태 

  • CPU가 프로세스를 수행하는 상태 
  • CPU를 회수 당하거나 반납할 때까지 실행 상태에 있게됨 
    - 회수당할 경우 준비상태로 천이, 반납할 경우 대기 상태로 천이 
  • 사용자 모드 실행 : 사용자나 라이브러리 코드가 실행되고 있는 상태 
  • 커널 모드 실행 : 프로세스가 시스템 호출을 해 커널 내부로 진입해 커널의 코드부분이 실행되는 상태 

# 대기 상태 

  • 사용자 프로세스가 시스템 호출을 통한 입출력 요구나, 사건 발생 대기 중에는 CPU에 의해 수행될 필요x →반납
    - CPU 반납 후 입출력 완료 또는 사건 발생 시까지 대기
    - 사건의 종류별로 구성된 대기 리스트로 이동 
    - 사건 발생시, 즉 사건 완료 시에는 준비 상태로 천이
  • 대기 상태 중에도 I/O 는 진행됨
  • CPU와 I/O를 overlap 할 수 있는 기반이 됨 

PCB (Process Control Block)

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

  • 프로세스의 일생 동안 해당 프로세스의 모든 정적 및 동적인 정보를 가짐 
    - 커널 내의 프로세스 문맥 정보를 저장하는 자료 구조 
  • 커널이 프로세스를 관리하기 위한 실체 
    - 커널은 PCB를 통해 프로세스 관리 
  • 준비리스트나 대기리스트는 결국 PCB의 리스트 
  • 실행 상태 시에 PCB는 준비 리스트에 존재, 상태표시만 RUNNING 상태로 변경 
  • 프로세스 각자의 PCB에 각자의 문맥과 상태를 save하고 restore 하면서 프로세스들이 번갈아가며 수행

시스템 호출, 인터럽트, 문맥교환

  1. 시스템 호출 처리
  2. 대기에 의한 문맥 교환
  3. 인터럽트에 의한 디스크 입출력의 처리
  4. 상태천이와 PCB의 이동 

# 상태천이 예시 ( read() )

  1. (사용자모드) 프로세스 A가 수행중인 상태에서 read() 시스템 콜 호출 
  2. (커널모드) 하드디스크 구동 
  3. 프로세스 A가 대기상태로 천이
  4. 프로세스 B가 수행상태가 됨 
  5. 프로세스 A가 준비상태로 천이
  6. 프로세스 B가 준비상태로 천이 
  7. 프로세스 A가 다시 수행상태로 천이 - read() 시스템 콜의 return 과정 수행 

프로세스의 생성과 종료

  • fork 시스템 콜을 통해 생성 
  • exit 시스템 콜 호출로 종료 
  • 부모 프로세스가 fork()를 호출하지만 부모와 자식 두곳으로 fork()로부터의 리턴이 일어남 
    - 부모 : 자식의 PID
    - 자식 : 0
  • 동일한 프로그램을 수행하는 가상적인 CPU가 하나 만들어져 따로 실행을 시작하게 된 것으로 생각
  • 사용자 문맥의 text는 공유, data, stack 공간은 별도로 생성 , PCB 생성 (커널문맥도 별도 존재)

# 자원 상속과 문맥 

  • PCB 생성 후 Cloning
  • 자원 상속 
    - 자식은 부모로부터 속성, 자원 등을 상속 
  • 레지스터 문맥 복제 
    - 부모의 특수 레지스터 및 범용 레지스터 값도 자식의 초기값으로 복제되나 수행되는 즉시 값들은 달라짐 
  • 사용자 수준 문맥 복제 
    - text 영역은 공유 
    - data, heap, stack 영역은 복사되어 별도 할당 

# exec family의 사용 

  • 디스크의 프로그램을 새로운 프로세스로 생성하기 위해 fork+exec 사용 
  • 자식이 생성된 후 자신의 주소 공간에 디스크로부터 새로운 프로그램을 적재해 수행시킴
  • PCB의 정보 및 부모 자식 관계 등은 유지한 채, text, data, stack 영역이 새로운 프로그램을 위한 것으로 교체
    → 새로운 문맥 탄생 

# 프로세스의 종료 

  • exit() 시스템 콜 통해 커널에 자신의 종료 요청
  • abort() 사용해 다른 프로세스의 종료 요청 
    - 주로 부모만 → fork의 리턴값이 자식의 PID인 이유
  • main 함수 끝까지 도달해 return이 일어남 

쓰레드 (thread)

  • 전통적 프로세스 
    - 프로세스 간 공유변수 갖기 어려움 
    - 운영체제가 제공하는 특수 구조체난 공유파일 사용 
    - fork 시 text만 공유하고 나머지 모두를 복사해 생성하므로 시간적 오버헤드와 메모리 낭비 
  • 쓰레드 
    - 텍스트와 데이터는 공유, 스택만 따로 
    - 전역 변수를 자료교환 수단으로 사용 
    - 생성이 더 빠르고 자원 점유 적음 

# 쓰레드 

  • 사용자 프로세스 입장에서 보면 하나의 프로세스를 여러 CPU가 수행중인 것으로 볼 수 있음 
  • 장점 
    - 응답성, 자원 공유, 경제성, 다중처리기 구조 활용 
  • 한 프로세스 내에서 여러 프로세스가 동시에 동작되도록 하려면 시분할 단위를 쓰레드로 
    - 레지스터 문맥을 쓰레드 별로 관리하면서 이 레지스터 문맥을 대상으로 문맥 교환을 하도록 

# TCB (Thread Control Block)

: CPU 관련 정보를 가지고 있는다. 

- 하나의 쓰레드 만들어질 때마다 TCB 확장 

 

# 사용자 쓰레드 vs. 커널 쓰레드

: 사용자 입장에서는 별 차이 x

  • 사용자 쓰레드 : 응용프로그램의 라이브러리에 의해 관리 
    - 단점 : 한 쓰레드가 blocking I/O 상태면 다른 쓰레드도 block
    - 장점 : 커널에 의해 관리될 필요 x → 관리 빠름 
  • 커널 쓰레드 : 커널 자체적으로 쓰레드를 만들어 관리 
    - 단점 : 생성, 관리 느림
    - 장점 : 한 쓰레드가 블로킹되어도 다른 쓰레드에 영향 x 
  • 혼합형 모델  - 대부분 두 가지 형태의 쓰레드 모두 지원 

# 다중 쓰레드 모델

  • 다-대-일 모델
  • 다-대-다 모델
  • 일-대-일 모델

# 쓰레드 스케쥴링 범주 

  • 쓰레드가 지원되는 운영체제에서는 프로세스가 아닌 쓰레드가 스케쥴 대상 
  • PCS (Process-Contention Scope)
    - 사용자 라이브러리에 의해 사용자 레벨 쓰레드에 대해 스케쥴링이 이루어지는 범주 
  • SCS(System-Contention Scope) 
    - CPU 할당을 위해 시스템 내 모든 커널 쓰레드에 대해 스케쥴링이 이루어지는 범주 
profile

DEVELOP

@JUNGY00N