CS/운영체제

운영체제에 대한 소개

honeyricecake 2023. 6. 25. 17:48

지금부터 운영체제가 무엇을 해야하는지 간단히 생각해보도록 합시다.

 

1. 운영체제는 자원을 할당해주어야 합니다.

 

여기서 자원이란 무엇인가를 알아보기 위해 예시를 들어보겠습니다.

 

cpu가 1대 있고 실행 중인 프로세스 A,B,C 3개가 있을 때, 사실 cpu는 프로세스 3개를 동시에 수행할 수 없습니다.

그런데 우리 눈에는 프로세스 3개가 동시에 수행 중인 것으로 보이는데 이는 사실 프로세스 3개를 매우 빠른 속도로 번갈아 수행하는 것입니다.

그럼 cpu 1대가 100초 동안 실행된다고 하면 그 중 40초는 A, 40초는 B, 20초는 C를 수행할 수 있습니다.

(만약 이런 상황이라면 C가 A,B에 비해 상대적으로 덜 중요, 혹은 상대적으로 cpu를 쓰지 않는 프로세스이겠지요.)

 

이 때 우리는 시간을 할당하고 있는데 여기서 시간이 바로 자원(resource)이 됩니다.

이 때 cpu가 프로세스를 수행하는 시간 외에도 메모리 등 역시 자원입니다.

 

이러한 자원의 할당이 바로 운영체제의 역할입니다.

 

그리고 운영체제는 이렇게 자원을 할당해주는 데에 세가지 목표를 가집니다.

 

1. Fairness(공평성) : 프로세스들에게 가능한 공평하게 자원을 할당해줄 것

 

2. Responsiveness(응답성) : 프로세스들이 가능한 사용자의 요청에 빨리 응답할 것

 

3. Efficiency(효율) : throughput(처리량)을 최대화하는 것

 

때때로 이들은 상호충돌하는데 이들이 상호충돌하는 예시는 Scheduling 파트에서 자세히 확인할 수 있습니다.

지금은 이들이 상호충돌하므로 trade-off가 필요하다 정도로 알아두시면 됩니다.

 

 

2. 운영체제는 환상을 제공해야 합니다.

 

어찌보면 굉장히 생뚱맞은 이야기인데요.

 

- 모든 프로세스가 각자의 cpu를 가지고 있는 것처럼 보이는 CPU가상화

- 모든 프로세스가 machine의 모든 메모리를 각자 점유하고 있는 것처럼 보이는 메모리 가상화

- 모든 프로그램이 각자의 I/O터미널을 가지고 있는 듯이 보이는 것

 

위의 내용들은 컴퓨터를 사용해본 사람들이라면 모두 공감할 수 있는 것들인데 이러한 가상화를 제공하는 것이 바로 운영체제의 역할 중 하나입니다.

 

3. 운영체제는 이식성을 지원해야 합니다.

 

우선 추상화(abstraction)에 대해 알아봅시다.

우리는 프린트기를 사용할 때 내부의 동작과정을 몰라도 인쇄 버튼 만 누르면 프린트기를 사용할 수 있습니다.

이는 프린트기의 인쇄 기능이 인쇄버튼으로 '추상화'되었다고 할 수 있습니다.

이렇듯 내부 동작을 몰라도 사용자가 해당 기능을 사용할 수 있도록 하는 것이 추상화입니다.

 

운영체제가 하드웨어를 추상화하고 사용자의 어플리케이션에 깔끔한 인터페이스(시스템콜)을 제공하면 해당 인터페이스를 사용하는 소프트웨어들은 모두 하드웨어의 동작을 신경쓰지 않고 하드웨어를 사용할 수 있습니다.

 

이렇게 하드웨어가 어떻게 구현되어있든 하드웨어의 동작을 신경쓰지 않고 하드웨어를 사용할 수 있게 해주는 것이 바로 '이식성'입니다.

 

