OS는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 OS의 개념과 역할, 운영체제를 구성하는 각각의 요소 및 그 알고리즘의 핵심적인 부분에 대하여 기초부터 학습한다.
1. 편리한 환경 제공
2. 자원을 효율적으로 관리 ⭐️
효율성
: 개별 실행 프로그램은 자기 자신이 마치 cpu를 독식한다고 느낄 정도로 빨라야 한다.형평성
: 특정 사용자나 특정 프로그램의 지나친 불이익이 발생하지 않도록 해야 한다.크게 컴퓨터의 내부와 외부(I/O 장치)로 나눌 수 있으며,
cpu는 자신의 작업공간인 메모리를 읽어 프로그램을 실행시킨다
조금 더 상세히 그려보자. 이전 사진과 달라진 점은, 1) 메모리에 다양한 프로그램이 올라가 있다는 것과 2)각 I/O장치마다 작은 controller가 생겼다는 점이다. 이 점을 숙지하고 아래 내용을 읽어보자
위의 컴퓨터 내부 구조 그림을 보며 두 가지 질문에 대한 답을 도출해보자.
첫 째로, 우리가 컴퓨터의 전원을 켜면 어떤 일이 발생할까? 먼저 운영체제가 메모리에 올라간다 운영체제의 경우 컴퓨터가 꺼지기 전까지 항상 실행되는 프로그램이다
즉, 운영체제(커널)는 메모리에 항상 상주하고 있으며 os를 제외한 메모리 공간은 다양한 프로그램들이 차지하게 된다.
둘 째로, CPU의 작업 공간은 메모리이기 때문에 컴퓨터 외부 장치인 I/O장치에 직접 접근할 수 없다. 만약 어떤 프로그램 실행 도중 디스크의 파일 내용을 읽어와야만 다음 실행을 할 수 있다면 어떻게 될까?
CPU는 I/O를 전담하는 I/O controller에게 일을 위임 한다. 그러면 controller는 CPU가 요청한 파일을 읽어 본인의 작은 메모리에 읽어두고 파일이 준비되엇음을 CPU에게 알린다. 그러면 그제야 CPU는 파일을 읽어 일을 다시 수행하게 된다.
운영체제는 CPU 스케줄링, 메모리 관리, 디스크 스케줄링 그리고 인터럽트 및 캐싱 기능을 수행한다. 각 기능에 대해선 앞으로 자세히 설명할 예정이니 오늘은 간략히 핵심만 다루어 보도록 하자.
CPU 스케줄링
어떤 프로그램에게 cpu사용권을 줄까? 얼마만큼 줄까?
앞서 말했 듯 CPU는 하드웨어이다. 즉, 생각을 못한다. CPU는 그저 매 클럭마다 메모리 어딘가에 있는 기계어를 읽어 연산을 할 뿐이다. 즉, CPU는 OS의 대행을 통해 다양한 프로그램에 대한 CPU 관리가 이루어진다.
OS는 CPU를 '관리'할 수 있으므로 CPU가 OS를 읽고 있는 시점에선 완벽히 조율 할 수 있다. 그러나 다른 프로그램이 CPU를 무한루프 등으로 독점하고 있다면 어찌할 방법이 없다. (무한정 쓰지 못하게 막는 것은 OS 혼자 할 수 없는 영역이라는 뜻이다) 따라서 하드웨어의 도움(ex.인터럽트)을 받아 관리한다.
메모리 관리
한정된 메모리를 어떻게 쪼개어 쓸까?
디스크 스케줄링
디스크에 들어온 요청을 어떤 순서로 처리할까?
디스크는 느리다. 또한 디스크는 다양한 프로그램으로부터 처리 요청이 들어올 수 있다. 이 때 요청 순서대로 처리되는 것이 아니라 나중에 들어온 요청이라도 효율적인 순서대로 처리 진행할 수 있다. 이는 엘리베이터 스케줄링과 동일하다.
인터럽트, 캐싱
CPU와 I/O장치의 속도 차이는 100만배이다. 이들의 속도 차이를 어떻게 극복할 수 있을까?
사실 CPU와 I/O장치 뿐만 아니라 CPU와 메모리도 대략 100배정도 속도 차이가 발생한다. 하지만 CPU와 메모리는 모두 컴퓨터 내부 부품이므로, 캐시 메모리나 파이프라이닝 등을 통해 성능 갭을 완충하는 장치가 존재한다.
그렇다면 다시 돌아가서 CPU와 I/O장치는 어떻게 (속도 차이를) 극복할 수 있을까?
먼저, CPU-메모리 사이에 있는 캐시메모리와 똑같이 CPU-디스크 사이에도 캐시 메모리가 존재하기 때문에 여기에 값을 보관하여 속도를 극복할 수 있다.
또 다른 방식으로는 인터럽트 가 있다. cpu에서 프로그램을 실행하다 I/O의 값을 읽거나 저장해야할 떄, 이를 직접하는 것이 아니라 I/O controller에게 요청한다고 하였다. 그러면 CPU는 요청에 대한 결과가 올 때까지 마냥 기다릴까?
CPU는 디스크보다 백만배 빠른데 그 시간을 단순히 기다리는데 허비한다면 굉장한 자원의 낭비일 것이다. 따라서 컨트롤러에게 일을 위임한 후 당장 일할 수 있는 다른 일을 찾는다.
그렇게 CPU는 다른 일을 하고 있는 동안, 컨트롤러는 자신이 일을 다 했음을 알려주기 위해 이 때 '인터럽트'를 건다. 참고로 CPU는 기계어 명령을 처리하고 있지만, 기계어 하나를 처리할 때마다 매번 인터럽트를 체크한다. 따라서 인터럽트가 들어오면 CPU의 제어권이 인터럽터에 의해 자동으로 os에게 넘어가게 되고, OS에서 관리하는 기계어를 읽어서 해당 디스크 요청을 했었던 기존의 프로그램을 (OS)다음에 읽을 수 있도록 한다.
프로세스란 실행 중인 프로그램 을 의미한다.
사진에서 초록색 원은 프로세스를 의미한다.
CPU에서는 특정 프로그램에 대하여 메모리를 읽어 기계어를 실행하며,
CPU를 쓰고자 하는 프로그램은 cpu큐에 줄세워둔다.
이 때 우리는 (앞으로 상세히 배울) CPU 스케줄링을 적용하여 프로그램들이 실행됨
그러다 디스크에 대한 파일을 읽어야하는 상황이 생긴다면, 시간이 걸리기 때문에 CPU에서 바로 쫓아냄과 동시에 동시에 디스크 입출력 큐에 프로세스가 쌓이게 된다. CPU와 마찬가지로 여기서도 디스크 스케줄링 적용되며 처리된 경우에는 디스크 큐에서 해당 프로세스를 빼서 CPU 큐에 다시 넣어준다
마지막으로, 사진의 상단 좌측을 보자.
프로그램은 interactive 어플리케이션과 Sciensific 어플리케이션 2가지 유형이 있는데, 일반적으로 우리는 interactive 어플리케이션을 실행한다.
예를 들어 우리가 웹서핑 도중 키보드와 마우스를 계속 사용한다면 인터럽트에 의해 I/O 장치에서 CPU가 OS로 넘어가게 되며, 운영체제는 키보드의 입력 데이터를 메모리로 카피하여 사용할 수 있게 한다. 이런식으로 우리는 CPU와 I/O의 반복을 통해 유저와의 상호작용을 하는 어플리케이션을 실행하곤한다.
I/O 작업 없이 CPU만 굉장히 오래 쓰는 어플리케이션 또한 존재한다. 얘를 들어 유전자 분석을 하는 프로그램이라면 cpu를 대단히 많이 쓰는 작업이기 때문에 중간에 I/O가 거의 끼어들지 않는다.