참고 자료 : 혼자 공부하는 컴퓨터구조 + 운영체제
사진 출처 : Operating System Concepts 10E
1. 프로세스 개요
<실행 중인 프로그램, 프로세스>
1. 프로세스 확인하기
- foreground process: 사용자가 볼 수 있는 공간에서 실행
- background process: 사용자가 볼 수 없는 공간에서 실행
- 사용자와 상호작용 o
- 사용자와 상호작용 x - daemon, service
<프로세스 제어 블록>
1. 개요
- 모든 프로세스는 실행을 위해 CPU가 필요하다. but CPU 자원은 한정되어있음
- 그 결과 한정된 시간만큼만 CPU 사용해야함
- 자신의 차례에 정해진 시간만큼 CPU 이용
- 타이머 인터럽트 발생하면 다음 프로세스 실행
2. 프로세스 제어 블록 (PCB)
- 빠르게 번갈아 수행되는 프로세스 관리를 위해 사용하는 자료구조
- 프로세스 관련 정보 저장 (상품에 달린 태그와 같은 역할)
- 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기
- PCB에 담기는 정보
- 프로세스 ID (PID)
- 레지스터 값
- 존재 이유: 마지막으로 어디까지 연산 수행했는지 기억하려고
- 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 (프로그램 카운터, 스택 포인터)
- 프로세스 상태
- 입출력 장치를 사용하기 위해 기다리는 상태
- CPU를 사용하기 위해 기다리는 상태
- CPU 이용중인 상태 등
- CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU 할당 받을 것인지
- 메모리 정보
- 프로세스가 어느 주소에 저장되어 있는지
- 페이지 테이블 정보
- 사용한 파일과 입출력 장치 정보
<문맥 교환(context switch)>
1. Context Switch 과정
- 프로세스 A에서 프로세스 B로 실행 순서가 넘어가면?
- 기존에 실행되던 프로세스 A의 중간 정보(context)를 백업
- 프로세스 B의 context 복구
- 다시 프로세스 A 차례가 오면 중간 정보를 기반으로 다시 복구
2. Context Switch
- 기존의 실행 중인 프로세스 문맥을 백업하고, 새로운 프로세스 실행을 위해 문맥을 복구하는 과정
<프로세스의 메모리 영역>
1. 코드 영역 (텍스트 영역)
- 실행할 수 있는 코드 (기계어로 이루어진 명령어 저장)
- 데이터가 아닌 CPU가 실행할 명령어가 담겨있음 (read-only)
- 크기 고정 (정적 할당 영역)
2. 데이터 영역
- 잠깐 썻다가 없어지는 데이터가 아니라 프로그램이 실행되는 동안 유지할 데이터 저장
- 크기 고정 (정적 할당 영역)
- ex) 전역변수
3. 힙 영역
- 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
- 할당하면, 언젠가는 반환(해제)를 해주어야 함
- cf) garbage collection
- 동적 할당 영역
4. 스택 영역
- 데이터가 일시적으로 저장되는 공간
- ex) 매개변수, 지역변수
- 동적 할당 영역
2. 프로세스 상태와 계층 구조
<프로세스 상태>
1. 생성 상태
- 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비가 완료되었다면, 준비 상태로 이동
2. 준비 상태
- 당장이라도 CPU를 할당받아서 실행할 수 있지만,
- 자신의 차례가 아니기에 기다리는 상태, 자신의 차례가 된다면 실행 상태로 이동 (디스패치)
3. 실행 상태
- CPU를 할당 받아 실행 중인 상태
- 할당된 시간 모두 사용 시 (타이머 인터럽트 발생) 준비 상태로 이동
- 실행 도중 입출력장치 사용하면, 입출력 작업이 끝날 때까지 대기 상태로 이동
4. 대기 상태
- 프로세스가 실행 도중 입출력 장치를 사용하는 경우
- 입출력 작업은 CPU에 비해 느리기 때문에 대기 상태로 접어둠
- 입출력 작업이 끝나면 (입출력 완료 인터럽트 발생하면) 준비 상태로 이동
5. 종료 상태
- 프로세스가 종료된 상태
- PCB, 프로세스의 메모리 영역 정리
<프로세스 계층 구조>
- 프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능
- 새 프로세스를 생성한 프로세스: 부모 프로세스
- 부모 프로세스에 의해 생성된 프로세스: 자식 프로세스
- 부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 PID가 다르다.
- 일부 OS는 자식 프로세스 PCB에 부모 프로세스 PID (PPID)를 명시하기도 함
- 부모 -> 자식 -> 자식 -> ... : 계층 구조 형성
<프로세스 생성 기법>
1. 개요
- cf) 윈도우 운영체제와 관련은 없음
- 질문
- 부모 프로세스는 자식 프로세스를 어떻게 만들어내는가
- 자식 프로세스는 어떻게 자신만의 코드를 실행하는가
- 답
- 복제와 옷 갈아입기
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성 (복제)
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체 (옷 갈아입기)
2. 프로세스 생성 기법
- fork 시스템 호출
- 복사본(자식 프로세스) 생성, 부모와 같은 복사본
- 부모 프로세스의 자원 상속
- 부모 프로세스의 메모리 영역을 복사해서 가져온다.
- exec 시스템 호출
- 메모리 공간을 새로운 프로그램으로 덮어쓰기
- 코드/데이터 영역은 실행할 프로그램 내용으로 바뀜
- 나머지 영역은 초기화
3. 스레드
<스레드란>
1. 스레드란
- 프로세스를 구성하는 실행 흐름의 단위
- 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
- 단일 스레드 프로세스
- 멀티 스레드 프로세스
- 프로세스를 이루는 여러 명령어 동시 실행 가능
2. 스레드의 구성 요소
- 스레드 ID
- 레지스터 값 (프로그램 카운터)
- 스택 값
- 실행에 필요한 최소한의 정보
- 코드, 데이터 영역, 자원을 공유함 (위 사진 참고)
<멀티 프로세스와 멀티 스레드>
1. 멀티 프로세스
- 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 (a)
- 프로세스 끼리는 자원 공유 x
- 프로세스 fork하면, 모든 자원이 복제된다.
- 저장된 메모리 주소를 제외하고 모든 것이 동일한 프로세스가 메모리에 적재된다. (중복!)
- cf) 실제로는 "copy on write" 해서 중복 저장을 없애주긴 함!
- 독립적으로 실행된다.
- IPC : 프로세스 간 통신
- 프로세스간에 자원을 주고 받을 수 있기는 하다.
- 스레드 간 통신 보다는 어려움
- 파일, 공유 메모리를 통해서 IPC 수행
2. 멀티 스레드
- 하나의 프로세스를 여러 스레드로 실행 (b)
- 스레드 끼리는 같은 프로세스 내 자원 공유 o
- 레지스터 값, 스택 값 만 가지고,
- 코드, 데이터, 힙, 파일 영역은 공유한다.
- 협력과 통신에 유리하다.
- 하나의 스레드가 문제 생기면, 전체 프로세스에 문제가 생길 가능성이 있다. (단점)