조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다
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라는 그룹 식별자를 부여함
출처
'OS' 카테고리의 다른 글
[쉽게 배우는 운영체제] 4-2. CPU 스케줄링: 인터럽트 처리 (0) | 2024.12.12 |
---|---|
[쉽게 배우는 운영체제] 4-1. CPU 스케줄링 (0) | 2024.12.12 |
[쉽게 배우는 운영체제] 3-2. 프로세스와 스레드: 스레드 (0) | 2024.12.12 |
[쉽게 배우는 운영체제] 2. 컴퓨터의 구조와 성능 향상 (0) | 2024.01.11 |
[쉽게 배우는 운영체제] 1. 운영체제 개요 (1) | 2023.12.26 |