운영체제는 좁은 의미로 커널이라고 부른다. 따라서 핵심적인 부분을 커널이라고 부르고 이는 컴퓨터가 부팅되고 메모리에 항상 상주한다.
넓은 의미로는 커널 뿐만 아니라 각종 주변 시스템 유틸리티를 포함한 개념이다.
전공자 입장에서의 운영체제는 커널만을 이야기한다.
크게 두가지로 나눌 수 있다.
운영체제의 위치가 하드웨어의 위, 사용자의 아래이므로 운영체제는 하드웨어
사용자가 편리하게 사용할 수 있어야 한다. 현대의 컴퓨터는 여러 프로그램이 하나의 컴퓨터에서 동시에 실행되도록 지원한다. 컴퓨터는 한대 있으나, 프로그램들이 혹은 사용자들이 자신의 프로그램만 컴퓨터에서 돌아가는 것 같은 인상을 주도록 하는것이 목적이다. (자신의 프로그램만 CPU를 할당받은 것 처럼 느낀다.)
사용자들은 하드웨어 자원들을 어떻게 관리하고 분배되는지 잘 알지 못하지만 운영체제가 있기 때문에 컴퓨터를 잘 사용할 수 있는 것이다.
주어져있는 하드웨어로 최대한의 성능을 내는 것
목적을 두가지로 나눌 수 있다.
1. 효율성
최대한의 성능을 내는 것
효율성만을 추구하면 특정사용자가 차별받는 상황이 나올 수 있다. 따라서 이러한 상황에서 특정 사용자/프로그램이 너무 차별받아 불이익을 받지 않도록 형평성을 고려해야한다.
2. 형평성
자원 관리에 필요한 요소이다.
프로세스, 파일, 메시지 등 또한 자원이라고 부른다. 하드웨어와는 분리되는 소프트웨어 자원이라고 부른다.
운영체제가 사용자나 자신을 보호하는 역할 또한 수행해야 한다.
한번에 하나의 프로그램만 실행되는 single tasking이다.
하나의 명령어 수행이 끝나기 전엔 다른 명령을 수행할 수 없다.
프로그램 하나만 실행하면 되므로 설계가 쉽다.
아직도 단일작업만 가능한 경우도 있긴 하다. 전화만 가능한 핸드폰이라던가, 운영체제가 탑재된 엘레베이터 등 기능이 단일일 하나의 특수한 목적을 위한 기기등이 예이다.
현대의 운영체제들이다. 동시에 여러 프로그램이 수행되도록 지원해주고 있다.
하나의 컴퓨터에 여러 사용자가 동시에 접근할 수 있는지 ?
단일 작업만 지원해준다면 단일 사용자만 지원한다.
ex)MS-DOS
여러 사용자가 계정을 여러개 만들어 동시에 접근이 가능하다. 사용자가 많으면 file이나 메모리 접근을 다른 사용자가 할 수 없도록 하는 보안문제나, 자원의 형평성 문제등이 더 고려가 되어야 한다.
ex)UNIX
작업이 주어져있을 때 바로바로 처리하는 것이 아닌, 모아서 한꺼번에 처리하는 방식을 말한다.
현대의 운영체제에서는 찾아보기 힘든 방식이다.
우리가 생각하는 컴퓨터 시스템과는 조금 다르다. 역사속의 시스템으로 interactive하지 않다.
입력한다고 바로 화면에 나오지 않고 작업을 모아 한꺼번에 처리한다.
이를 통해 코딩하려면 카드에 마킹을 하고 구멍을 뚫어 제출하면 이것들을 모아 컴퓨터에 집어넣고 컴파일이 제대로 되는지 확인하고 다시 돌려주며 에러가 하나 있다. 등의 말을 해주고 이를 수정해서 내는 등의 과정을 거쳤다.
이런 시스템이 있었을 땐 오류가 나면 하루가 지연되니, 오류가 안나는 것이 중요했다.
예전의 동사무소에서 주민등록등본을 하나 뗴려면 신청서를 써서 내면 30분을 기다리라고 한다. 그러면 직원은 신청서를 가지고 창고에서 해당하는 서류를 꺼내 복사 후 민원인에게 돌려줬다. 굉장히 비효율적이었기 때문에 30분정도 서류를 받아서 모아 창고에 가서 한꺼번에 가져와 복사해 민원인들에게 돌려줬다. 이러한 방식을 일괄 처리라 한다.
현대의 운영체제에서 자주 쓰인다.
여러 작업이 수행될 때, 작업은 동시에 실행되지만 작업에 각각 시간 및 순서를 할당해 번갈아가면서 수행하는 방식이다.
사용자 입장에선 interactive한 방식이다. interactive하다는 것은 사용자가 입력했을 때 바로바로 결과를 볼 수 있는 것을 말한다. 우리는 예시로 계산기를 사용할 때 계산기에 값을 입력하고 그것이 출력되는 것, 계산하는 것을 바로바로 응답받을 수 있다. 이와 같은 방식을 interactive하다고 한다.
일괄 처리 시스템에 비해 짧은 응답시간을 가진다.
사람이 느끼지 못할 정도의 엄청 짧은 시간을 각각 할당해 사용자는 프로그램들이 동시에 수행된다고 생각할 수 있다.
하지만 시간의 dead line이 있는 것은 아니다. 사용자가 많다면 응답 시간이 조금씩 늘어날 수 있다. 하지만 시분할 방식의 목적은 사람이 느끼기에 빠르게 해주면서 동시에 주어진 자원을 최대한 효율적으로 사용하는 것이다.
용어만으로 봤을 땐 시분할과 실시간이 둘 다 interactive해 보이고 비슷해보이나 다르다.
실시간은 dead line이 있어 정해진 시간 안에 어떤일이 반드시 종료됨을 보장한다. 따라서 특수한 목적을 가진 시스템에서 그 작업이 반드시 정해진 시간안에 수행되어야만 하는 곳에서 사용된다.
예시로 원자로/공장 제어, 미사일 제어, 반도체 장비, 로보트 제어에서 사용된다.
반도체를 하나 찍어내는 걸 집어넣으면 파이프라인 구성으로 되어 있기 때문에 다음 공정으로 가는 dead line 이 있다. 여러 공정을 거쳐 완성을 시킬 수 있다. 연속적으로 작업들이 수행되기 때문에 한 공정에서 문제가 생기면 전체적인 공정에서 문제가 생길 수 밖에 없다. 따라서 dead line이 굉장히 중요하다.
최근에는 실시간 시스템이 특수 목적 뿐만아니라 좀 더 완화된 개념으로도 사용되고 있다. 위에서 제시한 dead line 을 지키지 않으면 치명적인 문제를 일으키는 것을 Hard realtime system (경성 실시간 시스템)이라고 한다. 반대로 멀티미디어 플레이어와 같은 dead line 내에 디코딩을 해야 영화를 볼 수 있는 시스템은 dead line을 지키지 않아도 사용자가 조금 불편할 뿐 치명적인 문제가 생기진 않는다. 따라서 이러한 시스템을 Soft realtime system(연성 실시간 시스템)이라고 한다.
하지만 우리가 웹 서핑을 한다던지 해서 보는 영화 시스템들은 시분할을 통한 것이다. 따라서 시분할은 dead line을 지켜주지 않기 때문에 프로그램을 동시에 굉장히 많이 띄워 실행하고 있는다면, 느려질 것 이다.
네비게이션을 생각했을 때 dead line을 지키지 못하면 길을 잃어버릴 수도 있고, 블랙박스 또한 dead line을 지키지 못하면 중요한 순간을 담지 못할 위험이 있다. 따라서 실시간성이 중요해지고 있고 운영체제 또한 이러한 실시간 성을 어떻게 지원해줘야 하는가에 대해 중요한 이슈가 되고 있다. (범용 운영체제)
우리는 시분할 시스템에 대해서 배운다.
지금 우리가 사용하는 운영체제는 다중 작업, 다중 사용자를 지원하며 시분할 시스템을 사용한다는 것을 알아야 한다.
여러 작업이 동시에 실행되는 것을 보통 multitasking이라고 부르며 이는 좀 더 일반적인 용어이다.
컴퓨터 전반에서 하나의 프로그램이 끝나기 전에 다른 프로그램을 실행할 수 있는 것을 multitasking이라 부른다.
mutiprogramming은 여러 프로그램이 메모리에 올라가 있는 것이다. 이는 메모리 측면을 강조했으며 multitasking이 되려면 당연히 프로그램이 메모리에 올라있어야한다.
time sharing도 유사한 말이지만 CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조한다.
multiprocess 또한 process가 프로그램을 나타내므로 유사한 의미를 가진다.
하지만 multiprocessor는 하나의 컴퓨터에 CPU가 여러개 붙어있음을 의미한다. processor는 처리기로 CPU를 뜻한다. 위의 용어들은 CPU가 하나여도 번갈아가면서 동시에 수행하는 것처럼 보이게 하는 것이고 multiprocessor는 위의 작업은 당연히 수행되고, 하드웨어적 구조가 다른것이다.
초창기엔, 대형컴퓨터를 위해 만들어졌다.
멀티 태스킹이 되고 여러 사용자가 접근할 수 있게 만들어졌다.
컴퓨터도 제대로 없던 시기에 어셈블리어로 운영체제가 만들어져 굉장히 힘들었다. 따라서 UNIX를 위해 프로그래밍 언어를 만들었고 이게 C 언어이다. C언어가 지금은 여러 프로그램을 만드는데에 사용되지만 초창기엔 UNIX를 만들고, 시스템 소프트웨어를 만들 때 사용되었다. 어셈블리어로 프로그램하는 것이 어려워 C 언어를 만들었고 고급언어이나 기존의 고급어와는 달리 사람과도 가깝고 기계랑도 가까운 언어였다.
초창기엔 소스코드를 모두 공개했었다. 따라서 누구나 가져다 쓰기 쉽고 학교에서 운영체제를 공부하고 설계하고 변경하기 좋았다. 높은 이식성을 가지고 있다. 하나의 컴퓨터에서 돌아가는 UNIX를 기계어 집합이 전혀 다른 기계에 이식하기 쉽다. 이식하기 어려운 기계는 ? 하나의 기계에만 국한되도록 만든 운영체제 ! 하지만 UNIX는 대부분을 기계어와 독립적인 C언어로 만들었으므로 컴퓨터를 옮겨 다시 컴파일 하면 되므로 이식성이 높다.
커널의 크기가 굉장히 작다. 많은 기능들을 커널에 넣어놓으면 메모리의 상당 부분을 운영체제가 차지하지만, 핵심적인 부분만 커널에 넣었다. 따라서 확장성 또한 굉장히 높다.
System V, Free BSD, SunOS, Solaris
Linux (오픈소스로 누구나 자유롭게 사용할 수 있는 운영체제이다.)
UNIX는 초기에 대형컴퓨터 즉 여러 사용자들이 서버에 접속하기 위해 만들어졌는데, LINUX는 서버에도 사용되지만 개인용 컴퓨터에서도 사용하기에 좋게 설계되어 있다. 따라서 여러 환경에서 사용가능하다.
안드로이드도 운영체제 커널은 LINUX 커널을 사용하고 있다.
개인용 컴퓨터를 위해 만들어졌다. 개인용 컴퓨터를 위함이므로 단일 사용자, 단일 작업을 하도록 설계되었다.
메모리의 한계를 640KB로 만들어 하드웨어가 발전됨에 따라 이리저리 코드를 덧붙이며 사용이 어려웠다.
다중 작업용 GUI 기반의 운영체제로 DOS용 응용 프로그램과의 호환성을 제공한다.
컴퓨터 구조
하나의 프로그램이 CPU를 점유한 채 놓아주지 않는다면 다른 프로그램들은 계속 기다려야 된다. 이는 굉장히 비효율적이다.
만약 은행원이 한명이고 여러 대기자가 있다고 했을 때 첫번째 사람이 해결해야하는 일은 1시간 걸리고 뒤의 사람들은 1분씩 걸린다고 가정해보자.
1. 들어온 순서대로 일을 처리한다면 뒤의 대기자들은 실행시간이 1분 밖에 걸리지 않는데 1시간 이상을 기다려야한다.
2. 실행시간이 짧은 순으로 일을 처리한다면 뒤의 대기자들이 먼저 실행하고 첫번째 실행자가 마지막에 실행한다면 프로그램의 전체적인 효율이 좋아진다.
메모리는 한정되어 있으므로 한정되어 있는 메모리를 나눠 쓰는 방법 또한 중요하다. 프로그램이 메모리를 너무 적게 가지고 있다면 뭐만 하면 디스크에서 읽어와야 한다. 따라서 적어도 CPU가 원할하게 소통할 수 있는 메모리는 지원해야한다.
메모리가 한정되어 있기 때문에 새로운 프로그램이 수행되어 메모리를 할당해줘야할 때 기존에 할당되어 있는 프로그램을 쫓아내야할 수 있다. 이 때 미래에 해당 프로그램이 쓰이지 않을 확률이 높은 것을 기준 삼아야하는데, 미래를 알 수 없으므로 과거를 통해 이를 유추할 수 있다.
디스크에 파일을 어떻게 보관을 하는가
조각조각으로 나눠서 관리할 지 연속적으로 관리할지..
디스크의 특성에 맞게 파일을 관리하고 스케줄링을 관리하는 것이 필요하다.
데이터를 읽거나 쓰라는 요청을 먼저들어오는 순서대로 처리할 수 있지만, 디스크는 헤드를 움직여 작업을 처리하므로 순서가 조금 낮지만 가까운 데이터를 먼저 읽는다던가의 스케줄링을 활용할 수 있다.
엘레베이터를 생각하면 이해가 쉽다. 20층에서 출발해서 1층에 갔다가, 18층을 갔다가 2층을 가는것은 비효율 적일 것 이다. 따라서 헤드 또한 같은 방향의, 가까운 데이터를 처리하면서 진행하는것이 효율적이다.
어떻게 하면 움직임을 최소화하면서 많은 데이터를 처리할 수 있는가
I/O device를 어떻게 관리할 것인가
CPU 등 보다 훨씬 느리다. 컴퓨터와 교신해야하는데 워낙 느리므로 정보를 어떻게 주고 받을 것인가가 중요한 이슈이다. 기본적으로 입출력 관리하는 방법은 인터럽트를 통해 관리한다. CPU는 항상 바쁘므로 자기일을 하고 있다가 CPU가 I/O에 할 일이 있으면 인터럽트를 걸어 CPU 에 알려주면 CPU는 다음 일을 하기 전에 처리해준다. 이를 통해 CPU가 하는일이 방해받지 않는다.
Operating System Concepts 10th
KOCW 강의 - [운영체제] 이화여자대학교 반효경 교수