요약

운영체제는 프로세스를 만들 때 번호를 주고, 메모리를 주고, 신상 카드(PCB)를 채워 준비 줄에 세운다. 실행 중인 프로세스를 바꿀 때는 지금 프로세스의 레지스터 값을 카드에 적고, 다음 프로세스의 카드에서 값을 꺼내 되살린다. 운영체제 코드로 잠깐 넘어가는 것(모드 전환)과 실행하는 프로세스 자체를 바꾸는 것(프로세스 전환)은 다르다. 앞쪽은 싸고, 뒤쪽은 비싸다.

예시로 보기

워드 프로세서를 쓰다가 저장 버튼을 누른다. 그사이 무슨 일이 일어나는지 따라가 보자.

  1. 워드 프로세서가 “파일을 써 달라”는 시스템 호출을 한다. 프로세서가 커널 모드로 바뀌어 운영체제 코드가 실행된다. 여기까지는 모드 전환이다. 아직 실행 중인 프로세스는 워드 프로세서다.
  2. 운영체제가 디스크에 쓰기를 시작한다. 디스크는 느리므로 워드 프로세서는 기다려야 한다. 운영체제는 워드 프로세서의 상태를 대기로 바꾼다.
  3. 운영체제가 준비 큐에서 음악 플레이어를 골라 실행시킨다. 여기서 프로세스 전환이 일어난다.
  4. 디스크 쓰기가 끝나면 인터럽트가 온다. 운영체제는 워드 프로세서를 준비 큐로 옮긴다. 음악 플레이어를 계속 실행할지, 워드 프로세서로 바꿀지는 스케줄러가 정한다.
sequenceDiagram
  participant W as 워드 프로세서
  participant K as 운영체제
  participant D as 디스크
  participant M as 음악 플레이어
  W->>K: 파일 쓰기 시스템 호출, 모드 전환
  K->>D: 쓰기 시작
  Note over W: 대기 상태
  K->>M: 프로세스 전환, 음악 플레이어 실행
  D->>K: 쓰기 완료 인터럽트
  Note over W: 준비 상태, 다음 차례는 스케줄러가 정함

첫 화살표에서는 실행 중인 프로세스가 그대로 워드 프로세서다. 프로세서를 쓰는 프로세스가 바뀌는 것은 세 번째 화살표에서다1.

정확히 말하면

생성

프로세스가 만들어지는 경우는 넷이다. 배치 작업 제출, 사용자 로그인, 운영체제가 서비스(예: 인쇄)를 위해 만듦, 기존 프로세스가 새 프로세스를 낳음(spawn)이다. 마지막 경우 낳은 쪽을 부모 프로세스, 생긴 쪽을 자식 프로세스라고 부른다2.

운영체제는 다음 순서로 만든다.

  1. 고유한 프로세스 번호를 준다.
  2. 프로세스 이미지(프로그램, 데이터, 스택)를 둘 공간을 준다.
  3. PCB를 초기화한다. 상태는 보통 준비, 레지스터는 0이나 시작 주소로 채운다2.
  4. 연결을 만든다. 예: 스케줄링 큐로 쓰는 연결 리스트에 새 프로세스를 넣는다.
  5. 그 밖의 자료 구조를 만든다. 예: 계정 정보 파일.

종료

프로세스가 끝나는 경우는 정상 종료뿐 아니라 여럿이다.

종류 예
스스로 정상 종료(배치 작업의 정지 명령, 사용자 로그오프, 종료 서비스 요청)
한계를 넘음 시간 제한 초과, 사건을 너무 오래 기다림(timeout), 메모리 부족
오류 허락된 범위 밖 메모리 접근(bounds violation), 보호 오류(읽기 전용 파일에 쓰기), 산술 오류, 입출력 실패, 잘못된 명령어(데이터를 명령어로 실행), 사용자 모드에서 특권 명령어 실행, 데이터 오용
남이 끝냄 운영체제의 개입(예: 교착상태), 부모가 끝나서 자식도 끝남, 부모의 요청

언제 프로세스를 바꾸나

운영체제가 프로세서를 되찾는 때는 셋이다.

계기 예 프로세스 전환
인터럽트 (지금 명령어와 무관한 바깥 사건) 시계: 시간 조각을 다 씀. 입출력 완료. 메모리 오류: 찾는 주소가 주기억장치에 없어 가져와야 함 시간 조각이 끝났거나 지금 프로세스가 기다려야 하면 바꾼다
트랩 (지금 명령어가 일으킨 오류) 0으로 나누기 등 치명적이면 종료 상태로 옮기고 바꾼다
시스템 호출 (supervisor call) 파일 열기 호출이 기다려야 하는 일이면 대기로 옮기고 바꾼다

