즉, 운영체제는 하드웨어와 응용 프로그램을 적절하게 관리해서 프로그램을 실행한다.
운영체제 프로그램은 다양한 기능을 제공한다. 그 중, 가장 핵심적인 기능을 담당하는 부분을 커널이라고 한다. (어떠한 커널을 사용하는가에 따라 하드웨어 사용 양상이나 컴퓨터 성능 등이 달라질 수 있다.)
운영체제가 제공하는 기능 중 UI는 커널에 속한 기능이 아님.
메모리 내의 커널 영역과는 별개의 개념임.
자원이 무질서하게 관리되는 걸 막고자, 응용 프로그램이 자원을 사용하기 위해서는 운영체제를 무조건 거쳐야한다.
- 이중 모드 : CPU가 명령어를 실행하는 모드.
- 사용자 모드 : 운영체제 서비스를 지원 받을 수 없음.
- 커널 모드 : 운영체제 서비스를 지원 받을 수 있음.
- 슈퍼바이저 플래그 :
CPU의 플래그 레지스터 값 중 하나. 1이면 커널모드, 0이면 사용자 모드
따라서, 사용자모드로 실행되고 있는 프로그램이 운영체제 서비스를 제공받기 위해서는 커널 모드로 전환되어야 한다.
- 시스템 호출 :
응용 프로그램이 운영체제 서비스를 받기 위해, CPU를 커널 모드로 전환해 달라는 요청.
시스템 호출은 일종의 소프트웨어적 인터럽트이다.
시스템 호출도 인터럽트의 일종이므로, 이전 하드웨어 인터럽트를 받았을 때 처리 순서와 유사하다.
- 응용 프로그램이 시스템 호출을 발생시킨다.
- 시스템 호출을 받은 운영체제가 CPU를 커널 모드로 전환한다.
- 운영체제 코드를 실행한다. (ex:하드디스크에 접근)
- 운영체제 코드가 종료되면 사용자모드로 복귀한다.
- 프로세스 관리 : 프로세스 동기화, 교착상태 해결
- 자원 접근 및 할당 :
- CPU : CPU 스케쥴링
- 메모리 : 메모리 할당 등
- 입출력 장치 : 하드웨어 인터럽트, 인터럽트 서비스 루틴
- 파일 시스템 관리 : 운영체제는 데이터를 파일과 디렉터리로서 관리.
- PCB :
프로세스와 관련된 정보를 저장하는 자료 구조.
커널 영역에 적재됨
프로세스 생성 시 만들어지고, 프로세스 종료 시 삭제됨.
PCB에 담기는 정보는 다음과 같다.
- 프로세스 ID
- 레지스터 값 : 문맥 교환을 위함
- 프로세스 상태 : 생성/준비/실행/대기/종료 등의 상태
- CPU 스케줄링 정보 : 언제, 어떤 순서로 CPU를 할당 받을 지
- 메모리 관리 정보 : 어느 주소에 저장되어야 하는지
- 사용한 파일, 입출력 장치 목록
사진 출처 : https://www.includehelp.com/operating-systems/memory-layout-of-a-process.aspx
<정적 할당 영역>
- 코드 영역 : 기계어로 이루어진 명령어가 저장됨. 읽기 전용 공간
- 데이터 영역 : 프로그램이 실행되는 동안 계속해서 사용될 (한 번 쓰고 버리는 데이터가 아닌) 데이터를 저장. 전역 변수가 그 예.
<동적 할당 영역>
- 힙 영역 : 사용자가 직접 할당할 수 있는 공간. 힙 영역은 사용 후에 반환해야함. 그렇지 않으면 메모리 누수(=메모리 낭비)가 발생함.
- 스택 영역 : 데이터를 '일시적으로' 저장하는 공간. 데이터 영역과 다르게 잠깐만 쓸 데이터가 저장됨. 매개 변수, 지역 변수가 그 예.
힙 영역과 스택 영역은 동적 할당 영역으로, 언제든 크기가 변할 수 있다.
따라서 주소가 겹치지 않도록 힙 영역은 낮은 곳에서 높은 곳으로, 스택 영역은 높은 곳에서 낮은 곳으로 주소를 할당받는다.
생성 상태 :
프로세스가 막 생성된 상태. PCB를 할당 받고 메모리에 적재된다.
이때, 바로 실행되는게 아니라 준비 상태에서 CPU 할당을 기다린다.
준비 상태 :
CPU 할당을 언제든 받을 수 있으나, 아직 자신의 차례가 아니라 순서를 기다리는 상태.
실행 상태 :
CPU의 할당을 받아 실행 중인 상태.
대기 상태
입출력 장치가 실행이 종료되기를 기다리는 상태.
보통 입출력 장치의 실행이 CPU에 비해 처리 속도가 느리기 때문
종료 상태
프로세스의 실행이 모두 종료된 상태. 프로세스가 종료되면 운영체제는 PCB와 메모리 공간을 정리한다.
사진 출처 : https://www.researchgate.net/figure/Process-state-transition-diagram_fig3_332546783
모든 프로세스는 시스템호출을 통해 자식 프로세스를 만들 수 있다.
이처럼 프로세스가 트리구조처럼 이루어진 형태를 프로세스 계층 구조라고 한다.
ex : 최초의 프로세스(리눅스:system / 맥:launchd) -> 로그인 프로세스 -> bash 셸 프로세스 -> Vim 프로세스
부모 프로세스는 fork와 exec 명령어로 자식 프로세스를 생성한다.
- fork :
프로세스 복제, 메모리 내용, 부모 프로세스의 자원 등이 복사된다.
복사본이라고 할지라도 엄연히 다른 프로세스이다. (PID가 다름)- exec :
새로운 프로그램으로 전환한다. 정확히는, 메모리 공간을 새로운 프로그램으로 덮어쓴다.
exec을 통해 코드영역, 데이터영역이 실행 프로그램의 내용으로 전환되고, 나머지 영역은 초기화된다.
참고 : 프로세스 계층 구조, 프로세스 생성 기법은 윈도우 운영체제의 경우엔 적용되지 않는 항목이다.
- 스레드 :
프로세스를 구성하는 실행의 흐름 단위.
스레드에는 프로세스 실행을 위한 최소한의 정보(스레드ID, 레지스터값, 스택)를 가지고 있다.
하나의 프로세스는 여러 개의 스레드가 존재할 수 있다.- 단일 스레드 프로세스 : 실행의 흐름 단위가 하나, 한 번의 하나의 부분만 실행되는 프로세스
- 멀티 스레드 프로세스 : 실행의 흐름 단위가 여러 개, 한 번의 여러 개의 부분을 실행할 수 있는 프로세스
이때, 프로세스의 스레드는 스택 영역을 제외한 힙, 데이터, 코드 영역 등의 프로세스 자원을 공유한다.
멀티프로세스와 멀티스레드의 가장 큰 차이는 자원을 공유하는 가에 있다.
참고로, 프로세스간 통신이 아예 불가능한 것은 아니다. 파일을 통한 프로세스 간 통신이나 공유 메모리를 통해서 가능하다.
운영체제는 CPU 스케줄링을 통해 프로세스에 공정하게 CPU를 배분한다.
이 2가지 프로세스를 효율적으로 처리하기 위해선, 시간이 비교적 짧게 걸리는 CPU 집중 프로세스를 가능한 빨리 실행시킨 뒤, 시간이 비교적 오래 걸리는 입출력 집중 프로세스를 실행시켜야 한다.
또한, 프로세스 저마다의 중요도가 다를 것이다. 중요도에 따른 우선순위도 CPU를 효율적으로 쓰는 방법에 영향을 준다. (우선순위는 PCB에 저장된다.)
정리하자면, CPU를 효율적으로 쓰기 위해 고려되는 요소는 다음과 같다.
- 어떠한 자원을 주로 사용하는 프로세스인가
- 우선순위가 어떻게 되는가
운영체제가 저마다의 프로세스의 PCB를 보면서 우선순위를 하나하나 따져보는 건 비효율적이다.
따라서 스케줄링 큐를 통해 프로세스를 줄 세워 관리한다.
(자료구조 큐는 선입선출이지만, 여기서 말하는 스케줄링 큐는 꼭 그런 방식일 필요는 없다. 우선순위를 따지기 때문.)
선점형 스케줄링 :
운영체제가 프로세스의 자원을 강제로 빼앗아 다른 프로세스에게 넘길 수 있는 스케줄링 방법. (비독점형)
타이머 인터럽트를 통해 순서를 바꾸는 스케줄링 방법이 이에 해당한다.
문맥교환이 자주 발생해 오버헤드가 발생할 수 있다.
비선점형 스케줄링 :
운영체제가 프로세스의 자원을 강제로 빼앗을 수 없고, 프로세스가 실행이 종료되기까지 기다려야하는 스케줄링 방법. (독점형)
골고루 자원을 사용할 수 없다는 단점이 있다.
선입 선처리 스케줄링 :
비선점형 스케줄링
삽입된 순서대로 실행 (선착순)
호위효과 발생
최단 작업 우선 스케줄링 :
비선점형 스케줄링
작업 시간이 짧은 프로세스를 먼저 실행
라운드 로빈 스케줄링 :
선점형 스케줄링
선입 선처리 스케줄링 + 타임슬라이스
시간이 끝나면 문맥 교환이 발생하고 큐의 맨 뒤에 삽입된다.
최소 잔여 시간 우선 스케줄링 :
선점형 스케줄링
최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링
정해진 타임 슬라이스만큼 CPU를 이용하되, CPU를 사용할 다음 프로세스는 잔여 시간이 가장 짧은 프로세스이다.
우선순위 스케줄링 :
선점형 스케줄링
우선 순위가 가장 높은 프로세스를 먼저 실행한다.
기아 현상 -> 에이징 기법으로 해결 (차차 우선순위를 높임)
다단계 큐 스케줄링 :
우선 순위 스케줄링의 발전 버전
여러 개의 큐를 만들고 큐 자체에 우선순위를 매긴다.
단, 큐 간 프로세스 이동은 불가능하다.
304p 1번
1 : 생성
, 2 : 준비
, 3 : 실행
, 4 : 종료
, 5 : 대기
준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면,
들어온 순서대로 A,B,C,D 순으로 CPU를 할당받는다.