OS

[쉽게 배우는 운영체제] 3-1. 프로세스와 스레드: 프로세스

noahkim_ 2024. 12. 11. 21:55

조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다

 

1. 개요

프로그램 vs 프로세스

프로그램
  • 어떤 데이터를 사용하여 어떤 작업을 할지 절차를 적어놓은 것
  • 저장장치에 저장되어 있는 정적인 상태

 

프로세스
  • 작업이 진행되고 있는 프로그램
  • 메모리에 올라온 동적인 상태

 

프로세스로의 전환

프로그램을 메모리에 로드
PCB 생성
  • 프로세스를 관리하기 위한 핵심 데이터 구조
  • PID, Process state, Process Number, Program Counter, Register, Memory limits
  • FDT (오픈된 파일을 식별하기 위한 File Descriptor 정보 테이블)
    • 커널은 시스템 전체에서 오픈된 파일을 System open-file table로 관리함
    • 커널은 Active vnode table로 파일 시스템의 inode 정보를 캐싱함
    • FDT는 System open-file table의 항목을 참조하여 파일 작업을 수행

 

프로세스 상태가 변경될 때마다(Context Switching)
  • PCB 정보를 사용하여 이전 상태를 복원하고 작업을 이어감
  • CPU Register, PC, Memory 중간 값이 기록됨

 

프로세스 종료
  • 프로세스가 종료되면 PCB와 관련된 모든 정보가 삭제되고 자원이 반환됨

 

프로세스 상태

Created
  • 프로그램이 메모리에 로드됨
  • OS로부터 PCB를 할당받음
  • 생성된 후 준비상태가 되고, 자기 순서를 기다림

 

Waiting
  • 자기 실행순서를 기다리는 상태
  • PCB는 Ready Queue에서 기다림
  • CPU Schduler에 의해 관리됨

 

Running
  • 프로세스가 CPU를 할당받아 실행되는 상태
  • 할당된 time slice 시간 만료
    • timeout(PID) 호출됨
    • Running -> Waiting으로 변경됨
  •  I/O 호출
    • block(PID) 호출됨
    • Running -> Blocked로 변경됨
    • CPU Scheduler는 새로운 프로세스를 실행상태로 가져옴 (dispatch(PID) 호출)
  • 할당된 time slice 동안 모든 작업 완료
    • exit(PID) 호출됨
    • Running -> Completed로 변경됨

 

Blocked
  • 입출력을 요청할 경우, 입출력이 완료될 때까지 기다리는 상태
    • 입출력 장치별로 마련된 Ready Queue에서 기다림
  • 입출력이 완료되면 
    • 입출력 관리자로부터 wakeup(PID)가 호출됨
    • 입출력 작업이 완료되었다는 인터럽트 신호가 CPU에 전송됨

 

Terminated
  • 프로세스가 종료되는 상태
  • exit()이 호출됨
    • exit(0): 정상종료
    • exit(1): 비정상종료
  • 커널: PCB 폐기
  • 메모리: data, code 삭제

 

보류 상태

프로세스가 메모리에서 잠시 쫓겨난 상태
  • 메모리가 꽉 찬 경우
  • 프로그램에 오류가 있어 실행을 미룰 경우
  • 바이러스 프로세스로 판단되는 경우

 

스왑 영역
  • 프로세스는 메모리 밖으로 쫓겨나 스왑 영역에 보관됨

 

보류 대기 상태 (Swapped out and Blocked)
  • 재시작 시 대기 상태로 들어감

 

보류 준비 상태 (Swapped out and Waiting)
  • 재시작 시 준비 상태로 들어감

 

휴식 상태

프로세스가 실행을 중단하고 waiting or blocked로 전환된 상태를 의미함
  • 사용하던 데이터가, PCB가 그대로 있음
  • 멈춘 지점에서 재시작할 수 있음

 

명령어
  • 일시 중지: Ctrl + Z
  • 재시작: fg or bg
  • 강제 종료: Ctrl + C

 

2. PCB와 Context Switch

