활동 내용

Chapter 9 ~ 11, 운영체제, 프로세스와 스레드, CPU 스케줄링까지

  • 기본 미션: p. 304의 확인 문제 1번 풀고 인증하기
  • 선택 미션: Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기

정리

운영체제

프로그램 실행에 필요한 요소들을 시스템 자원이나 자원이라고 한다. 이 자원을 각 프로그램마다 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램이 운영체제(operating system)이다.
운영체제는 커널 영역이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지 영역인 사용자가 이용하는 응용 프로그램이 적재되는 영역은 사용자 영역이라고 한다.

커널

커널(kernel)은 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되는 기능같은 운영체제의 핵심 서비스를 담당한다. 운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데 대표적으로 사용자 인터페이스(UI, User Interface)와 그래픽 유저 인터페이스(GUI, Graphical User Interface)가 있다.

이중 모드와 시스템 호출

이중 모드(dual mode)란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다. 사용자 모드(user mode)는 운영체제의 서비스를 제공받을 수 없는 실행 모드이며, 커널 모드(kernel mode)는 운영체제의 서비스를 제공받을 수 있는 실행 모드이다.
운영체제는 커널 모드로 실행되어 있다. 그러나 일반적인 응용 프로그램들은 사용자 모드로 실행되어 있기에 자원에 접근할 수 없다. 그렇기에 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출(system call)이라고 한다.
또한, 시스템 호출은 소프트웨어 인터럽트이다. 그렇기에 시스템 호출이 발생하면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 인터럽트 서비스 루틴을 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속한다.

프로세스

프로세스(process)는 실행 중인 프로그램을 의미한다. 컴퓨터가 부팅되는 순간부터 많은 프로세스들이 실행된다. 그리고 컴퓨터에서 확인해보면 사용자가 볼 수 있는 공간에서 실행되는 프로세스도 있지만, 보이지 않는 공간에서 실행되는 프로세스도 있다. 전자는 포그라운드 프로세스(foreground process)라고 하며, 후자는 백그라운드 프로세스(background process)라고 한다. 이때, 백그라운드 프로세스 중 사용자와 상호작용하지 않고 정해진 일만 수행하는 프로세스를 유닉스 체계의 운영체제에서는 데몬(darmon)이라고 부르고, 윈도우 운영체제에서는 서비스(service)라고 부른다.

프로세스 제어 블록(PCB)

일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행한다. 이때, 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록(이하 PCB, Process Control Block)을 이용한다.
PCB는 커널 영역에 생성되며, 각각의 프로세스를 식별하기 위해 관련된 정보를 저장하는 자료 구조이다. PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다. 아래는 PCB에 담기는 정보이다.

  • 프로세스 ID(이하 PID, Process ID): 특정 프로세스를 식별하기 위해 부여하는 고유 번호이다.
  • 레지스터 값: 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 PCB에 담긴다.
  • 프로세스 상태: 현재 프로세스가 어떤 상태인지 PCB에 기록된다.
  • CPU 스케줄링 정보: 프로세스가 CPU를 언제, 어떤 순서로 할당받을지에 대한 정보도 PCB에 기록된다.
  • 메모리 관리 정보: 베이스 레지스터, 한계 레지스터 값과 같은 정보와 프로세스 주소를 알기 위한 페이지 테이블 정보가 PCB에 담긴다.
  • 사용한 파일과 입출력장치 목록: 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 기록된다.

문맥 교환

하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥(context)이라고 한다. 문맥은 해당 프로세스의 PCB에 표현되어 있다. 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다. 그리고 뒤이어 실행할 프로세스의 문맥을 복구한다. 이처럼 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 프로세스를 실행하는 것을 문맥 교환(context switching)이라고 한다.

