Skip to content
난이도 면접 빈출문제은행 4

프로세스와 스레드 ​

프로세스(process)는 실행 중인 프로그램이고, 스레드(thread)는 그 프로세스 안에서 실제로 CPU를 받아 명령어를 실행하는 흐름이다. 이 문서는 먼저 프로세스를 다룬다. 운영체제가 프로세스마다 무엇을 기억하는지, 프로세스가 어떤 상태를 오가는지, CPU를 다른 프로세스에 넘길 때 무엇을 저장하고 어떤 비용을 치르는지 본다.

프로그램과 프로세스 ​

프로그램은 디스크에 저장된 실행 파일, 즉 명령어와 초기 데이터의 묶음일 뿐이다. 이걸 실행하면 커널(kernel)이 메모리에 올리고 실행에 필요한 자원을 붙여 프로세스로 만든다. 그래서 같은 프로그램을 두 번 실행하면 프로세스가 두 개 생기고, 둘은 서로의 메모리를 볼 수 없다.

프로세스 하나가 받는 메모리는 보통 네 영역으로 나뉜다.

영역담는 것크기
코드실행할 기계어(machine code) 명령어고정
데이터전역 변수·정적 변수고정
힙(heap)실행 중에 malloc·new로 받는 메모리실행 중 늘고 줄어듦
스택(stack)함수 호출마다 쌓이는 지역 변수·돌아갈 위치실행 중 늘고 줄어듦

정적 변수는 함수 안에 선언해도 프로그램이 끝날 때까지 값이 남는 변수다. malloc(C)과 new(C++·Java)는 실행 중에 필요한 만큼 메모리를 달라고 요청하는 명령이다.

PCB: 커널이 프로세스를 기억하는 방법 ​

커널은 프로세스마다 PCB(Process Control Block, 프로세스 제어 블록)라는 관리 정보를 만든다. PCB에는 프로세스를 구분하는 번호인 PID(Process ID, 프로세스 식별 번호)와 지금 상태가 들어 있다. 또 CPU 레지스터(register)에 있던 값, 이 프로세스의 메모리가 어디에 있는지 알려 주는 메모리 위치 정보, 열어 둔 파일 목록도 함께 담긴다. 이 정보가 있어야 CPU를 잠시 다른 프로세스에 넘겼다가 나중에 멈춘 자리에서 정확히 이어서 실행할 수 있다. 특히 다음에 실행할 명령어 위치를 담는 프로그램 카운터(program counter) 값이 PCB에 저장돼야 "어디까지 했는지"를 잃지 않는다.

프로세스의 상태 ​

프로세스는 생겨서 끝날 때까지 몇 가지 상태를 오간다. CPU 코어(core) 하나는 한 순간에 하나만 실행하므로, 나머지는 줄을 서거나 무언가를 기다린다.

다이어그램 로딩…
  • 생성(new): 커널이 PCB를 만들고 메모리를 붙이는 중이라 아직 실행할 수 없는 상태다.
  • 준비(ready): 실행할 수 있지만 CPU 차례를 기다리는 상태다. 준비 상태의 프로세스들은 준비 큐(ready queue)에 줄을 선다.
  • 실행(running): CPU를 받아 명령어를 실행하는 상태다. 스케줄러(scheduler)가 정한 시간 조각인 타임 슬라이스(time slice)를 다 쓰면 준비 상태로 돌아간다.
  • 대기(blocked): 디스크 읽기처럼 오래 걸리는 입출력을 기다리는 상태다. 기다리는 동안 CPU를 쥐고 있으면 낭비이므로 CPU를 내놓는다. 입출력이 끝났다는 인터럽트(interrupt)가 오면 다시 준비 상태가 된다.
  • 종료(terminated): 실행이 끝나 커널이 자원을 거둬 가는 상태다.

문맥 교환 ​

문맥 교환(context switch)은 CPU가 실행하던 프로세스의 상태(레지스터 값 등)를 그 PCB에 저장하고, 다음 프로세스의 PCB에서 상태를 불러와 실행을 바꾸는 일이다. 여러 프로그램이 동시에 도는 것처럼 보이는 이유가 이것이다. 실제로는 CPU가 아주 짧은 간격으로 실행 대상을 바꾼다.

문맥 교환은 공짜가 아니다. 저장·복원하는 동안 CPU는 사용자 코드를 실행하지 못한다. 더 큰 비용은 전환 뒤에 따라온다. 캐시 메모리(cache memory)에는 앞 프로세스가 쓰던 데이터가 들어 있어서, 새 프로세스가 쓸 데이터는 대부분 메모리에서 다시 가져와야 한다. TLB(Translation Lookaside Buffer, 변환 색인 버퍼)에는 앞 프로세스의 주소 변환 결과가 들어 있는데, 새 프로세스는 주소 공간(address space, 프로세스가 쓸 수 있는 메모리 주소의 범위)이 달라 그 결과를 그대로 쓸 수 없다. 그래서 전환이 너무 잦으면 CPU 시간 대부분이 실제 일이 아니라 전환에 쓰인다.

이어지는 내용은 프로세스와 스레드 2에서 다룬다.

면접 포인트 ​

  • "프로그램과 프로세스의 차이는?" → 프로그램은 디스크의 실행 파일, 프로세스는 커널이 메모리에 올리고 자원을 붙인 실행 중인 프로그램. 같은 프로그램을 두 번 실행하면 프로세스가 두 개 생긴다.
  • "PCB에는 무엇이 들어 있나요?" → PID, 상태, 레지스터 값(프로그램 카운터 포함), 메모리 위치 정보, 열어 둔 파일 목록. 멈춘 자리에서 정확히 이어 실행하려면 필요하다.
  • "입출력이 끝난 프로세스는 바로 실행되나요?" → 아니다. 대기에서 준비 상태로 돌아가 스케줄러의 선택을 다시 기다린다.
  • "문맥 교환 비용은?" → 저장·복원하는 시간보다, 전환 뒤 캐시 메모리·TLB를 다시 채우는 비용이 더 크다.

관련 문서