운영체제가 위와 같은 세가지 기능을 제공해야 한다는 것은 뒤의 운영체제의 구성과 그 이유를 공부하는데에 기반이 됩니다.

 

 

Performance(성능)

 

성능이라고 모두 같은 성능은 아닙니다.

 

한 개의 작업을 몇초만에 끝낼 수 있는가? 를 latency(지연)라고 합니다. latency 즉, 지연이 작으면 responsiveness가 좋은 것으로 봅니다.

 

그리고 throughput(처리량) 이란 개념도 있습니다.

이는 단위시간당 얼마나 많은 작업을 처리할 수 있는가의 개념입니다.

 

그리고 앞으로 계속해서 볼 용어로 Overhead(부하)가 있습니다.

프로그램 실행에 운영체제가 개입하는 시간인데, 예시를 하나 들어보겠습니다.

 

프로세스 A,B,C,D가 같이 수행된다고 해봅시다.

이 때 A가 수행되는데 4초, B,C,D가 수행되는데 36초가 걸린다고 하면 실제 수행시간이 40초일까요?

아닙니다. A가 수행되다가 B,C,D 등 다른 작업으로 전환될 수 있는데 이 때 다른 작업으로 전환되는데도 걸리는 시간이 있습니다.

이렇듯 실제 프로그램이 실행되는 것이 아닌, 운영체제의 개입 등으로 인해 생기는 부하를 Overhead라고 합니다.

 

위의 세가지 용어는 계속해서 등장하므로 잘 알아두도록 합시다.

 

 

운영체제의 진화 (Evolution of OS)

 

운영체제는 이전에는 한번에 한 프로그램을 수행하도록 되어 있었습니다.

그래서 여러개를 한번에 수행 못 한다는 점 때문에 utilization이 낮았습니다.

 

이후 time sharing system을 이용한 multi programming이 지원되기 시작하며 여러 사용자가 한 컴퓨터를 동시에 사용할 수 있게 되었습니다.

하지만 이 multi programming에도 문제가 있었는데, 바로 여러 프로그램이 반드시 독립적이어야 한다는 것입니다.

서로가 서로에게 개입할 수 있으면 보안상의 문제가 발생할 수 있기 때문입니다.

 

Protection

 

1. Preemption (선점)

 

Resource 는 Program에게 주어질 수 있고 OS는 주어진 resource를 다시 뺏을 수 있습니다.

ex. 프로세스 A가 수행 중이면 OS는 이를 중단시키고 다른 프로세스가 수행되도록 할 수 있습니다.

 

2. Interposition (개입)

 

OS는 hardware를 숨기고 Application은 OS를 통해서 hardware에 접근해야 합니다.

만약 프로세스 A가 메모리에 직접 접근하여 프로세스 B의 메모리에 접근하게 된다면? 의도치 않은 오류가 생길 수 있습니다.

 

3. Privilege (권한)

 

우리는 지금부터 mode를 나누어 권한을 줄  경우와 안 줄 경우를 구분합니다.

kernel mode는 privileged

user mode는 non-privileged

로 구분하고 user mode가 system call을 통해 kernel mode에 특정동작을 요구하면 kernel mode에서 해당 작업을 수행하고 결과를 알려줍니다.

 

이렇게 user mode와 kernel mode를 구분하여 user mode의 작업이 함부로 메모리 등에 직접 접근하지 못하도록 하는 것이 모드를 구분하는 이유입니다.

 

 

Kernel 이란?

 

좀 더 권한이 있는 프로그램으로 hardware에 대한 접근을 control하고 중재합니다.

기본적인 (프로세스, 스레드, 메모리, 파일, 네트워크에 대한)추상화를 구현, 지원하며 자원을 관리하고 security와 protection을 강화합니다.

그리고 유저의 service에 대한 요청(system call)에 응답합니다.

(system call에 해당하는 작업을 수행 후 return 값 전달)