Kernel(커널): 운영 체제의 핵심 부분으로, 하드웨어와 프로세스 간의 상호 작용을 관리한다. 커널은 하드웨어 자원에 접근하고 제어하며, 시스템 리소스 관리와 프로세스 스케줄링과 같은 핵심 작업을 수행한다. 또한 파일 시스템, 메모리 관리, 디바이스 드라이버 등과 같은 기능도 제공한다. 사용자로부터 직접 명령 받거나 해석하지 않는다.
Shell(셸): 명령어 해석기(Command Interpreter)라고도 불리며, 사용자와 운영 체제 간의 인터페이스 역할을 한다. 셸은 사용자가 입력한 명령을 해석하고 해당 명령을 커널이 이해할 수 있는 형식으로 전달한다. 또한 명령의 실행 결과를 사용자에게 표시한다. 다양한 셸 프로그램이 존재하며, 각각은 다른 명령 및 기능을 지원한다.
Ram : 휘발성 메모리이며 memory 대부분을 차지하며 실제 프로그램이 할당되는 곳이다. (수 MB ~ 수 GB)
Rom : 비휘발성 메모리이며 극히 일부를 차지한다. (수 KB)
여기서 휘발성 메모리란 전원이 꺼지면 정보가 삭제되며 비휘발성 메모리란 전원이 꺼져도 정보가 유지된다. 부팅 과정은 아래와 같다.
일반 사용자가 고의 또는 실수로 STOP
, HALT
, RESET
과 같은 명령어를 실행해서 컴퓨터의 동작이 멈추거나 꺼지면 치명적이다. 혹은 I/O 디바이스를 마음대로 조작하는 것도 마찬가지다. 따라서 이를 방지하기 위해 이중 모드라는 개념이 탄생했다.
이중모드란 말 그대로 모드를 유저 모드(User mode)와 관리자 모드(Supervisor mode)로 나누어 운영체제와 시스템 자원을 보호하는 기법이다. CPU 내부의 레지스터의 modebit를 활용하여 유저 모드와 관리자 모드를 구분한다. 유저 모드는 비트 값을 1, 관리자 모드에서는 비트 값을 0으로 설정한다. 시스템 콜을 통해 유저 모드에서 관리자 모드로 전환된다.
유저 모드
관리자 모드
프로세스는 컴퓨터의 메모리에 올라와 실행되고 있는 프로그램을 말하며 스레드는 프로세스 내 작업의 흐름을 지칭한다.
하나의 프로세스는 하나 혹은 여러 개의 스레드로 이루어질 수 있다.
메모리 영역
IPC
안정성
시간
동기화
멀티프로세싱 : 여러 개의 프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것을 말한다. 특정 프로세스 중 일부에 문제가 발생하더라도 다른 프로세스에 영향을 미치지 않으며 격리성과 신뢰성이 높다는 장점이 있다.
멀티스레딩 : 프로세스 내 작업을 멀티스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유하고 프로세스보다 가볍기 때문에 효율성이 높은 장점이 있다. 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점이 있다.
대표적인 멀티프로세싱, 멀티스레딩의 예는 Internet Explorer와 Chrome 브라우저이다.
Internet Explorer는 하나의 프로세스 내에서 모든 탭이 각각의 스레드로 구성된다. 이는 모든 탭이 하나의 프로세스 공간에서 실행되고 서로 간섭을 받을 수 있으며, 하나의 탭의 문제가 전체 프로세스에 영향을 줄 수 있다는 의미이다.
반면에 Chrome 브라우저는 탭마다 별도의 프로세스를 사용한다. 각 탭은 독립적인 프로세스로 실행되므로 하나의 탭에서 문제가 발생하더라도 다른 탭과 브라우저 자체에는 영향을 주지 않는다. 이것은 안정성과 보안 면에서 이점을 제공하지만 이로 인해 메모리 사용량이 더 높을 수 있다.
PCB는 프로세스에 대한 모든 정보가 모여있는 곳으로 Task Control Block(TCB)이라고도 한다. 각각의 프로세스마다 PCB가 따로 존재한다. PCB 들은 OS의 Process management가 관리한다. PCB에 들어있는 정보는 다음과 같다.
컨텍스트 스위칭은 CPU가 한 프로세스에서 다른 프로세스로 옮겨가는 것을 말한다. 예를 들어 프로세스 A가 running 상태, B가 ready 상태라 가정하자.
job queue 안의 프로세스들의 순서를 정해주는 것을 job Scheduler라고 한다. job Scheduler는 long term Scheduler라고도 부른다. 메모리가 꽉 차있는 경우를 생각해 보자. job Scheduler는 프로세스가 완전히 끝나고 메모리가 비워져야 일어나는데 이러한 일은 자주 일어나지 않고 대략 몇 분 간격으로 일어나기 때문이다. 또한 job Scheduler는 CPU/IO bound process 들을 적절히 섞어서 올리는 것이 중요하다.
OS의 역할 중 하나는 성능 향상이다. 만약 메인 메모리에 A라는 프로세스가 활동하지 않는다면 이 프로세스에 CPU time을 할애하는 건 비효율적이다. Medium term Scheduler는 주기적으로 메인 메모리에 있는 프로세스들을 검사하여 하드디스크로 옮길 프로세스를 찾아서 옮겨준다.
ready queue 안의 프로세스들의 순서를 정해주는 것을 CPU Scheduler라고 한다. CPU의 스위칭은 굉장히 빠르므로 CPU Scheduler는 short term Scheduler라고도 부른다.
job queue, ready queue, device queue 모두 OS의 Process management에 들어있다. 또한 queue 안에는 PCB 들이 줄을 서서 대기한다.
Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
Non-Blocking : 다른 주체의 작업에 관련없이 자신의 작업을 하는 것
Blocking/Non-Blocking은 현재 작업이 block 되느냐 아니냐에 따른 제어의 관점
Synchronous : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미
Asynchronous : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작 하지 않음을 의미
Synchronous/Asynchronous는 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 따른 순서와 결과(처리) 관점
CPU 스케줄링은 어떤 프로세스가 CPU를 사용할 수 있게 하는지를 결정하는 정책이다. 방식은 크게 비선점형과 선점형으로 나뉜다.
비선점형 방식(non-preemptive) : CPU가 특정 프로세스를 수행 중에 다른 프로세스가 CPU를 선점할 수 없고 프로세스가 스스로 CPU 소유권을 포기하는 방식
FCFS : 가장 먼저 온 것을 가장 먼저 처리하는 알고리즘이다. convoy effect가 발생할 수 있다.
convoy effect : CPU를 많이 필요로 하지 않는 프로세스들이, CPU를 오랫동안 사용하는 프로세스가 끝나기를 기다리는 현상
SJF : 실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘이다. 평균 대기 시간이 가장 짧으며 starvation이 일어날 수 있다. 하지만 실제로는 실행 시간을 알 수 없어서 과거 실행했던 시간을 토대로 유추해서 사용한다.
starvation : 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태
선점형 방식(preemptive) : CPU가 특정 프로세스를 수행 중에 다른 프로세스에게 CPU를 선점해주는 방식
라운드 로빈 : 현대 컴퓨터가 쓰는 스케줄링 방법이며 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘이다. 할당 시간이 너무 크면 FCFS가 되고 짧으면 컨텍스트 스위칭이 잦아져서 오버헤드, 즉 비용이 커진다. 일반적으로 전체 작업 시간은 길어지지만 평균 응답 시간은 짧아진다는 특성이 있다. 로드밸런서에서 트래픽 분산 알고리즘으로 쓰인다.
SRF(Shortest Remaining (Time) First : 중간에 실행 시간이 더 짧은 작업이 들어와도 기존 짧은 작업을 모두 수행하고 그다음 짧은 작업을 이어 나가는 SJF에 비해 중간에 만약 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
다단계 큐 : 우선순위에 따른 준비 큐를 여러 개 사용하고 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용한 것을 말한다. 큐 간의 프로세스 이동이 안되므로 스케줄링 부담이 적지만 유연성이 떨어지는 특성이 있다. 우선순위가 높은 큐부터 처리되기 때문에 낮은 큐의 프로세스가 처리가 안되는 기아 현상이 발생할 수도 있다.
Convey effect : 몇 개의 시간이 오래 걸리는 프로세스로 인해 다른 프로세스의 실행이 느려지고 전체적인 프로세스의 성능을 저하시키는 현상으로 FCFS 알고리즘을 사용할 때 나타나는 현상이다.
Starvation : 우선순위가 자꾸 밀려서 해당 프로세스가 아예 실행 안되는 즉 무기한으로 CPU 실행으로부터 대기할 때 발생한다. SJF 알고리즘을 사용할 때 나타날 수 있는 현상으로 aging을 통해 해결할 수 있다. 여기서 aging이란 오래된 작업일수록 우선순위를 높이는 방법을 의미한다.