모드 전환과 프로세스 전환

  모드 전환 프로세스 전환
일어나는 일 사용자 모드 ↔ 커널 모드. 지금 프로세스의 문맥을 저장하고 운영체제 코드를 실행한 뒤 돌아온다 실행 중인 프로세스 자체가 바뀐다
상태 변화 지금 프로세스는 계속 실행 상태 지금 프로세스는 준비·대기·종료 등으로, 다른 프로세스는 실행으로
비용 작다 크다

인터럽트가 왔다고 늘 프로세스가 바뀌는 것은 아니다. 처리기가 끝나고 같은 프로세스로 돌아오면 모드 전환만 일어난 것이다2.

프로세스 전환의 단계

  1. 프로세서의 문맥(PC와 다른 레지스터)을 저장한다.
  2. 지금 프로세스의 PCB를 고친다. 상태를 실행에서 준비·대기·종료 중 하나로 바꾸고, 계정 정보를 갱신한다.
  3. 그 PCB를 알맞은 큐(준비, 대기)로 옮긴다.
  4. 다음에 실행할 프로세스 P를 고른다.
  5. P의 PCB를 고친다. 상태를 실행으로 바꾼다.
  6. 메모리 관리 자료 구조를 고친다. 예: 페이지 표 레지스터가 P의 페이지 표를 가리키게 한다.
  7. P의 실행 문맥(레지스터, PC 등)을 되살린다.

운영체제 코드는 누가 실행하나

운영체제 코드를 어디서 돌리느냐로 세 방식이 있다.

방식 내용
프로세스 밖 커널 커널은 어느 프로세스에도 속하지 않는다. 운영체제 코드는 특권 모드에서 도는 별도 존재다
사용자 프로세스 안에서 실행 운영체제 코드가 사용자 프로세스의 문맥 안에서 돈다. 프로세스가 운영체제 코드를 실행할 때 특권 모드가 된다. 이때 프로세스 전환 없이 모드 전환만 일어난다
프로세스 기반 운영체제 운영체제의 주요 기능이 각각 별도 프로세스다

활용

  • UNIX는 fork() 시스템 호출로 부모를 복제해 자식을 만든다. 그 뒤 자식이 exec()로 다른 프로그램을 싣는다2.
  • 프로세스 전환은 레지스터만이 아니라 메모리 관리 정보(6단계)와 캐시 내용까지 바뀌어 비싸다. 같은 프로세스 안 스레드끼리 바꾸면 6단계가 필요 없어 싸다2.
  • 사용자 수준 스레드는 모드 전환조차 없애서 더 싸다.

연결

확인 문제

C1 다음 각각에서 모드 전환만 일어나는가, 프로세스 전환까지 일어나는가? ① 프로그램이 현재 시각을 묻는 시스템 호출을 하고 바로 답을 받는다. ② 프로그램이 키보드 입력을 기다리는 읽기 호출을 한다. ③ 시간 조각이 끝나 시계 인터럽트가 온다.

답: ① 모드 전환만. 운영체제가 바로 답하고 같은 프로세스로 돌아온다. ② 프로세스 전환까지. 입력이 올 때까지 기다려야 하므로 대기로 옮기고 다른 프로세스를 실행한다. ③ 보통 프로세스 전환까지. 지금 프로세스를 준비로 돌리고 다른 프로세스를 고른다. 준비 큐가 비어 있으면 같은 프로세스가 다시 실행될 수도 있다.

C2 프로세스 전환의 일곱 단계를 순서대로 쓰라.

답: ① 프로세서 문맥 저장 ② 지금 프로세스 PCB의 상태·계정 정보 갱신 ③ PCB를 알맞은 큐로 옮김 ④ 다음 프로세스 P 선택 ⑤ P의 PCB를 실행 상태로 갱신 ⑥ 메모리 관리 자료 구조 갱신 ⑦ P의 문맥 복원.

C3 프로세스 전환에서 6단계(메모리 관리 자료 구조 갱신)를 빼먹으면 어떤 일이 생기는가?

답: 새 프로세스 P가 앞 프로세스의 페이지 표로 주소를 바꾼다. P가 자기 주소라고 낸 값이 앞 프로세스의 메모리를 가리켜, 남의 데이터를 읽거나 덮어쓴다. 프로세스 격리가 깨진다.

  1. “예시로 보기”의 1~4단계를 순서도로 옮겼다. ↩

  2. 부모·자식 용어, PCB 초기화 내용, 모드 전환과 프로세스 전환의 비교, fork()·exec(), 스레드 전환이 싼 이유, 확인 문제는 Stallings, Operating Systems: Internals and Design Principles 6판, 3.2·3.4절을 따랐다. ↩ ↩2 ↩3 ↩4 ↩5