프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB가 생성된다. 반대로 사용자 영역에서는 하나의 프로세스가 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

  • 코드 영역(code segment): 텍스트 영역(text segment)이라고도 부른다. 데이터가 아닌 CPU가 실행할 명령어(기계어)가 담겨 있기에 쓰기가 금지되어 있다. 다시 말해 코드 영역은 읽기 전용 공간이다.
  • 데이터 영역(data segment): 프로그램이 실행될 동안 유지되며, 프로그램 전체에 접근할 수 있는 전역 변수(global variable)이 저장된다. 코드 영역을 포함하여 크기가 고정된 영역이라는 점에서 정적 할당 영역이라고도 부른다.
  • 힙 영역(heap segment): 프로그래머가 직접 할당할 수 있는 저장 공간이다. 힙 영역에 메모리 공간을 할당했다면 언젠가 공간을 반환해야 한다. 이때, 반환하지 않는다면 공간이 메모리 내에 계속 남아 메모리 낭비를 초래하는 메모리 누수(memory leak)가 발생한다.
  • 스택 영역(stack segment): 데이터를 일시적으로 저장하는 공간으로 매개 변수, 지역 변수가 대표적이다. 힙 영역을 포함하여 크기가 변할 수 있는 영역이라는 점에서 동적 할당 영역이라고 부른다.

프로세스 상태

프로세스는 여러 상태를 거치며 실행된다. 그리고 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.

  • 생성 상태(new): 프로세스를 생성 중인 상태이다. 메모리에 적재되어 PCB를 할당받은 상태를 뜻한다.
  • 준비 상태(ready): CPU를 할당받기 전 대기하는 상태이다. 이때 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라고 한다.
  • 실행 상태(running): CPU를 할당받아 실행 중인 상태이다. 여기서 할당된 시간을 모두 사용하면 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.
  • 대기 상태(blocked): 프로세스 실행 도중 입출력장치를 사용하여 장치의 작업을 기다리는 상태를 대기 상태라고 한다. 해당 작업이 완료되면 프로세스는 다시 준비 상태로 CPU 할당을 기다린다.
  • 종료 상태(terminated): 프로세스가 종료된 상태이다. 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

프로세스 계층 구조

프로세스가 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이때 프로세스를 생성한 프로세스를 부모 프로세스(parent process), 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스(child process)라고 한다. 이처럼 프로세스가 프로세스를 낳는 과정을 도표로 그려서 만든 트리 구조를 프로세스 계층 구조라고 한다.
프로세스 생성 기법을 더 자세히 설명하자면 부모 프로세스가 fork라는 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성해내고, 만들어진 복사본인 자식 프로세스는 exec라는 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

스레드

스레드(thread)는 프로세스를 구성하는 실행의 흐름 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 만약 프로세스에 스레드가 하나만 있다면 단일 스레드 프로세스가 된다. 그러나 두 개 이상의 스레드가 있다면 멀리 스레드 프로세스가 된다. 이처럼 스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.
여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행한다.

멀티프로세스와 멀티스레드

컴퓨터의 실행 과정에서 여러 프로세스를 동시 실행하는 것을 멀티프로세스(multiprocess), 그리고 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드(multithread)라고 한다.

프로세스 우선 순위

프로세스는 비디오 재생이나 디스크 백업 작업을 담당하는 입출력 집중 프로세스(I/O bound process)와 복잡한 수학 연산, 컴파일, 그래픽 처리 작업을 담당하는 CPU 집중 프로세스(CPU bound process)가 있다. 그리고 프로세스마다 CPU를 할당할 수 있는 우선 순위(priority)가 있다. 일반적으로 입출력 집중 프로세스가 CPU 집중 프로세스보다 우선 순위가 높은데, 입출력 집중 프로세스는 잠깐 실행하면 바로 대기 상태에 들 것이기에 해당 프로세스를 먼저 처리해 버리면 다른 프로세스가 금방 CPU를 사용할 수 있기 때문이다.

스케줄링 큐

