프로세스

Tasker_Jang·2일 전
post-thumbnail

1. 프로세스와 문맥

프로세스(process)는 실행 중인 프로그램입니다. 디스크에 있는 실행 파일은 프로그램이고, 그것이 메모리에 올라가 실행되기 시작하면 프로세스가 됩니다.

여러 프로세스가 CPU를 번갈아 쓰려면 문제가 하나 생깁니다. A를 잠깐 멈추고 B를 돌렸다가 다시 A로 돌아올 때, A가 어디까지 했는지 알 수 없으면 처음부터 다시 해야 합니다. 그래서 프로세스가 지금 어떤 상태인지를 통째로 기억해 둬야 하는데, 이것을 문맥(context)이라고 합니다. 문맥은 세 가지로 구성됩니다.

  • 하드웨어 문맥: CPU 수행 상태. program counter와 각종 register 값
  • 프로세스의 주소 공간: code, data, stack
  • 프로세스 관련 커널 자료 구조: PCB, 커널 스택(kernel stack)

2. 프로세스의 상태와 PCB

운영체제가 프로세스를 관리하려면 각 프로세스가 지금 무엇을 하는지 구분해야 합니다.

  • New: 생성 중
  • Ready: 메모리 등 다른 조건은 다 갖췄고 CPU만 기다리는 상태
  • Running: CPU를 잡고 명령을 수행 중
  • Blocked(wait, sleep): I/O 같은 오래 걸리는 작업을 기다리는 상태. CPU를 줘도 할 일이 없음
  • Terminated: 수행이 끝났고 정리 중

이런 정보를 프로세스마다 담아두는 곳이 PCB(Process Control Block)입니다. 운영체제가 각 프로세스를 관리하기 위해 프로세스당 하나씩 유지하는 커널 자료 구조입니다.

분류담는 내용
OS 관리용 정보프로세스 상태, 프로세스 ID, 스케줄링 정보, 우선순위
CPU 수행 관련 하드웨어 값program counter, register
메모리 관련code, data, stack의 위치 정보
파일 관련열어둔 파일 목록

3. 문맥 교환

문맥 교환(context switch)은 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정입니다. 넘겨받기 전에 A의 하드웨어 문맥을 A의 PCB에 저장하고, B의 PCB에서 B의 문맥을 꺼내 CPU에 복원합니다. 이 작업 동안 CPU는 어떤 프로세스의 일도 하지 않으므로 순수한 비용입니다.

여기서 가장 헷갈리는 지점이 있습니다. 시스템콜이나 인터럽트가 발생한다고 반드시 문맥 교환이 일어나는 것은 아닙니다. 커널로 들어갔다가 같은 프로세스로 돌아오면 모드만 바뀌었을 뿐 문맥 교환이 아닙니다.

작은 예제

CPU 하나에 프로세스 A, B, C가 있고 A부터 실행합니다.

시각사건이후 실행문맥 교환
0msA 실행 시작A-
3msA가 키보드 인터럽트를 받음, 처리 후 복귀A없음
5msA가 디스크 읽기 시스템콜 → A는 BlockedB있음 (A → B)
15msB 실행 중 타이머 인터럽트C있음 (B → C)
18msA의 디스크 읽기 완료 인터럽트 → A는 ReadyC없음

3ms와 18ms는 인터럽트가 있었지만 같은 프로세스로 돌아왔으므로 문맥 교환이 아닙니다. 5ms는 A가 더 진행할 수 없어서, 15ms는 B의 할당 시간이 끝나서 CPU 주인이 바뀌었습니다.

4. 스케줄링 큐

상태를 구분했으면 같은 상태끼리 줄을 세워야 합니다.

  • job queue: 시스템에 있는 모든 프로세스의 집합
  • ready queue: 메모리에 올라와 CPU를 기다리는 프로세스
  • device queue: 특정 I/O 장치의 처리를 기다리는 프로세스

실제로 줄을 서는 것은 프로세스의 PCB입니다. 프로세스는 이 큐들을 오가면서 수행됩니다. Ready 큐에서 CPU를 받고, I/O를 요청하면 해당 device queue로 가고, 끝나면 다시 ready 큐로 돌아오는 식입니다.

5. 스케줄러와 degree of multiprogramming

누가 어느 큐로 갈지 결정하는 주체가 스케줄러입니다. 결정하는 대상에 따라 셋으로 나뉩니다.

스케줄러다른 이름결정하는 것호출 빈도
long-termjob scheduler새 프로세스 중 어떤 것을 메모리에 올려 ready로 보낼지드묾
short-termCPU schedulerready 중 어떤 프로세스에 CPU를 줄지매우 잦음 (ms 단위)
medium-termswapper메모리에 있는 프로세스 중 어떤 것을 통째로 쫓아낼지메모리가 부족할 때

degree of multiprogramming은 메모리에 동시에 올라가 있는 프로세스의 수입니다. 이 값이 너무 크면 각 프로세스가 쓸 메모리가 부족해 전체가 느려집니다. long-term 스케줄러는 들어오는 쪽을 막아서, medium-term 스케줄러는 올라간 것을 쫓아내서 이 값을 조절합니다. 강의 기준으로 시분할 시스템은 보통 long-term 스케줄러 없이 바로 ready로 보내고, 조절은 medium-term 스케줄러가 맡습니다. 메모리 부족이 성능에 어떤 영향을 주는지는 가상 메모리 편에서 다룹니다.

6. Blocked와 Suspended

swapper가 쫓아낸 프로세스는 새로운 상태가 됩니다. Suspended(stopped)입니다. Blocked와 둘 다 "멈춰 있다"는 점은 같지만 성격이 다릅니다.

구분BlockedSuspended
원인자신이 요청한 이벤트(I/O 등)를 기다림외부 요인 (메모리 부족, 사용자의 정지 등)
복귀 조건이벤트가 만족되면 스스로 Ready외부에서 resume해 줘야 Active
메모리메모리에 있음통째로 swap out

Suspended는 원래 무엇을 하다 멈췄느냐에 따라 둘로 나뉩니다. Ready에서 멈추면 Suspended Ready, Blocked에서 멈추면 Suspended Blocked입니다. Suspended Blocked 상태에서 기다리던 I/O가 끝나면 Suspended Ready로 바뀝니다. I/O는 끝났지만 여전히 외부에서 resume해 주기 전까지는 돌아올 수 없습니다.

7. 프로세스 상태도

profile
ML Engineer 🧠 | AI 모델 개발과 최적화 경험을 기록하며 성장하는 개발자 🚀 The light that burns twice as bright burns half as long ✨

0개의 댓글