과제
p. 304의 확인 문제 1번 : 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램이다. 1부터 5까지 올바른 상태를 적어 보세요.
- 생성 상태 (new)
- 준비 단계 (ready)
- 실행 단계 (running)
- 종료 상태 (terminated)
- 대기 상태 (blocked)
Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
A, B, C, D 순서대로 실행. 먼저 큐에 들어간 프로세스를 먼저 처리하기 때문.
운영체제
실행할 프로그램에 필요한 시스템 자원(CPU, 메모리, 각종 장치 등)을 할당하고 프로그램이 올바르게 실행되도록 돕는 프로그램
커널 영역과 사용자 영역
컴퓨터가 부팅하면 메모리 내에 커널 영역에 운영체제는 적재되고 실행된다. 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재된 공간을 사용자 영역이라 한다.
→ 누가 응용 프로그램을 메모리에 적재했는가? == 운영체제
- 운영체제는 실행할 프로그램을 메모리에 적재하고, 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리한다.
→ 누가 어떤 프로그램부터, 얼마나 오래 CPU를 사용하게 할 지 정하는가? == 운영체제
- 공정하게 여러 프로그램에 CPU를 할당한다.
커널
자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능처럼 핵심 서비스를 커널이 담당한다.
- 사용자 인터페이스는 커널에 포함되지 않는다. (CLI, GUI) 인터페이스는 운영체제가 제공하는 서비스지만, 그저 컴퓨터와 상호작용하기 위한 통로일 뿐 커널에 속한 기능이 아니다.
이중 모드와 시스템 호출
운영체제는 응용 프로그램이 하드웨어 자원에 직접 접근하는것을 방지하고 자원을 보호한다. 운영체제는 응용 프로그램의 자원 접근을 대행하는 역할을 한다. 이러한 방식을 이중 모드라고 한다. 응용 프로그램은 운영체제에 도움 요청**(시스템 호출)**을 해야한다.
사용자 모드와 커널 모드
사용자 모드 : 운영체제 서비스를 제공받을 수 없는 실행 모드. 커널 영역의 코드를 실행할 수 없다. 일반적인 응용 프로그램은 사용자 모드로 실행된다. → 하드웨어 접근을 할 수 없다.
커널 모드 : 운영체제 서비스를 제공받을 수 있는 실행 모드. 자원에 접근할 수 있다.
- 운영체제 서비스를 제공받으려면 운영체제에 요청**(시스템 호출 System call)**을 해야한다. 시스템 호출은 입출력 장치 뿐만 아니라 인터럽트를 발생시키는 특정 명령어에 의해 발생한다. 이를 소프트웨어 인터럽트라고 한다.
호출 순서
- 하드에 데이터를 저장하는 시스템 호출을 발생시켜 커널모드로 전환
- 운영체제 내의 하드에 데이터를 저장하는 코드 실행하여 접근
- 하드 접근이 끝나면 사용자 모드 복귀
운영체제의 핵심 서비스
프로세스 관리
실행 중인 프로그램(프로세스)를 관리한다. CPU는 한 번에 하나의 프로세스만 실행하기 때문에 여러 프로세스를 번갈아가며 실행한다. 프로세스마다 필요한 입출력 장치같은 자원이 다르므로 관리가 필요하다.
자원 접근 및 할당
- CPU : CPU 스케줄링을 통해 프로세스를 공정하게 CPU에 할당한다.
- 메모리 : 메모리에 적재된 프로세스 크기, 주소가 다 다르다. 같은 프로세스도 적재되는 주소가 늘 달라진다. 적재된 공간의 여유가있어야 프로세스를 이어서적재할 수 있다.
- 입출력장치 : 인터럽트 서비스 루틴은 운영체제의 커널 영역에 있다. 입출력장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤 커널 영역 뒤에 있는 인터럽트 서비스 루틴을 실행한다.
파일 시스템 관리
폴더, 파일을 열기, 생성하기, 삭제한다. 이를 묶어 디렉토리로 관리한다.
프로세스
프로그램이 실행되어 메모리에 적재되고 실행하면 프로세스가 된다!
- 포그라운드 프로세스 : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스 : 사용자가 보지 못하는 뒤에서 실행되는 프로세스
- 백그라운드 프로세스를 유닉스 계열에서는 데몬, 윈도우 계열에서는 서비스라고 부른다.
- 프로세스 간 통신 (IPC Inter-Process Communication) : 프로세스끼리 자원을 공유하고 데이터를 주고 받는 방식. (프로세스 끼리는 기본적으로는 자원 공유를 하지 않지만..) 공유 메모리를 통하거나 파일을 통해 프로세스 간에 통신이 이뤄질 수 있다.
프로세스 제어 블록 (PCB, Process Control Block)
한정된 CPU 자원을 활용하여 프로세스를 차례대로 돌아가면서 처리한다.
프로세스들은 자신의 차례까 되면 정해진 시간만큼 CPU를 사용하고, 시간이 끝나면 타이머 인터럽트가 발생하여 다음 차례를 기다린다.
→ 프로세스의 실행 순서를 관리하고 프로세스에 CPU 등 자원을 배분한다. 프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료구조.
들어가는 정보
- 프로세스 ID (PID) : 프로세스를 식별하기 위해 부여하는 고유 번호
- 레지스터 값 : 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원해서 이전까지 실행한 작업을 이어서 작업한다. 따라서 프로그램 카운터 등 필요한 레지스터 값들이 필요하다.
- 프로세스 상태 : 현재 프로세스가 어떤 상태인가. 입출력장치 사용을 기다리고 있는지, CPU를 기다리고 있는지 등
- CPU 스케줄링 정보 : 프로세스가 언제, 어떤 수서로 CPU를 할당받을지에 대한 정보
- 메모리 관리 정보 : 프로세스가 메모리에 저장된 위치. 베이스 레지스터, 한계 레지스터 값같은 정보와 프로세스 주소를 알기에 꼭 필요한 페이지 테이블 정보가 담긴다.
- 사용한 파일과 입출력장치 목록 : 프로세스 실행 과정에서 특정 입출력장치나 파일을 사용한 경우 저장된다.
문맥 교환
문맥
하나의 프로세스에서 다음 프로세스로 실행 순서가 넘어갈 때 프로그램 카운터, 각종 레지스터 값 등 다음에 프로세스를 재개할 때 필요한 백업 정보. PCB에 백업한다.
→ 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다.
프로세스의 메모리 영역
운영체제의 사용자 영역에서 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나눠서 프로세스가 저장된다.
코드 영역
텍스트 영역이라고도 부른다. 실행할 수 있는 코드(기계어 명령어)가 저장되있다. CPU가 실행할 명령어가 담겨있기에 쓰기가 금지되있는 읽기 전용 공간. 공간의 크기가 크게 변하지 않기 때문에 정적 할당 영역이라고 부른다.
데이터 영역
전역변수같은 프로그램이 실행되는 동안 유지할 데이터가 저장된 공간. 크기가 그게 변하지 않기 때문에 정적 할당 영역이다.
힙 영역
프로그래머가 직접 할당할 수 있는 저장 공간. 공간의 크기가 가변적인 동적 할당 영역에 해당한다. 메모리 공간을 할당했다가 다 사용했으면 반환해야한다. 반환하지 않으면 메모리 낭비가 일어나고 이를 메모리 누수라고 한다.
스택 영역
공간의 크기가 가변적인 동적 할당 영역이다. 데이터가 일시적으로 저장되는 공간. 잠깐 쓰다가 말 값들을 저장한다. 매개 변수, 지역 변수같은 값.
일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당하고 스택 영역은 높은 주소에서 낮은 주소로 할당한다.
프로세스 상태
프로세스가 번갈아가면서 실행되다보면 한 프로세스는 여러 상태를 거쳐간다. 그 상태는 PCB로 인식하고 관리한다.
- 생성 상태(new) : 이제 막 메모리에 적재되어 PCB를 할당 받았고 실행 준비가 완료된 프로세스. CPU의 할당을 기다리는 중
- 준비 상태(ready) : CPU를 당장 할당받으면 실행할 수 있지만, 아직 실행은 안된 상태. 실행으로 전환되는 것을 디스패치라고 한다.
- 실행 상태(running) : CPU를 할당받아 실행 중인 상태. 할당된 시간을 모두 사용해서 타이머 인터럽트가 발생하면 다시 준비 상태가 되고, 실행 도중 입출력 장치를 통해 입출력 작업이 끝날 때까지 기다려야한다면 대기 상태가 된다.
- 대기 상태(blocked) : 입출력을 기다리는 상태. 입출력 작업이 완료되면 해당 프로세스는 준비상태로 돌아간다.
- 종료 상태(terminated) : 프로세스가 종료된 상태. 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 계층 구조
프로세스는 실행 중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
생성된 프로세스와의 관계를 부모 프로세스, 자식 프로세스로 정의하게 되고, 각각 PID는 다르지만 일부 운영체제에서는 부모 프로세스의 아이디인 PPID가 기록되기도 한다.
자식 프로세스는 또 자식 프로세스를 낳을 수 있다. 이런 트리 구조를 프로세스 계층 구조라고 한다.
프로세스 생성 기법
그렇다면 프로세스는 자식을 어떻게 만드는가 = 복제와 옷 갈아입기
fork와 exec라는 시스템 호출을 사용한다.
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성한다. fork를 통해 복사본을 만들면 부모 프로세스의 자원(메모리 내용, 파일 목록 등)이 자식 프로세스에 상속된다.
- 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다. exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출.
스레드
프로세스를 구성하는 실행의 흐름 단위. 하나의 프로세스는 여러 개의 스레드를 가질 수 있고 동시에 실행할 수 있다.
스레드는 프로세스 내에 각기 다른 스레드 ID, 프로그램 카운터 값같은 레지스터 값, 스택으로 구성된다.
프로세스의 스레드를 실행하는데에 필요한 최소한의 정보만을 유지한 채 프로세스를 공유한다.
멀티 프로세스와 멀티 스레드
여러 프로세스를 동시에 실행하면 멀티 프로세스.
여러 스레드를 동시에 실행하면 멀티 스레드.
- 동일한 작업을 프로세스 2개에 동시 실행하면 모든 자원을 복사하여 메모리에 적재한다. PID와 메모리 주소만 다른 모든 정보가 동일하다. 중복이 생기게 된다.
- 멀티 스레드에서는 각기 다른 스레드 ID, 레지스터 값, 스택을 가질 뿐 프로세스가 가진 자원을 공유한다. (코드, 데이터, 힙, 파일 등) 그러나 하나의 공유한 자원에 문제가 생기면 다른 스레드에도 영향이 간다.
CPU 스케줄링
운영체제가 프로세스들에게 합리적으로 CPU 자원을 배분하는 것
프로세스 우선순위
스케줄링을 하기 위해서는 어떤 프로세스를 먼저 할당할 지 판단할 기준, 우선순위가 필요하다. 상황에 맞게 운영체제는 우선순위를 PCB에 명시한다.
- 입출력 집중 프로세스 : 입출력 장치를 이용하는 시간이 많은 프로세스. 실행 상태보다는 대기 상태에 더 많이 머무른다.
- 입출력 버스트 : 입출력 장치를 기다리는 작업
- CPU 집중 프로세스 : 연산이나 컴파일, 그래픽 처리 등 CPU가 더 필요한 프로세스. 대기 상태보다는 실행 상태에 더 많이 머무른다.
- CPU 버스트 : CPU를 이용하는 작업
→ 프로세스는 일반적으로 CPU 버스트와 입출력 버스트를 반복한다.
- 입출력 집중 프로세스를 가능한 빨리 실행시켜 입출력장치를 끊임없이 작동시키고, 그 다음 CPU 집중 프로세스를 집중하여 CPU 할당하는 것이 효율적이다. 입출력을 대기하는 동안에 CPU를 사용하면 된다.
스케줄링 큐
우선순위가 PCB에 적혀있다고 해도 다음 프로세스를 찾기 위해 모든 프로세스를 뒤적기리면 비효율적이다.
→ 프로세스를 줄서서 기다리게 한다 : 스케줄링 큐
(CPU 쓸 프로세스! HDD를 쓸 프로세스! 프린트 쓸 프로세스! 줄서세요!)
- 준비 큐 : CPU를 이용하고 싶은 준비 상태 프로세스 줄
- 대기 큐 : 입출력 장치를 기다리는 대기 상태 프로세스 줄
- 운영체제는 큐에 먼저 삽입된 프로세스를 실행하지만 우선순위가 높은게 있다면 그 프로세스를 먼저 실행한다.
선점형 스케줄링
남보다 앞서서 차지한다. 프로세스가 자원을 사용하고 있어도 강제로 뺏어서 프로세스를 실행하는 방식. 타이머 인터럽트가 발생하면 강제로 뺏는다.
더 급한 프로세스가 언제든 끼어들 수 있고 자원 분배를 골고루 하는 것이가능하지만, 문맥 교환 과정에서 오버헤드가 발생한다.
비선점형 스케줄링
프로세스가 자원을 사용하고 있다면 프로세스가 종료되거나 대기 상태가 되기 전에는 끼어들 수 없는 방식.
선점형보다 문맥 교환 오버헤드가 적지만 자원을 한 프로세스가 자원을 이미 사용 중이라면 당장 사용해야 하는 프로세스를 실행할 수 없다.
CPU 스케줄링 알고리즘
선입 선처리 스케줄링 (FCFS 스케줄링)
First Come First Scheduling
준비 큐에 삽입된 순서대로 프로세스를 처리하는 비선점형 스케줄링 방식
- 가장 공정해보일 수 있는 방식
- 프로세스들이 기다리는 시간이 매우 길어질 수 있다.
- 짧게 끝낼 수 있는 프로세스를 뒤에 미루다 보면 평균 대기 시간이 늘어나는 호위 효과가 생긴다.
최단 작업 우선 스케줄링 (SJF 스케줄링)
Shortest Job First Scheduling
가장 긴 프로세스는 나중에 실행하고 짧은 프로세스 먼저 처리하는 방식. 일반적으로는 비선점형 스케줄링으로 구분.
라운드 로빈 스케줄링
선입 선처리 스케줄링에 타임 슬라이스 개념을 더한 방식
타임 슬라이스 : 각 프로세스가 CPU를 사용할 수 있는 정해진 시간.
정해진 시간 (타임슬라이스)만큼 돌아가면서 CPU를 이용하는 선점형 스케줄링
- 정해진 시간안에 프로세스가 완료되지 않았다면 다시 큐의 맨 뒤에 삽입되고 이때 문맥교환이 발생한다.
최소 잔여 시간 우선 스케줄링 (SRT 스케줄링)
Shortest Remaining Time Scheduling
최단 작업 우선 스케줄링과 라운드 로빈 스키줄링을 합친 방식.
프로세스들은 정해진 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스는 남아있는 시간이 가장 적은 프로세스가 선택
우선순위 스케줄링
프로세스에 우선순위를 부여하고 가장 높은 순으로 프로세스를 실행하는 방식
- 기아 현상 : 우선순위에서 밀려서 프로세스가 계속 연기되는 현상
- 에이징 : 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식
다단계 큐 스케줄링
우선순위별로 준비 큐를 여러 개 사용하는 스케줄 방식
큐 별로 CPU 집중인지, 입출력 집중인지를 따져서 넣을수 있고, 큐 별로 스케줄링 방식을 다르게 가져갈수도 있다. 유연한 대처가 가능하다.
다단계 피드백 스케줄링
다단계 큐 스케줄링에서는 프로세스가 큐 사이를 이동할 수 없다. → 기아 현상에서 자유로울 수 없다. 우선순위가 낮은 프로세스가 불리하다.
- 새로 준비 상태가 된 프로세스가 있다면 우선순위가 가장 높은 우선순위 큐에 삽입되고 일정 시간 실행된다.
- 프로세스가 큐에서 실행이 끝나지 않으면 다음 우선순위 큐에 삽입되여 실행 (반복)
- 반복하다보면 CPU 집중 프로세스는 자연스럽게 우선순위가 낮아지고 입출력 집중 프로세스가 높아진다.
'컴퓨터구조&운영체제' 카테고리의 다른 글
[혼공컴운] 6주차_가상 메모리 & 파일 시스템 (0) | 2024.02.07 |
---|---|
[혼공컴운] 5주차_프로세스 동기화 & 교착 상태 (0) | 2024.02.02 |
[혼공컴운] 3주차_컴퓨터의 핵심 부품 (CPU 빼고) (1) | 2024.01.18 |
[혼공컴운] 2주차_CPU 알아가기 (2) | 2024.01.11 |
[혼공컴운] 1주차_컴퓨터 구조 입문하기 (0) | 2024.01.07 |