운영체제(Operating System) 은 사용자가 컴퓨터를 쉽게 다루게 해주는 인터페이스
펌웨어는 OS와 유사하지만, 소프트웨어를 추가로 설치할 수 없는 것.
운영체제의 구조
GUI 대신 CUI만 있는 리눅스 서버도 존재한다.
ec2서버나 GCP 인스턴스 생각해보자!
시스템콜
운영체제가 커널에 접근하기 위한 인터페이스
유저모드에서 커널모드로 뭔가의 작업을 수행하려면 이 시스템콜을 호출해야 한다.
public class Demo {
public static void main(String[] args) throws IOException {
// 로직 수행중...
FileReader fr = new FileReader("hello.txt");
fr.read();
}
}
로직을 수행중에 위에 구현한 FileReader.read()
를 사용하는 순간에
유저모드에서 파일을 읽어와야 하는 IO 작업이 수행되기 때문에 유저모드에선 할 수 없어서
바로 시스템콜을 호출한다. 그 후 커널모드로 진입하여 실행된 후에 다시 유저모드로 전환해서 남은 로직을 수행한다.
이런식으로 구성되면, 컴퓨터 자원에 대한 직접 접근을 차단할 수 있고, 프로그램을 다른 프로그램으로부터 보호할 수 있다.
시스템콜은 하나의 추상화 계층이기에, 이를 통해 네트웍 통신이나 DB 와 같은 낮은 단계의 영역 처리 부분에서 신경을 쓰지 않고 프로그램을 구현할 수 있다는 장점이 존재한다.
모드비트
이 모드비트를 참고해서 시스템콜이 작동될 때 유저모드와 커널모드를 구분한다.
모드 비트 → 플래그
0은 커널모드, 1은 유저모드
입출력 디바이스는 운영체제를 통해서만 작동해야 한다.
유저모드로 여러 프로그램을 막 켤 수 있다면, 공격자가 바로 켤수 있다는 뜻이다.
운영체제를 통해 프로그램을 작동하게 하자!
인터럽트
CPU는 하나의 작업만 수행할 수 있는데,
하나의 작업을 진행하다가 이 신호가 들어오면 현재 작업중이던 것을 저장해두고, 신호가 들어온 작업을 처리한다.
인터럽트 간에는 우선순위가 존재하고, 그에 따라 실행되며
하드웨어 인터럽트와 소프트웨어 인터럽트가 있다.
DMA 컨트롤러
IO 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
CPU가 이 입출력에 해당하는 작업도 수행하게 되면 너무 많은 인터럽트 요청이 들어오기에 CPU 부하를 막아주고, 그 일을 부담하는 보조적인 장치이다.
하나의 작업을 CPU와 동시에 하는 것을 방지
메모리
데이터나 상태, 명령어를 기록하는 장치
RAM을 일컬어 메모리라고도 한다. CPU는 계산을 담당하고, 메모리는 기억을 담당
메모리가 크면 동시에 많은 일을 수행할 수 있다.
디바이스 컨트롤러
디바이스 컨트롤러는 컴퓨터와 연결된 IO 디바이스들의 작은 CPU를 말함
매 시점 어떤 프로세스에 CPU를 할당해 작업을 처리할 것인지 결정한다.
가장 효율적으로, 특정 프로세스가 불이익을 당하지 않도록
❓단기 스케줄러 == CPU 스케줄러 : 준비 상태의 프로세스 중 어떤 프로세스를 다음에 실행 상태로 만들 것인지 결정하는 역할
❓장기 스케줄러 == 작업 스케줄러 : 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할
CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야 하는 일을 스레드 단위로 CPU에 할당한다.
❓목표
프로세스가 스스로 CPU 소유권을 포기하는 방식이며, 강제로 프로세스를 중지하지 않는다.
-> 컨텍스트 스위칭으로 인한 부하가 적음
가장 먼저 온 것을 가장 먼저 처리하는 알고리즘
처리 시간이 긴 프로세스가 먼저 도착한 경우, 뒤에 도착한 처리 시간이 짧은 프로세스들의 대기시간이 길어진다.
실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘
처리 시간이 긴 프로세스가 실행되지 않는 현상이 발생
평균 대기 시간이 가장 짧지만 실제 실행 시간을 알 수 없기 때문에 과거의 실행했던 시간을 토대로 추측하여 사용한다.
SJF에서 긴 시간을 가진 프로세스가 실행되지 않는 현상을 보완하기 위해 오래된 작업에게 높은 우선순위를 부여하는 알고리즘
대기 중인 프로세스들에 우선순위를 부여하고 우선순위가 높은 프로세스에 CPU를 우선할당한다.
현대 운영체제가 쓰는 방식으로 지금 사용하고 있는 프로세스를 알고리즘에 의해 중단시켜 버리고 강제로 다른 프로세스에게 CPU 소유권을 할당하는 방식
현대 컴퓨터가 쓰는 스케줄링인 우선순위 스케줄링의 일종으로 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘
기존 작업을 처리하는 도중 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
우선순위에 따른 준비 큐를 여러 개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용