⚡프로세스 개요
💻프로세스 직접 확인하기
🎮프로세스 제어 블록
- 모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU 자원은 한정되어 있다.
- 그렇기에 프로세스들은 돌아가며 한정된 시간만큼 CPU를 이용한다.
- 타이머 인터럽트가 발생하면 차례를 양보한다.
프로세스 제어 블록 (PCB)
- 빠르게 번갈아 수행되는 프로세스들을 관리할 때 사용하는 자료구조
- 프로세스와 관련된 정보를 저장 (상품에 달린 태그와 같은 정보)
- 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기
PCB에 담기는 정보
-
프로세스 ID (PID)
특정 프로세스를 식별하기 위해 부여하는 고유한 번호
-
레지스터 값
프로세스는 자신의 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 후 이전 작업 이어서 실행한다.
PC , SP 등의 값들이 담긴다.
-
프로세스 상태
-
CPU 스케줄링 정보
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
-
메모리 정보
프로세스가 어느 주소에 저장되어 있는지에 대한 정보
페이지 테이블 정보 (메모리 주소 알 수 있는 정보)
-
사용한 파일과 입출력장치 정보
할당된 입출력장치, 사용 중인 파일 정보
📖문맥 교환
- A 프로세스에서 B 프로세스로 넘어가면 A는 레지스터 값, 열었던 파일, 사용한 입출력장치 등의 중간정보를 백업해야한다.
이러한 중간정보를 문맥이라고 한다.
문맥
- 다음 차례가 왔을 때 실행을 재개하기 위한 정보
- 실행 문맥을 백업해두면 해당 프로세스의 실행을 재개할 수 있다.
문맥 교환
- 기존 프로세스의 문맥을 PCB에 백업
- 새로운 프로세스 실행위해 문맥을 복구하는 과정
🔔프로세스의 메모리 영역
- 프로세스가 생성되면 커널 영역에 PCB가 생성된다.
그렇다면 사용자 영역에는 프로세스가 어떻게 배치되나?
코드 영역 (텍스트 영역)
- 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담겨 쓰기가 금지된 영역
데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터 저장
- 전역변수가 대표적이다.
힙 영역
- 사용자가 직접 할당할 수 있는 저장 공간
- 힙 영역에 메모리 공간을 할당했다면 해당 공간을 반환해야 한다.
- 반환하지 않으면 메모리 내에 계속 남아 메모리 낭비를 초래한다.
→ 메모리 누수라고 말한다.
스택 영역
- 데이터가 일시적으로 저장되는 공간
- 데이터 영역과 달리 잠깐 쓰다가 말 값들이 저장
- 매개 변수, 지역 변수가 대표적이다.
-
코드영역, 데이터 영역은 크키가 변하지 않는다.
→ 정적 할당 영역이라고도 부른다.
-
힙 영역, 스택 영역은 크기가 변할 수 있다.
→ 동적 할당 영역이라고도 부른다.
- 힙 영역은 낮은 주소 → 높은 주소로 할당
- 스택 영역은 높은 주소 → 낮은 주소로 할당
- 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 없게 하기 위해서.
🍁프로세스 상태와 계층 구조
🎯프로세스 상태
생성 상태
- 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비가 완료된 프로세스는 바로 실행되지 않고 준비 상태가 된다.
준비 상태
- 당장 CPU를 할당 받아 실행할 수 있지만
- 자신의 차례가 아니기에 기다리는 상태
- 차례가 되면 실행 상태가 된다 (=디스패치)
실행 상태
- CPU를 할당 받아 실행 중인 상태
- 할당된 시간 모두 사용 시 (타이머 인터럽트 발생 시) 준비 상태로
- 실행 도중 입출력장치 사용하면 작업 끝날 때까지 대기 상태로
대기 상태
- 프로세스가 실행 도중 입출력 장치 사용하는 경우
- 입출력 작업은 CPU에 비해 처리 속도가 느리기에 기다려야 한다.
- 입출력 작업 완료되면 준비 상태로
종료 상태
- 프로세스가 종료된 상태
- PCB, 프로세스가 사용한 메모리 정리
🎹프로세스 계층 구조
- 프로세스 실행 도중 시스템 호출을 통해 다른 프로세스 생성 가능
- 부모 프로세스 : 새 프로세스 생성한 프로세스
- 자식 프로세스 : 생성된 프로세스
- 부모 프로세스와 자식 프로세스는 다르기 때문에 서로 다른 PID를 가진다.
일부 운영체제에서는 자식 PCB에 부모의 PID(PPID)가 기록되기도 한다.
🔨프로세스 생성 기법
부모 프로세스는 자식 프로세스를 어떻게 만들고
자식 프로세스는 어떻게 자신만의 코드를 실행하나?
복제와 옷 갈아입기
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다.
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork 시스템 호출
- 복사본 (자식 프로세스) 생성
- 부모 프로세스의 자원 상속
exec 시스템 호출
- 메모리 공간을 새로운 프로그램으로 덮어쓰기
- 코드 / 데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역 초기화
🔎스레드
📊프로세스와 스레드
스레드
- 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
단일 스레드 프로세스
- 실행 흐름이 하나인 프로세스
멀티 스레드 프로세스
- 실행 흐름이 여러 개인 프로세스
- 프로세스를 이루는 여러 명령어 동시 실행 가능
스레드의 구성 요소
- 스레드 ID, PC를 비롯한 레지스터 값, 스택 등
- 실행에 필요한 최소한의 정보만을 유지, 프로세스 자원을 공유하며 실행
📌멀티프로세스와 멀티스레드
- 멀티프로세스 : 여러 프로세스를 동시에 실행하는 것
- 멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것
차이점
- 프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유한다.
프로세스의 경우
-
프로세스를 fork하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨.
-
PID, 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스가 메모리에 적재됨.
-
같은 프로그램 실행을 위해 동일한 내용들이 중복해 존재하기에 낭비라고 볼 수 있다.
-
자원을 공유하지 않는다. -> 독립적으로 실행
+) 프로세스 간에도 자원을 주고받을 수 있다 : 프로세스 간 통신 (IPC)
파일, 공유 메모리 등을 통해서 가능하다.
스레드의 경우
-
프로세스가 가지고 있는 자원을 공유해 메모리를 더 효율적으로 사용 가능.
-
자원을 공유한다 -> 협력과 통신에 유리하다.
그러나 하나의 스레드에 문제가 생기면 전체에 문제가 생길 수 있다.