저번주에 시험치고 너무 힘들어서 냅다 쉬어버렸더니.. 늦어버렸지만 그래두 열심히 공부하고 정리해서 올려봅니당!
Chapter 09 운영체제 시작하기
09-1 운영체제를 알아야 하는 이유
개발자들이 운영체제를 알아야 하는 이유!
1. 운영체제란
실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램을 운영체제라고 한다.
운영체제는 인터넷 브라우저, 게임과 같은 프로그램이기 때문에 메모리에 적재되어야 한다. 운영체제는 특별한 프로그램이기 때문에 컴퓨터가 부팅된 때 메모리 내 커널 영역이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 응용 프로그램이 적재되는 영역을 사용자 영역이라고 한다.
운영체제가 하는 일은 실행할 프로그램을 메모리 주소가 겹치지 않도록 적당한 공간의 메모리에 적재하고, 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리한다. 또한 프로그램이 실행되려면 반드시 CPU가 필요하다. 하지만 CPU는 한 프로그램씩만 사용할 수 있기 때문에 운영체제는 최대한 공정하게 여러 프로그램에 CPU 자원을 할당한다.
정리하자면 운영체제는 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 맡고 있다.
2. 운영체제를 알아야 하는 이유
운영체제가 없다면 간단한 프로그램이라도 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 한다.
개발자라 운영체제를 알아야하는 이유는 컴퓨터 구조를 알아야하는 이유와 같은데 문제 해결 능력과 관련이 있다. 운영체제는 하드웨어가 아닌 소프트웨어, 프로그램이기 때문에 문제가 생겼을 때 운영체제와 대화를 할 수 있다면 문제 해결을 빠르게 할 수 있다.
09-2 운영체제의 큰 그림
운영체제에서 매우 중요한 개념인 커널과 응용 프로그램이 운영체제로부터 어떻게 도움을 받으며 실행되는지를 이해하기 위해 이중 모드와 시스템 호출이라는 개념을 알아볼 것이다.
1. 운영체제의 심장, 커널
운영체제의 핵심적인 서비스로는 자원에 접근하고 조작하는 기능과 프로그램이 올바르고 안전하게 실행되게 하는 기능인데, 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널이라고 한다.
운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데, 대표적으로 사용자 인터페이스(UI)가 있다. UI의 종류로는 그래픽 유저 인터페이스(GUI)와 커맨드 라인 인터페이스(CLI)가 있다. GUI 는 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스 이고, CLI는 명령어를 기반으로 컴퓨터와 상호작용을 하는 인터페이스이다. UI는 운영체제가 제공하는 서비스이지만, 그저 컴퓨터와 상호작용하기 위한 통로일 뿐 커널에 속한 기능은 아니다.
2. 이중 모드와 시스템 호출
운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 응용프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록하여 자원을 보호한다. 응용프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청하고 응용프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다. 이러한 운영체제의 역할은 이중 모드로써 구현된다. 이중 모드란 CPU가 명령어를 실행한ㄴ 모드는 크게 사용자 모드와 커널 모드로 구분하는 방식이다.
사용자 모드는 운영체제 서비스를 제공받을 수 없는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 없는 모드이다. 일반적인 응용 프로그램은 사용자 모드로 실행된다.
커널 모드는 운영체제 서비스를 제공받을 수 있는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 있는 모드이다. CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다.
사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출이다고 한다.
CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사하다. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영어 내에 시스템 호출을 수행하는 코드를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 보귀하여 실행을 계속해 나간다.
3. 운영체제의 핵심 서비스
프로세스 관리 | 실행 중인 프로그램을 프로세스라고 한다. 하나의 CPU는 한 번에 하나에 프로세스만 실행할 수 있기 때문에 CPU는 프로세스들을 조금씩 번갈아 가며 실행한다. |
자원 접근 및 할당 | 모든 프로세스는 실행을 위해 자원을 필요로 한다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해 준다. CPU - 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할지를 결정하는 것을 CPU 스케줄링이라고 한다. 메모리 - 새로운 프로세스가 적재될 때마다 어느 주소에 적재해야 할지를 결정해주어야 한다. 입출력 장치 - 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다. |
파일 시스템 관리 | 운영체제가 보조기억장치 속 데이터를 어떻게 파일과 디렉터리로 관리하는지 -> 15장 |
Chapter 10 프로세스와 스레드
10-1 프로세스 개요
프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다.
1. 프로세스 직접 확인하기
사용자가 볼 수 있는 공간에서 실행되는 프로세스를 포그라운드 프로세스, 사용자가 보지 못하는 뒤편에서 실행되는 프로세스를 백그라운드 프로세스라고 한다. 백그라운드 프로세스 중에서도 사용자와 직접 상호작용할 수 있는 백그라운드 프로세스가 있고, 상호작용하지 않는 백그라운드 프로세스가 있는데, 이를 유닉스에서는 데몬이라하고 윈도우에서는 서비스라고 한다.
2. 프로세스 제어 블록
프로세스들은 한정된 시간만큼만 CPU를 이용하고 시간이 끝나면 다시 차례를 기다리고 실행하는 것을 반복하는데, 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록(PCB)을 이용한다. PCB는 프로세스와 관련된 정보를 저장하는 자료구조로 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장된다. PCB는 커널 영역에 생성된다. 아래는 PCB에 담기는 정보이다.
프로세스 ID | 프로세스 ID(PID)는 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 |
레지스터 값 | 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값 저장 |
프로세스 상태 | 현재 프로세스가 어떤 상태인지 기록 |
CPU 스케줄링 정보 | 어떤 순서로 CPU를 할당받을지에 대한 정보가 기록 |
메모리 관리 정보 | 프로세스가 어느 주소에 저장되어 있는지에 대한 정보 |
사용한 파일과 입출력장치 목록 | 어떤 입출력장치가 이 프로세스가 할당되었는지, 어떤 파일들을 열었는지에 대한 정보가 기록 |
3. 문맥교환
히나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다.하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다. 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이다고 한다.
4. 프로세스의 메모리 영역
프로세스가 생성되면 커널 영역에 PCB가 생성된다고 하였다. 사용자 영역에는 프로세스가 어떻게 배치되는가?
코드영역 | 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다. 쓰기가 금지되어 있는 읽기 전용 공간이며, 크기가 변하지 않는다(정적 할당 영역). |
데이터 영역 | 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 이런 데이터로는 전역 변수가 대표적이다. 크기가 변하지 않는다(정적 할당 영역). |
힙 영역 | 프로그래머가 직접 할당할 수 있는 저장 공간이다. 프로그래밍 과정 중 힙 영역에 메모리 공간을 할당 했다면 언젠가는 해당 공간을 반환해야 한다. 메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래한다(메모리 누수). 크기가 실시간으로 변한다(동적 할당 영역). |
스택 영역 | 데이터를 일시적으로 저장하는 공간으로 잠깐 쓰다가 말 값들이 저장되는 공간이다. 매개 변수, 지역 변수같은 데이터가 저장된다. 크기가 실시간으로 변한다(동적 할당 영역). |
일반적으로 힙 영역을 메모리에서 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮을 주소로 할당된다.
10-2 프로세스 상태와 계층 구조
프로세스는 모두 저마다의 상태가 있다. 운영체제는 이런 프로세스의 상태를 PCB에 기록하여 관리한다.
1. 프로세스 상태
컴퓨터를 사용할 때 여러 프로세스들이 빠르게 번갈아서 실행이 되는데, 그 과정에서 하나의 프로세스는 여러 상태를 거치며 실행된다. 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다. 프로세스의 상태를 표현하는 방식은 운영체제마다 조금씩 차이가 있지만, 프로세스가 가질 수 있는 대표적인 상태는 아래와 같다.→
생성 상태 | 프로세스를 생성 중인 상태로, 이제 막 메모리에 적재되어 PCB를 할당 받은 상태 |
준비 상태 | 당장이라고 CPU를 할당받아 실행할 수 있지만, 차례를 기다리고 있는 상태 실행상태로 전환되는 것은 디스패치라고 한다. |
실행 상태 | CPU를 할당받아 실행 중인 상태 할당된 일정 시간 동안만 CPU를 사용할 수 있다. 할당된 시간 모두 사용 → 준비 상태 실행도중 입출력 장치 사용 → 작업이 끝날 때까지 대기 싱태 |
대기 상태 | 입출력장치의 작업을 기다리는 상태 |
종료 상태 | 프로세스가 종료된 상태 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다. |
2. 프로세스 계층 구조
프로세스는 실행 도중 세스템 호출을 통해 다른 프로세스를 생성할 수 있는데, 이때 새 프로세스를 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다. 부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기 때문에 각기 다른 PID를 가진다. 많은 운영체제들은 프로세스가 프로세스를 낳은 계층적인 구조로 프로세스를 관리한다. 이 과정을 도표로 그리면 트리 구조를 띄는데, 이를 프로세스 계층 구조라고 한다.
3. 프로세스 생성 기법
부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행된다. 부모 프로세스는 fork를 통해 자신의 복사본은 자식 프로세스로 생성해내고, 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork와 exec는 시스템 호출이다. fork는 자기 자신 프로세스의 복사본은 만드는 시스템 호출이고, exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다. 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원들이 자식 프로세스에 상속된다. 자식 프로세스는 exec 시스템을 호출하여 새로운 프로그램으로 전환된다. 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 된다.
즉, 부모가 자식 프로세스를 실행하여 프로세스 계층 구조를 이루는 과정은 fork와 exec가 반복되는 과정이다.
10-3 스레드
프로세스를 구성하는 실행의 흐름 단위를 스레드라고 한다.
1. 프로세스와 스레드
전통적인 관점에서 하나의 프로세는 한 번에 하나의 일만 처리했다. 웹 브라우저, 게임, 워드 프로세서 프로세스가 있을 때 이 모든 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스를 가정했다. '실행의 흐름 단위가 하나'라는 점에서 이렇게 실행되는 프로세스들은 단일 스레드 프로세스라고 볼 수 있다.
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성되어 있다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다.
프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하여 실행된다. 프로세스의 자원을 공유한다는 것이 스레드의 핵심이다.
스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다. 이런 점에서 스레드는 '프로세스를 구성하는 실행 단위'라고 볼 수 있다. 최근 많은 운영체제는 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다.
2. 멀티프로세스와 멀티스레드
여러 프로세스를 동시에 실행하는 것을 멀티프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 한다.
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스의 자원을 공유한다는 점이 위의 두 개념의 다른 점이다. 동일한 프로세스 두 개를 동시에 실행하면 프로세스 내의 모든 자원이 복제되어 메모리에 적재된다. 같은 프로세스가 통째로 메모리에 적재 되는 것이기 때문에 갯수가 늘어나게 되면 메모리를 낭비한다고 볼 수 있다. 이에 반해 스레드들은 같은 프로세스 내의 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유한다. 여러 프로세스를 병행 실행하는 것 보다 메모리를 더 효율적으로 사용할 수 있고, 서로 협력과 통신에 유리하다. 물론 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다는 단점이 존재한다.
Chapter 11 CPU 스케줄링
11-1 CPU 스케줄링 개요
운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것을 CPU 스케줄링이라고 한다.
1. 프로세스 우선순위
프로세스들마다 우선순위가 다르다. 우선순위가 높은 프로세스는 빨리 처리해야 하는 프로세스를 의미한다. 우선순위가 높은 프로세스에는 대표적으로 입출력작업이 많은 프로세스가 있다.
대부분의 프로세스들은 CPU와 입출력장치를 모두 사용하며 실행된다. 프로세르는 실행 상태와 대기 상태를 반복하며 실행된다는 것이다. 그런데 프로세스 종류마다 입출력장치를 이용하는 시간과 CPU를 이용하는 시간의 양에는 차이가 있다. 입출력 작업이 많은 프로세스를 입출력 집중 프로세스, CPU작업이 많은 프로세스를 CPU 집중 프로세스라고 한다. 입출력 집중 프로세스는 실행 상태보다는 입출력을 위한 대기 상태에 더 많이 머무르게 된다. CPU 집중 프로세스는 그 반대이다. 그렇다면 두 프로세스가 동일한 빈도로 CPU를 사용하는 것은 비합리적일 것이다.
이렇게 상황과 프로세스의 중요도에 맞게 프로세르가 CPU를 이용할 수 있도록 하기 위해 운영체제는 프로세스마다 우선순위를 부여한다.
2. 스케줄링 큐
운영체제는 다음 프로세스를 빠르게 찾기 위해서 프로세스들에게 줄을 서서 기다리는 것을 요구한다. 이 줄을 스케줄링 큐로 구현하고 관리한다. 운영체제가 관리하는 대부분의 자원은 큐로 관리된다. 대표적으로 준비 큐와 대기 큐가 있다. 준비 큐는 CPU를 이용하고 싶은 프로세스들이 서는 줄을 의미하고, 대기 큐는 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄을 의미한다.
운영체제는 PCB들이 큐에 삽입된 순서대로 프로세스를 하나씩 꺼내어 실행하되, 그 중 우선순위가 높은 프로세스를 먼저 실행한다.
3. 선점형과 비선점형 스케줄링
선점형 스케줄링은 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식을 의미한다.
비선점형 스케줄링은 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식을 의미한다.
11-2 CPU 스케줄링 알고리즘
1. 스케줄링 알고리즘의 종류
컴
비선점형 | 선입 선처리 스케줄링(FCFS) | 준비된 큐에 삽입된 순서대로 프로세스들을 처리하는 방식 CPU를 먼저 요청한 프로세스부터 CPU를 할당하는 스케줄링 방식 CPU를 오래 사용하는 프로세스가 먼저 도착하면 다른 프로세스는 그 프로세스가 CPU를 사용하는 동안 무작정 기다려야 하는데 이러한 현상을 호위 효과라고 한다. |
최단 작업 우선 스케줄링(SJF) | 준비 큐에 삽입된 프로세스들 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케줄링 방식 | |
선점형 | 라운드 로빈 스케줄링(RR) | FCFS에 각 프로세스가 CPU를 사용할 수 있는 정해진 시간을 의미하는 타임 슬라이스라는 개념이 더해진 스케줄링 방식 정해진 타임 슬라이스만큼의 시간동안 돌아가며 CPU를 이용하는 스케줄링 타임슬라이스의 크기를 잘 정해주는 것이 중요하다. |
최소 잔여 시간 우선 스케줄링(SRT) | SJF와 RR이 합쳐진 방식 프로세스들은 정해진 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스로는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다. |
|
우선순위 스케줄링 | 프로세스들에 우선순위를 부여하고, 가장 높은 우선순위를 가진 프로세스부터 실행 우선순위가 낮은 프로세스는 우선순위가 높은 프로세스들에 의해 실행이 계속해서 연기될 수 있다(기아 현상). 위의 현상을 방지하기 위한 대표적인 기법으로 에이징이 있다. 이는 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식이다. |
|
다단계 큐 스케줄링 | 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식 우선순위가 가장 높은 큐에 있는 프로세스들을 먼저 처리하고, 우선순위가 가장 높은 큐가 비어있으면 그 다음 우선순위 큐에 있는 프로세스를 처리한다. 큐 별로 타임 슬라이스를 여러 개 지정할 수도 있고, 큐마다 다른 스케줄링 알고리즘을 사용할 수도 있다. |
|
다단계 피드백 큐 스케줄링 | 다단계 큐 스케줄링의 발전된 형태로 다단계 큐 스케줄링에서는 프로세스들이 큐 사이를 이동할 수 없었다면 해당 알고리즘에서는 너무 오래 기다리고 있는 프로세스가 있다면 점차 우선순위가 높은 큐로 이동시킬 수 있다. |
숙제
304p. 확인문제 1번
① 생성
② 준비
③ 실행
④ 종료
⑤ 대기
추가숙제
준비 큐에 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
선입 선처리 스케줄링 알고리즘은 말 그대로 준비 큐에 삽입된 순서대로 프로세스를 처리하는 방식이기 때문에 들어온 순서 그대로 A, B, C, D 순서대로 CPU를 할당받는다.
'[혼공학습단 12기] 혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
[혼공컴운] 6주차 (0) | 2024.08.21 |
---|---|
[혼공컴운] 5주차 (0) | 2024.08.14 |
[혼공컴운] 3주차 / 더 열심히..! (0) | 2024.07.21 |
[혼공컴운] 2주차 / 화이팅 >ㅁ< (0) | 2024.07.13 |
[혼공컴운] 1주차 / 열심히 하자 제발 (0) | 2024.07.07 |