[혼공학습단 9기] 혼공컴운: 4주차

오늘은·2023년 2월 2일
0

혼공학습단

목록 보기
9/14

기본미션

선택미션

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

선입 선처리 스케줄링: A-B-C-D 순으로 처리
최단 작업 우선 스케일링: A-B-C-D의 시간이 짧은 순서대로 처리
라운드 로빈 스케줄링: A-B-C-D 순으로 처리하며 타임 슬라이스의 시간마다 돌며 처리 (작업 완료시 큐에서 빠짐)
우선순위 스케줄링: A-B-C-D 순으로 처리하되, 우선 순위가 높다면 먼저 처리함

➡ 문제가 이상하다 싶었는데 교재 속 준비 큐 순서대로 처리할 것!
(준비 큐 그림에는 D가 없어 A-B-C 순으로 작성)
선입 선처리 스케줄링: A-B-C 순으로 처리
최단 작업 우선 스케일링: C-B-A의 시간이 짧은 순서대로 처리 (2 - 5- 17)
라운드 로빈 스케줄링: A-B-C 순으로 처리하며 타임 슬라이스의 시간마다 돌며 처리 (작업 완료시 큐에서 빠짐 타임 슬라이스가 4ms 이므로 A-B-C-A-C-A 순)
➡ (A:11 - B:3(완료) - C:7 - A:7 - C:3 - A:3 - C(완료) - A(완료)
우선순위 스케줄링: A-B-C-D 순으로 처리하되, 우선 순위가 높다면 먼저 처리함


Chapter 09 운영체제 시작하기

09-1 운영체제를 알아야 하는 이유

운영체제란

프로그램이 올바르게 실행되도록 돕는 프로그램.
모든 프로그램은 실행되기 위해 자원을 필요로 한다. (시스템 자원? 자원 이라고도 부르는 프로그램 실행에 필요한 요소를 가리키며 CPU, 메모리, 보조기억장치, 입출력장치등의 컴퓨터 부품을 의미한다)

운영체제는 컴퓨터가 부팅될 때 메모리 내 커널 영역에 따로 적재된다.
나머지 영역에는 응용 프로그램이 적재되는 사용자 영역이라 부른다.
사용자 영역에 적재된 프로그램들의 자원을 효율적으로 할당, 올바르게 실행되도록 한다.
실행할 프로그램을 메모리에 적재, 실행되지 않는 프로그램을 메모리에서 삭제, 지속적인 메모리 지원 관리의 역할을 수행한다.
(실행 규칙을 통해 컴퓨터 시스템 전체를 관리하기도 한다.)

운영체제를 알아야 하는 이유

하드웨어를 조작하기 위함. 운영체제는 하드웨어 상에서 어떻게 작동할지를 자세히 알고 있다.
현재 하드웨어의 상태, 코드 실행 과정, 문제 여부를 상세히 알 수 있어 문제 해결에 도움이 되기도 한다.
하드웨어와 프로그램을 더 깊이 이해하고 운영체제의 상태를 알고 원하는 결과를 위한 명령어를 보낼 수 있는 것.
오류메세지를 통해 소스코드의 문제점을 발견할 수 있고 해결방법을 알아갈 수 있다.

09-2 운영체제의 큰 그림

운영체제의 심장, 커널

운영체제의 핵심 서비스를 담당하는 부분. 운영체제가 설치된 모든 기기에는 커널이 존재하며 어떤 커널을 사용하는가에 따라 실행/개발 프로그램이 하드웨어를 이용하는 양상이 달라진다 (컴퓨터의 성능에 영향을 미침)
운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있다.
사용자 인터페이스는 사용자가 컴퓨터와 상호작용하는 통로이며 종류이며 같은 커널을 사용하여도 사용자 인터페이스는 다를 수 있다.

이중 모드와 시스템 호출

운영체제는 자원에 접근시 자신을 통해서만 접근할 수 있도록 자원을 보호한다 (응용 프로그램이 어디서나 접근할 수 있고 조작가능하다면 자원 관리가 힘들어지며, 컴퓨터 전체에 영향을 미칠 수 있다.) 접근을 원할 경우 운영체제에 도움을 요청하며 요청받은 운영체제는 대신 자원에 접근하여 요청작업을 수행하게 된다.
이러한 역할을 이중모드로 구현할 수 있으며, CPU가 명령어를 실행하는 모드를 사용자모드/커널모드로 구분하는 방식으로 작동한다. CPU는 명령어를 사용자 모드로 실행할 수 있으며 커널모드로도 실행이 가능 한 것.
사용자모드란 운영체제 서비스를 제공받을 수 없는 실행모드 상태.
일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행된다. 사용자모드 실행시 CPU는 입출력 명령어 같은 하드웨어 자원에 접근하는 명령어를 실행할 수 없게 된다. (일반적인 응용프로그램이 자원에 접근할 수 없는 이유)
커널모드란 운영체제 서비스를 제공받을 수 있는 실행상태 모드. 커널 영역의 코드를 실행할 수 있으며 CPU는 커널모드로 명령어를 실행하면 모든 명령어를 실행할 수 있게 된다.

운영체제에 요청을 보내 커널모드로 전환되어야 자원에 접근하는 운영체제 서비스를 제공받을 수 있게 된다. 사용자모드에서 커널모드로 전환하기 위해 시스템 호출 이라는 요청을 하게 된다.
시스템 호출도 인터럽트에 속하며, 특정 명령어에 의해 발생하는 소프트웨어 인터럽트이기도 하다.

운영체제의 핵심 서비스

프로세스 관리

실행 중인 프로그램을 프로세스라 부른다. 일반적으로 하나의 CPU는 하나의 프로세스만 실행할 수 있다. CPU는 여러 프로세스를 조금씩 번갈아 가며 실행하게 되며, 각 프로세스는 상태와 실행하려는 자원 등이 모두 다르다. 다양한 프로세스를 관리/실행할 수 있어야한다.

자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 한다. 또한 운영체제는 프로세스들이 사용할 자원에 접근하여 조작함으로서 프로세스에 필요한 자원을 할당한다.
CPU 메모리에는 여러 프로세스가 있으며 하나의 PCU는 하나의 프로세스만 실행할 수 있기 때문에 운영체제는 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스를 어떤 CPU를 이용할지, 얼마나 이용할지를 결정해야한다. (CPU 스케줄링)
메모리 메모리에 적재된 프로세스는 주소도 크기도 다르다. 같은 프로세스여도 실행할 때마다 주소값이 달라지기도 하여 운영체제는 새로운 프로세스 적재시 어느 주소에 적재할지, 메모리 부족시 극복방법도 결정해야한다.
입출력장치 인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 위치한다. 인터럽트 역시 마찬가지로 CPU가 인터럽트 요청 신호를 보낼 때 운영체제는 인터럽트를 처리하는 프로그램 (인터럽트 서비스 루틴)을 제공하여 수행한다.

파일 시스템 관리

파일을 폴더로 관리하게 되는데 이 역시 운영체제가 지원하는 서비스이다.

Chapter 10 프로세스와 스레드

10-1 프로세스 개요

프로세스 직접 확인하기

윈도우에서는 작업 관리자 - 프로세스 탭에서 확인 가능하며, 실제 컴퓨터에서 실행하는 프로세스 외 여러 프로세스가 실행되고 있음을 알 수 있다. 사용자 앞에서 실행되는 프로세스는 포그라운드 프로세스 라고 부르며, 사용자 뒤에서 실행되는 프로세스는 백그라운드 프로세스 라고 부른다.
백그라운드 프로세스 중 정해진 일만 수행하는 백그라운드 프로세스를 서비스. 유닉스 체계에서는 데몬이라고 부른다.

프로세스 제어 블록

운영체제는 빠르게 번갈아가며 프로세스의 실행순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 PCB(Process Control Block)을 이용하게 된다. 프로세스와 관련된 정보를 저장하는 자료구조로 해당 프로세스를 식별하기 위한 정보가 저장된다. 커널 영역에서 생성되어 프로세스 생서시 만들어지며 실행이후 폐기된다.

프로세스 ID

특정 프로세스를 식별하기 위한 고유 번호. 같은 일을 수행하여도 두번 실행히 PID는 두개의 서로 다른 값의 프로세스가 생성된다.

레지스터 값

프로세스는 자신의 실행차례가 되면 이전까지 사용한 레지스터의 중간 값을 복원하여 이전에 실행한 작업을 이어간다. 해당 프로세스가 실행하여 사용했던 프로그램 카운터를 비롯한 값을 담는다.

CPU 스케줄링 정보

언제 어떤 순서로 프로세스가 CPU를 할당받았는지 정보를 기록한다.

메모리 관리 정보

프로세스마다 메모리에 저장된 위치가 달라 PCB에는 프로세스가 어디에 있는지에 대한 정보가 있을 것. PCB에는 베이스 레지스터, 한계 레지스터. 정보들이 있게 된다. 주소를 알기 위한 페이지 테이블 정보도 담게 된다.

사용한 파일과 입출력장치 목록

실행과정 중 프로세스가 특정 입출력장치, 파일 사용시 PCB에 해당내용이 명시. 어떤 입출력장치가 이 프로세스에 할당되었는지를 기록한다.

문맥 교환

프로세스의 순서가 넘어갈 때는 운영체제로부터 CPU를 다음 프로세스로 실행되게 하는 것. 이때 프로세스 카운터를 비롯하여 레지스터 값, 메모리 정보, 실행을 위해 열어둔 파일이나 사용한 입출력장치 등의 정보를 백업하게 된다. 이런 하나의 프로세스 수행을 재개하기 위해 기억할 정보를 문맥이라 한다.
문맥은 해당 프로세스 PCB에 표현되며 PCB에 기록되는 정보를 문맥이라 봐도 된다. 실행 문맥을 기억해두면 해당 프로세스 실행을 재개할 수 있어 프로세스가 CPU를 사용할 수 있는 시간, 돌발 상황 발생으로 인터럽트 발생시 운영체제는 해당 프로세스의 PCB에 문맥을 백업하며 다음 프로세스로 바뀌게 된다.
기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구. 새로운 프로세스 실행하는 것을 문맥 교환이라고 한다.

프로세스 메모리 영역

프로세스 생성시 커널영역에 PCB를 생성하며 사용자 영역 내 프로세스 배치는 코드/데이터/힙/스택 영역으로 나뉘어 저장된다.

코드 영역

텍스트 영역이라고도 부르며 실행 가능한 코드, 기계어로 이뤄진 명령어가 저장된다. CPU가 실행할 명령어가 담겨 읽기 전용 공간으로 이뤄져있다.

데이터 영역

프로그램 실행 기간 중 유지할 데이터가 담겨있다. 프로그램 전체에서 접근 가능한 전역변수가 대표적.
코드 영역과 데이터 영역은 크기가 변하지 않는다. 프로그램을 구성하는 명령어들이 갑자기 바뀌지 않기 때문. 고정적이기 때문에 정적 할당 영역이라고도 부른다.

힙 영역

프로그램을 만드는 사용자가 직접 할당할 수 있는 저장공간. 프로그래밍 과정에서 메모리 공간 할당시 해당 공간을 반환해야하기도 한다. 반환함으로 운영체제는 해당 공간을 더이상 사용하지 않음을 알 수 있게 된다.
메모리 공간을 반환하지 않을 경우 메모리 내 계속 남기 때문에 메모리 낭비를 초래하게 된다. (이를 메모리 누수 라고 부름)

스택 영역

데이터를 일시적으로 저장하는 공간으로 데이터 영역에 담기는 값과 달리 잠깐 쓰고 사라지는 값이 저장된다. 함수 실행이 끝나면 사라지는 매개변수, 지역변수가 대표적.

힙 영역과 스택 영역은 프로세스 실행 과정에서 크기가 변할 수 있는 동적 할당 영역이라고 부르기도 한다. 일반적으로 힙 영역은 메모리의 낮은 주소 -> 높은 주소로 할당되며 스택 영역은 높은 주소 -> 낮은 주소로 할당된다. (데이터가 쌓여도 새로 할당되는 주소가 겹치지 않게 하기 위함)

10-2 프로세스 상태와 계층 구조

프로세스 상태

컴퓨터 사용시 여러 프로세스가 빠르게 번갈아 가며 실행된다. 하나의 프로세스는 여러 상태를 거치며 실행되며 이 상태를 PCB를 통해 인식하고 관리한다. 프로세스의 상태를 표현하는 방식은 다음과 같다.

생성 상태

프로세스를 생성 되는 상태로 메모리에 적재되어 PCB를 할당받은 상태를 말한다. 생성 상태를 거쳐 실행 준비가 된 프로세스는 준비 상태가 되어 CPU의 할당을 기다린다.

준비 상태

CPU의 할당을 받아 실행 될 수 있으나 차례가 되지 않아 기다리는 상태. 프로세스틑 차례가 되면 CPU를 할당받아 실행 상태가 된다.

실행 상태

CPU를 할당받아 실행 중인 상태를 의미한다. 할당된 일정 시간동안 CPU를 사용할 수 있다. 할당된 시간을 모두 사용할 경우 다시 준비상태가 되며, 실행 도중 입출력 장치를 사용하여 입출력 장치의 작업이 끝날 때 까지 기다려야할 경우 대기상태가 된다.

대기 상태

프로세스 실행 중 입출력장치 사용시 CPU에 비해 처리 속도가 느리기 때문에 입출력이 끝날 때 까지 기다리게 된다. 작업 완료시 해당 프로세스는 다시 준비 상태로 CPU의 할당을 기다린다.

종료 상태

프로세스가 종료된 상태로 운영체제는 PCB와 프로세스가 사용한 메모리를 정리하게 된다.

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이 때 새 프로세스를 생성한 프로세스를 부모 프로세스. 부모 프로세스를 통해 생성된 프로세스를 자식 프로세스라 부른다.
부모 프로세스에 의해 생성되어도 다른 프로세스이기 때문에 다른 PID를 가지며 자식 프로세스에 부모 프로세스의 PID를 기록하는 PPID를 일부 운영체제에서 사용하기도 한다.
자식 프로세스 역시 또 다른 자식 프로세스 생성이 가능하며 계층 구조의 프로세스를 운영체제가 관리하게 된다.

프로세스 생성 기법

부모 프로세스는 어떻게 자식 프로세스를 만들까?
부모 프로세스를 통해 생성된 자식 프로세스는 복제와 옷 갈아입기를 통해 실행된다. fork를 통하여 자신의 복사본을 자식 프로세스로 만들며, 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork, exec 모두 시스템 호출로 복사본을 생성할 때 메모리 내 내용, 열린 파일 목록 등의 자원 역시 상속된다. exec는 새로운 프로그램으로 전환되어 새로운 프로그램 내용으로 전환. 실행하는 시스템 호출이다. (나머지는 초기화)

10-3 스레드

프로세스와 스레드

전통적으로 프로세스는 하나의 실행 흐름을 갖고 한번에 하나의 부분만 실행되는 단일 스레드 프로세스였다. 스레드 개념 도입 이후 한번에 여러 일을 동시에 처리할 수 있게 되었다. 여러 명령어를 동시에 실행할 수 있게 된 것. 스레드는 프로세스를 구성하는 실행 단위라 볼 수 있으며 프로세스 내 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 갖고있어 스레드마다 각기 다른 코드를 실행 할 수 있는 것.

프로세스의 스레드는 실행에 필요한 최소 정보만 유지하는 실행 흐름 단위로 프로세스 자원을 공유하며 실행하게 된다.

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

하나의 프로세스에 여러 스레드가 있을 수 있는가
컴퓨터는 실행 과정에서 여러 프로세스가 동시에 실행 가능하며 그 프로세스를 이루는 스레드 역시 여러개 있을 수 있다. 여러 프로세스를 동시에 실행하는 것을 멀티 프로세스. 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티 스레드 라고 부른다.

프로세스는 자원을 공유하지 않지만 스레드는 같은 프로세스 내 자원을 공유한다.
프로세스를 fork하여 같은 작업을 하는 동일 프로세스를 동시 실행시 모든 자원이 복제되어 메모리에 적재되고 지정된 메모리 주소를 제외한 모든 것이 동일한 프로세스가 있는 것. 같은 프로그램 실행을 위해 동일 내용을 중복하여 존재하는 것은 비효율적.

스레드는 각기 자원을 공유하며, 같은 프로세스 내 모든 스레드는 동일 주소 공간의 코드, 데이터, 힙 영역을 공유하게 된다. 여러 프로세스 병행 실행보다 효율적으로 메모리를 사용할 수 있다.
프로세스들은 기본적으로 자원을 공유하지 않기 때문에 독립적으로 실행되나 스레드는 프로세스 자원을 공유하기 때문에 협력, 통신에 유리하다.

멀티 프로세스 환경에서는 하나의 프로세스에 문제가 발생해도 다른 프로세스에 지장이 가지 않지만 멀티 스레드 환경에서는 하나의 스레드에 문제가 발생하면 전체로 문제가 옮겨갈 수 있다.

Chapter 11 CPU 스케줄링

11-1 CPU 스케줄링 개요

프로세스 우선순위

프로세스들에게 공정하게 CPU를 배분하려면? 우선순위가 높은 프로세스를 먼저 실행하는 것이 효율적이다. 프로세스는 실행 상태 - 대기 상태를 반복하며 실행되며 CPU와 입출력장치 모두 사용하게 된다. 프로세스 종류마다 입출력장치 이용시간, CPU 이용시간의 차이로 입출력 작업이 많은 입출력 집중 프로세스도 있고, CPU작업이 많은 CPU 집중 프로세스도 존재하게 된다.

입출력 집중 프로세스는 실행 상태 보다 대기 상태에 더 많이 머물며 CPU 집중 프로세스는 대기 상태보다 실행 상태에 더 많이 머물게 된다.
CPU 집중 프로세스와 입출력 집중 프로세스가 동시에 CPU 자원을 요구했다고 가정시 입출력 집중 프로세스를 빨리 실행시켜 입출력 장치를 작동 및 완료시키는 것이 더 효율적이다. (대기 상태가 될 예정으로 입출력 집중 프로세스를 먼저 처리하여 다른 프로세스를 대기열에 올려두는게 좋음)

운영체제는 프로세스마다 우선순위를 부여하며 PCB에 명시된 우선순위에 따라 먼저 처리할 프로세스를 결정한다.

스케줄링 큐

CPU를 원하는 프로세스를 찾는 것은 비효율적으로 프로세스들을 줄세워 처리하며, 운영체제는 이를 스케줄링 큐로 구현하고 관리한다.
메모리 적재/CPU 사용/특정 입출력장치를 사용 프로세스를 큐에 삽입하여 줄을 세우게 된다.
운영체제가 관리하는 대부분의 자원은 큐로 관리하며 대표적인 큐로 준비 큐, 대기 큐가 있다.
준비 큐: CPU를 사용하고 싶은 프로세스를 나열한 큐
대기 큐: 입출력장치를 이용하기 위해 대기상태에 들어간 프로세스를 나열한 큐

준비상태에 있는 프로세스의 PCB는 준비 큐 마지막에 삽입되며 차례를 기다린다.
운영체제는 PCB들이 큐에 삽입된 순서대로 실행하며 우선순위가 높은 프로세스를 먼저 실행한다.

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

프로세스가 CPU를 사용할 때 다른 프로세스에서 사용 요청을 받을 경우 사용 가능한 대응
1. CPU 자원을 뺏어 다른 프로세스에 할당 (선점형 스케줄링)
2. 사용중인 프로세스 작업이 끝날 때까지 기다림 (비선점형 스케줄링)

선점형 스케줄링: 급한 프로세스가 언제든 끼어들 수 있어 자원 독점을 방지하며, 프로세스에 골고루 자원을 배분할 수 있으나 문맥 교환 과정에서 오버헤드 발생 가능
비선점형 스케줄링: 오버헤드는 상대적으로 적지만, 자원을 골고루 분배하기 힘들다는 단점이 존재한다.

11-2 CPU 스케줄링 알고리즘

스케줄링 알고리즘의 종류

선입 선처리 스케줄링: FCFS 스케줄링이라고도 부르며 큐 형식을 따르는 비선점형 스케줄링 방식. CPU를 먼저 요청한 프로세스부터 CPU를 할당한다. 프로세스들이 기다리는 시간이 길어질 수 있다.
CPU를 오래 사용하는 프로세스가 먼저 도착할 경우 해당 프로세스가 종료될 때까지 이후 프로세스는 CPU를 기다리게 된다. 긴 시간을 기다리는 현상을 호위효과 라고 부른다.

최단 작업 우선 스케줄링: SJF 스케줄링이라고 부르며 비선점형 스케줄링으로 분류되나 선점형으로 구현될 수도 있다. 호위 효과 방지를 위해 생겨났으며 CPU 사용시간이 짧은 프로세스를 먼저 실행한다.

라운드 로빈 스케줄링: 선입 선처리 스케줄링에 타임 슬라이스 개념을 더한 방식. 타임 슬라이스란 프로세스가 CPU를 사용할 시간을 제한하는 것으로 정해진 타임 슬라이스만큼 돌아가며 사용하는 선점형 스케줄링이다.
정해진 시간이 지나면 다음 프로세스가 CPU를 사용하는 것. 이 때 프로세스가 완료되지 않는다면 큐의 맨 마지막으로 이동하며 문맥 교환이 발생한다.
타임 슬라이스 크기가 중요하게 되는데 크게 되면 선입 선처리 방식과 다르지 않게 되어 호위 효과가 발생하고 지나치게 작으면 문맥 교환 발생에 발생하는 비용이 크다.

최소 잔여 시간 우선 스케줄링: SRT 스케줄링이라고도 부르며 최단 작업 우선 스케줄링 알고리즘과 라운드 로빈 알고리즘 을 합친 방식이다.
정해진 타임 슬라이스만큼 CPU를 사용하며 그 다음 CPU를 사용할 프로세스는 남아있는 작업 시간이 가장 적은 프로세스이다.

우선순위 스케줄링: 프로세스에 우선순위를 부여하여 가장 높은 우선순위를 가진 프로세스를 먼저 실행하는 알고리즘이다. 각각의 알고리즘 내 우선순위가 존재하지만 우선순위가 높은 프로세스만 계속 실행되면 우선순위가 낮은 알고리즘은 계속 밀리게 된다. (기아 현상)
이를 방지하여 오래 대기한 프로세스의 우선순위를 점차 높여가는 에이징기법이 있다.

다단계 큐 스케줄링: 우선순위 스케줄링의 발전된 형태. 우선 순위별 큐를 생성. 우선순위가 높은 큐의 프로세스를 먼저 처리한다. 여러 개의 큐로 유형별로 우선순위를 구분하여 실행할 수 있게된다. 큐 별로 슬라이스를 다르게 지정할 수 있으며, 다른 스케줄링 알고리즘 적용도 가능하다.

다단계 피드백 큐 스케줄링: 다단계 큐 스케줄링에서는 프로세스들이 큐 사이를 이동할 수 없어 우선순위가 낮은 프로세스가 계속 연기될 수 있는데 이를 보완한 알고리즘이다. 프로세스들이 큐 사이를 이동할 수 있게 되게된다. 프로세스의 실행이 끝나지 않는다면 다음 우선순위 큐에 삽입되어 실행되게 된다.
➡ 우선순위가 내려간 프로세스가 큐에서 오래 대기하게 되면 우선순위가 높은 큐로 이동 계속 이동하기 때문에 구현이 복잡하지만 일반적인 CPU 스케줄링이다.

profile
게으르지만 기록은 하고싶어!

0개의 댓글