운영체제는 CPU, 메모리, 입출력장치를 사용하고 싶은 프로세스들에 '줄을 서서 기다릴 것'을 요구한다. 이 줄을 스케줄링 큐(scheduling queue)로 구현하고 관리한다. 또한 운영체제가 관리하는 큐에는 다양한 종류가 있다. 대표적인 큐로 준비 큐와 대기 큐가 있다. 준비 큐(ready queue)는 CPU를 이용하고 싶은 프로세스들이 서는 줄을 의미하고, 대기 큐(waiting queue)는 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄을 의미한다.

선점형과 비선점형 스케줄링

선점형 스케줄링(preemptive scheduling)은 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식이다. 프로세스가 정해진 시간만큼 자원을 사용한 뒤 시간이 됐다면 타이머 인터럽트를 발생하고 운영체제가 해당 프로세스로부터 자원을 빼앗아 다음 프로세스에 할당하는 방식이 선점형 스케줄링의 일종으로 볼 수 있다.
반면 비선점형 스케줄링(non-preemptive scheduling)이란 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 대기 상태에 들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식이다. 다시 말해 하나의 프로세스가 자원 사용을 독점할 수 있는 스케줄링 방식이라 할 수 있다.

CPU 스케줄링 알고리즘

운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것을 CPU 스케줄링(CPU scheduling)라고 한다. 그리고 스케줄링 알고리즘이 있으며 종류가 매우 다양하다.

  • 선입 선처리 스케줄링(First Come First Served Scheduling): FCFS 스케줄링이라고도 부른다. 준비 큐에 삽입된 순서대로 프로세스들을 처리하는 비선점형 스케줄링 방식이다.
  • 최단 작업 우선 스케줄링(Shortest Job First Scheduling): SJF 스케줄링이라고도 부른다. 준비 큐에 삽입된 프로세스들 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 방식이다.
  • 라운드 로빈 스케줄링(round robin scheduling): 정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링이다. 이때 타임 슬라이스란 각 프로세스가 CPU를 사용할 수 있는 정해진 시간을 의미한다.
  • 최소 잔여 시간 우선 스케줄링(Shortest Remaining Time Scheduling): SRT 스케줄링이라고도 불린다. 최단 작업 우선 스케줄링 알고리즘과 라운드 로빈 알고리즘을 합친 스케줄링 방식이다.
  • 우선 순위 스케줄링(priority scheduling): 프로세스들에 우선 순위를 부여하고, 가장 높은 우선 순위를 가진 프로세스부터 실행하는 알고리즘이다. 이때 우선 순위가 낮은 프로세스는 우선 순위가 높은 프로세스들에 의해 실행이 계속해서 연기되는 기아 현상이 생길 때가 있기에 오랫동안 대기한 프로세스의 우선 순위를 점차 높이는 에이징 기법을 사용하기도 한다.
  • 다단계 큐 스케줄링(multilevel queue scheduling): 우선 순위 별로 준비 큐를 여러 개 사용하는 스케줄링 방식이다.
  • 다단계 피드백 큐 스케줄링(multilevel feedback queue scheduling): 다단계 큐 스케줄링과 비슷하지만, 해당 스케줄링 방식에서 기아 현상이 발생할 수 있기에 프로세스들이 큐 사이를 이동할 수 있도록 보완한 스케줄링 방식이다.

기본 미션

p. 304의 확인 문제 1번 풀고 인증하기


1. 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. (1)부터 (5)까지 올바른 상태를 적어 보세요.


선택 미션

준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기


선입 선처리 스케줄링: A-B-C-D 순으로 실행한다.
최단 작업 우선 스케줄링: 프로세스 중 CPU 이용 시간의 길이가 짧은 순으로 실행한다.
라운드 로빈 스케줄링: 정해진 타임 슬라이스만큼의 시간 동안 A-B-C-D 순으로 돌아가며 실행한다.
우선 순위 스케줄링: 우선 순위에 따른 순서대로 실행한다.
profile
안녕하세요.

0개의 댓글