PCB

  • Pointer: Blocked or Waiting 상태의 프로세스를 대기큐에 관리할 때 사용됨
  • Process State
  • PID, PPID, CPID
  • Program Counter
  • Registers: 이전까지 작업했던 중간값들이 기록됨
  • Memory Limits: 운영체제에서 사용하는 메모리 관리 시스템에 대한 정보 (페이지 테이블, 세그먼트 테이블 등)
  • Open File Lists: 프로세스가 사용하는 오픈된 파일 목록
  • 계정 정보: 계정 번호, CPU 할당시간, CPU 사용시간 등

 

Context Switch

  • OS가 CPU를 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 작업
  • CPU가 실행시키는 프로세스의 PCB를 교환

 

절차
  • 현재 실행중인 프로세스의 상태를 저장
  • 새로 실행할 프로세스의 상태를 로드
  • CPU 제어권 전환
    • (새로운) 프로세스 실행

 

종류
  • 프로세스 간 전환
    • 두 개의 서로 다른 사용자 프로세스 간에 이루어짐
  • 스레드 간 전환
    • 동일한 프로세스 내에서 스레드가 전환됨
  • 커널 모드와 사용자 모드 간 전환
    • 시스템 호출 처리 시 발생

 

발생 상황
  • timeout
  • interrupt
  • i/o call
  • system call

 

3. 프로세스 구조

운영체제는 프로세스를 실행할 때 프로그램과 데이터를 관리하기 위해 메모리를 여러 영역으로 나눔

 

Text Area (Code Area)

  • 프로그램의 코드가 기술된 곳
  • 읽기 전용

 

Data Area

  • 변수 및 데이터가 저장되는 공간
  • 프로그램이 종료될 떄까지 유지됨
  • initialized data
  • uninitialized data

 

Stack Area

  • 함수 호출 시 생성되는 데이터를 저장하는 임시 메모리 공간
  • 스택 프레임이라는 구조체로 관리 (지역 변수, 매개 변수, 반환 주소, 반환 값)
  • 함수 호출이 끝나면, 할당된 메모리는 자동으로 해제됨

 

Heap Area

  • 런타임에 동적으로 할당되는 데이터 영역
  • 포인터로 접근 가능

 

4. 프로세스 연산

fork()

프로세스 생성 및 복사
  • 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수
  • 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 됨

 

장점
  • 프로세스의 생성 속도가 빠름 (메모리에서 복사)
  • 자원 상속 가능
  • 시스템 관리를 효율적으로 할 수 있음
    • 자식 프로세스를 종료하면 부모가 자식을 정리함
    • CPID, PPID로 연결되어 있음

 

exec()

프로세스의 내용만 바꿈
  • 구조체를 재활용하기 위함
  • code, data 영역: 덮여짐
  • stack 영역: 비워짐
  • PID, PPID, CPID: 보존됨

 

5. 프로세스 계층 구조

  • 커널이 처음 메모리에 올라와 부팅이 되면, 커널 관련 프로세스를 여러개 만듬
  • 그 중, init 프로세스는 전체 프로세스의 부모가 됨
    • 자식 프로세스를 생성함 (fork(), exce() 시스템 콜 이용)

 

고아 프로세스

  • 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스
  • 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료될 경우, 연락이 안될 수 있음
    • 자식 프로세스의 자원이 정상적으로 반환되지 못함

 

장점

여러 작업의 동시 처리
  • fork() 호출로 프로세스를 여러개 만들어 사용자에게 나누어줌

 

용이한 자원 회수

 

6. 프로세스 실행 과정

프로세스 그룹

커널이 터미널 제어권을 관리하기 위한 목적으로 사용됨
  • 터미널은 하나의 프로세스만 실행하도록 제어권을 가짐
    • 실행중인 프로세스가 다른 하위 프로세스를 실행시킬 수 있음
    • 이러한 경우 하위 프로세스들도 동일한 터미널에서 실행됨
  • 터미널은 이 프로세스 그룹의 제어권을 가짐
    • 어떤 프로세스가 입력을 받고 출력을 담당할지 결정함

 

PGID라는 그룹 식별자를 부여함

 

 

출처