개요
운영체제란 컴퓨터 시스템에서 실행되고 있는 가장 기본적인 소프트웨어 중의 하나로써 컴퓨터 시스템을 사용해본 누구나 운영체제를 접해본 경험이 있다. 그럼에도 불구하고 운영체제를 명확하게 정의하기란 쉽지 않다. 왜냐하면 "운영체제란 이런 것이다"라고 정의된 후에 운영체제가 나타난 것이 아니고 컴퓨터 시스템을 보다 효율적이고 편리하게 이용할 목적으로 개발된 단순 프로그램에서 출발하여 복잡하고 다양한 형태의 프로그램으로 발전해 오고 있기 때문이다. 또한 운영체제는 하드웨어와 사용자 혹은 응용 프로그램 사이에 위치하고 있으며 사용자들은 주로 응용 프로그램을 통하여 컴퓨터 시스템을 사용하기 때문에 운영체제 존재 자체를 인지하지 못할 수 있다.
- 일반적으로 운영 체제는 응용 프로그램의 실행을 제어하고 컴퓨터 시스템의 입출력 장치와 사용자 사이의 인터페이스 역할을 하는 프로그램으로 정의되고 있지만 운영체제를 바라보는 관점에 따라 다양하게 정의할 수 있다.
- ex) 시스템 사용자 입장에서는 컴퓨터 시스템을 보다 편리하게 사용할 수 있는 환경을 제공해주는 프로그램으로 정의할 수 있을 것이고 시스템 관리자 입장에서는 컴퓨터 시스템의 자원들을 효율적으로 이용할 수 있도록 제어하는 프로그램으로 정의할 수 있을 것이다.
- 운영체제마다 그 역할과 기능들이 매우 다양하기 때문에 운영 체제를 한 마디로 정의하기가 쉽지 않다. 따라서 운영체제를 보다 명확하게 정의하기 위해서는 기존의 운영체제들이 지니고 있는 공통적인 특성들에 대하여 살펴보고 컴퓨터 시스템의 동작원리를 중심으로 동작 원리를 이해하는 것이 중요하다.
- 시스템 관점에서 운영체제를 정의하면 사전적으로 시스템은 어떤 주어진 목적을 달성하기 위해 여러 개의 구성요소들이 유기적으로 결합된 집합체를 의미한다.
운영체제의 목적
- 기존의 운영체제들이 지니고 있는 특성들을 살펴볼 때 이들의 공통적인 주된 목적은 컴퓨터 시스템 자원의 효율적 관리와 편의성 제공이라 할 수 있다. 운영체제가 관리해야 할 컴퓨터 시스템 자원에는 CPU, 메모리, 디스크, 프린터, 키보드 등과 같은 하드웨어는 물론 파일, 서비스 루틴과 같은 소프트웨어가 있음을 유의한다.
- 자원들은 컴퓨터 시스템마다 보유하고 있는 종류는 다르지만 그 보유량은 모두 제한적이다. 따라서 컴퓨터 시스템을 보다 경제적으로 이용하기 위해서는 제한된 자원들에 대한 효율적인 관리 기능이 요구된다. 또한 사용자의 편의성이란 사용자들로 하여금 프로그램 작성과 실행을 보다 쉽게 할 수 있는 환경을 의미한다.
- 기존의 운영체제들이 공통적으로 추구하는 궁극적인 목표는 자원의 이용률과 사용자의 편의성을 극대화하는 것이다.
- 이 두가지의 목표는 서로 이율배반적임을 유의해야 한다. 왜냐하면 사용자의 편의성을 위해 보다 많은 자원을 가지고 있어야 할 것이고 보다 많은 자원을 유지하다 보면 자원의 이용률은 떨어지게 될 것이기 때문이다.
운영체제의 구성요소
운영체제의 구성 요소는 컴퓨터 시스템의 용도에 따라 다르지만 기존의 운영체제들의 구조를 살펴볼 때 일반적으로 CPU 관리 루틴, 메모리 관리 루틴, 파일 관리 루틴, 입출력 장치 루틴, 그리고 사용자 인터페이스를 담당하는 루틴들로 구성되어 있다. 이 루틴들은 독립적인 것이 아니고, 서로 상호 호출 관계를 유지하면서 유기적으로 결합되어 있다.
결론적으로 시스템 관점에서 볼 때 운영체제란 "컴퓨터 시스템이 보유하고 있는 자원들을 효율적으로 관리하고 사용자에게 편의성을 제공하기 위해 CPU 관리, 메모리 관리, 파일 관리, 입출력 장치 관리, 그리고 사용자 인터페이스를 담당하는 루틴들이 유기적으로 결합된 프로그램"이라고 정의할 수 있다.
운영체제의 필요성
초기 컴퓨터 시스템에는 운영체제가 없었다. 프로그램 작성부터 실행을 위한 일련의 모든 작업들을 컴퓨터 시스템 사용자가 직접 해야됨으로, 컴퓨터 시스템 사용이 매우 불편함은 물론, 비싼 컴퓨터 시스템의 자원의 이용률이 매우 저조하였다. 따라서 사용자의 불편함을 덜어주고 컴퓨터 시스템 자원의 이용률을 향상시키기 위한 프로그램 즉, 운영체제 개발이 요구되었다.
컴퓨터 시스템 동작 원리
CPU 중앙 처리장치(Central processing Unit)는 가장 중요한 장치로써 메모리에 존재하는 명령어를 처리한다.
CPU는 처리해야 할 명령어가 있는 메모리 주소를 어떻게 아는가? -> CPU 내부의 PC 레지스터를 이용한다.
즉, PC 내부의 명령어 레지스터로 읽어온다. 이때 읽어온 명령어를 처리할 수 없으면 더 이상 진행할 수 없을 것이다.
결국 컴퓨터 시스템에 전원이 가해지는 순간부터 꺼질 때까지 CPU는 PC 레지스터 값에 해당되는 메모리 주소의 명령어 처리하기를 반복할 것이다. 따라서 컴퓨터 시스템의 동작 원리는 입력 장치를 통하여 CPU 명령어들을 메모리에 적재시켜놓고 CPU로 하여금 PC 레지스터 값에 해당하는 메모리 주소의 명령어 처리하기를 반복할 것이다. 따라서 컴퓨터 시스템의 동작 원리는 입력장치를 통하여 CPU 명령어들을 메모리에 적재시켜놓고 CPU로 하여금 그 명령어들을 하나씩 처리하여 출력장치로 그 결과를 출력하도록 PC 레지스터 값을 조작하는 것이다.
개인용 PC가 부팅되는 과정을 인텔 8086 계열의 CPU로 살펴보면 인텔 80X86 계열의 CPU 내부의 CS, EIP 레지스터가 PC 레지스터의 역할을 한다. 전원을 켜는 순간 CS:EIP 레지스터의 초기값은 F000:FFF0로 설정되어 메모리 FFFF0번지의 명령어를 읽어와서 처리하려고 한다. 따라서 메모리 FFFF0 번지에 CPU가 처리할 수 있는 명령어가 적재되어야 한다. 이곳에 적재되어 있는 명령어가 바로 BIOS(Basic Input Output System)라고 일걷는 프로그램의 시작이다. 이 프로그램의 비휘발성 메모리인 ROM을 사용하고 있어 일반적으로 이 프로그램을 "ROM-BIOS"라고 부른다.
ROM-BIOS 프로그램은 처음 명령어부터 시작하여 순차적으로 실행될 것이다. ROM-BIOS 프로그램의 마지막 명령어를 실행한 후 CPU는 전원이 꺼질 때 까지 명령어 처리를 반복한다는 사실에 유의해야 한다.
BIOS의 마지막 명령어는 부팅디바이스 ex) HDD, FDD로 부터 부트 프로그램을 메모리 7C00번지에 적재하고 CS:EIP 레지스터의 값을 07C0:0000 으로 설정한다. 따라서 CPU는 메모리 7C00에 적재된 명령어 즉, 부트 프로그램의 처음 명령어를 실행한다.
- 부트 프로그램은 부팅 디바이스로부터 운영체제를 메모리에 적재한 후 CS:EIP 레지스터 값을 운영체제가 적재된 메모리 주소로 설정함으로써 운영체제 프로그램이 초기화된다.
- 운영체제가 초기화된 후 바탕화면 혹은 명령어를 받아들이기 위한 프로그램이 메모리에 적재된 후 무한 루프를 돌면서 사용자의 명령어를 기다리게 된다.
- 이 단계에 이르면 "컴퓨터 시스템이 정상적으로 부팅되었다"고 한다. 정상적으로 부팅된 후 응용 프로그램을 실행시키고자 할 때 사용자는 단순히 그 프로그램에 해당되는 아이콘을 더블 클릭하면 된다.
- 사용자가 더블클릭한 응용 프로그램이 실행되기 위해선 부팅 과정에서와 마찬가지로 그 프로그램이 저장된 보조 기억장치로부터 메모리로 적재되고 CPU의 SC:EIP 값을 적재된 메모리 주소로 설정되어야 한다.
- 이러한 복잡하고 어려운 과정을 운영체제가 서비스해주고 있기 때문에 사용자는 컴퓨터 시스템에서 응용 프로그램을 쉽게 실행시킬 수 있다.
운영체제에 의해 처리되는 일을 간략하게 설명
- 마우스의 더블 클릭 인터럽트를 처리해야 한다.(인터럽트 처리)
- 더블 클릭된 아이콘에 해당하는 응용 프로그램의 파일 보조 기억장치에서 찾는다(파일 시스템)
- 응용 프로그램을 적재하기 위한 메모리의 빈 공간을 찾는다.(메모리 관리)
- 보조 기억장치로부터 응용 프로그램을 메모리로 적재한다(입출력 장치 관리)
- CS:EIP 값을 조작한다.(CPU 관리)
이와 같이 운영체제에서 다양한 서비스를 제공하기 때문에 사용자들은 컴퓨터 시스템을 보다 쉽게 사용할 수 있는 것이다.
다중 프로그래밍
- 다중 프로그래밍은 CPU의 이용률을 극대화하기 위하여 고안된 기법으로써 운영체제 발전 과정의 커다란 전환점이 되었다.
- 하나의 프로그램이 실행되는 과정에서 입출력 요구가 발생하게 되면 입출력 처리가 완료될 때 까지 CPU는 유후 상태에서 기다리게 된다. 이 시간을 "CPU의 유후시간(Idle Time)"이라고 한다.
- 이러한 CPU의 유후 시간을 활용하기 위하여 여러 개의 프로그램들을 메모리에 적재시켜 놓고 하나의 프로그램이 실행되는 과정에서 입출력 요구가 발생하면 운영체제로 하여금 다른 프로그램을 실행시키도록 CPU 사용을 전환함으로써 CPU의 이용률을 향상하는 것이 다중 프로그래밍의 기본 개념이다.
- 다중 프로그래밍 기법은 프로그램이 입출력 장치에 의해 처리되고 있는 동안 또 다른 프로그램이 CPU에 의해 처리될 수 있기 때문에 컴퓨터 시스템 내부에서 여러 개의 프로그램이 동시에 처리되는 것과 같은 효과를 얻을 수 있다.
- 컴퓨터 시스템에서 단위 시간 당 처리되는 프로그램의 수 즉, 시스템의 처리율이 향상될 수 있다.
ex) 5초동안 두 번의 입출력 요구가 발생하는 두 개의 프로그램이 다중 프로그래밍 기법에 의해 처리될 CPU 이용률과 시스템 처리율을 계산해본다.
프로그램-1과 프로그램-2는 CPU에 의해 1초 동안 실행되다가 입출력 요구에 의해 1초 동안 대기하기를 반복하면서 처리하는 데 걸리는 시간이 각각 5초이며, 그 중 실제 CPU 사용 시간은 3초이고 나머지 2초는 입출력 처리에 요구된 시가니다. 위와 같이 다중 프로그래밍 기법을 이용하지 않는 경우 두 개의 프로그램이 처리되는 데 걸리는 시간은 6초이며, 나머지 4초는 입출력을 대기하며 소요된다. 따라서 CPU의 이용률은 60%이고 처리율은 2/10(프로그램/초)이다.
다중 프로그래밍 기법을 이용하여 처리할 경우 두 개의 프로그램이 처리되는데 걸리는 시간은 모두 6초가 소요된다. 그 중 실제로 CPU를 사용한 시간은 6초이며 입출력을 대기하며 소요된 시간은 없다. 따라서 CPU의 이용률은 100%이고 처리율은 2/6(프로그램/초)이다. 결국 다중 프로그래밍 기법을 이용함으로써 CPU의 이용률과 시스템의 처리율이 향상됨을 알 수 있다. 그러나 다중 프로그래밍 기법을 이용하여 CPU의 이용률과 시스템의 처리율 향상 효과를 얻기 위하여는 프로그램이 실행되는 과정에서 입출력 요구가 적절히 발생해야 하며 반드시 여러 개의 프로그램들이 메모리에 존재해야 하며, 반드시 여러개의 프로그램들이 메모리에 존재해야 한다. 따라서 이 기법을 지원하기 위한 운영체제는 여러 개의 프로그램을 적재시키기 위한 메모리의 분할 및 할당에 관한 기능과 메모리에 적재된 여러 개의 프로그램들 중에서 어느 것을 선택할 것인지 결정하는 CPU 스케줄링과 같은 다양한 발전 기법이 요구된다.
다중 프로그래밍 기법은 운영체제 발전 과정에서 커다란 전환점이 되어 운영체제의 복잡성을 야기시켰다.
운영체제의 진입점
- 운영체제는 자원의 효율적인 관리와 사용자의 편의성을 제공하기 위한 다양한 종류의 서비스 루틴들로 구성되어 있다. 이러한 서비스 루틴을 이용하기 위하여 운영체제 진입점(Entry Point)이 있어야 한다.
- CPU의 PC 레지스터 값이 사용자 프로그램이 적재된 메모리 주소에서 운영 체제가 적재된 메모리 주소로 변경되어야 한다.
- 다중 프로그래밍 환경에서는 다수의 사용자 프로그램들이 실행되면서 하나의 운영체제로의 진입이 통제되어야 한다. 운영체제로의 진입을 통제하기 위하여 프로그램의 실행 상태를 두 가지 모드(사용자 모드, 커널 모드)로 구별한다.
- 일반적으로 프로그램의 실행 상태를 구별하기 위하여 CPU의 프로그램 상태 레지스터(PSW: Program Status Word)를 이용하여 현재 실행 모드를 표시한다. 입출력 명령어를 포함하여 특정 명령어 들은 사용자 모드에서 실행할 수 없으며 반드시 커널 모드에서만 실행되도록 되어있다. 또한 응용 프로그램에서 운영 체제의 서비스를 이용하려면 반드시 모드 변환을 거치도록 함으로써 운영체제로의 진입을 통제한다. 이러한 모드 변환은 시스템 호출(System Call), 인터럽트(Interrupt)그리고 예외 현상(Exception)과 같은 사건이 발생할 경우에만 허용되며 이것이 운영체제로의 진입점이다. 따라서 운영체제는 이러한 운영체제로의 진입점을 위한 각각의 서비스 루틴을 가지고 있어야 한다.
시스템 호출(System Call)
시스템 호출은 응용 프로그램과 운영 체제 사이의 인터페이스 수단으로써 응용 프로그램에서 운영체제 내부의 서비스 루틴 호출을 의미한다. 일반적으로 응용 프로그램 내부의 서브 루틴을 호출할 경우 동일한 사용자 모드이기 때문에 직접 호출하면 된다. 그러나 사용자 모드에서 실행되고 있는 응용 프로그램은 커널 모드에서 실행되는 운영체제의 서브루틴을 직접 호출할 수 없다. 응용 프로그램에서 운영체제의 서브루틴을 직접 호출할 수있다. 응용 프로그램에서 운영 체제 내부의 서비스 루틴을 호출할 수 있는 인터페이스 채널이 필요하다. 이 인터페이스 채널이 바로 시스템 호출이다. 응용 프로그램은 시스템 호출을 통하여 운영체제 서비스를 이용할 수 있기 때문에 API(Application Programming Interface)라고도 부른다. 따라서 사용자 모드에서 프로그램이 실행되고 있는 동안에 시스템 호출이 발생하면 이를 처리하기 위하여 운영체제로 진입하게 된다.
인터럽트(Interrupt)
인터럽트는 입출력 장치에서 CPU로 보내는 신호로써 CPU와 입출력 장치 사이의 인터페이스 수단이다. CPU는 입출력 장치에게 명령을 보내고 입출력 장치는 CPU에게 신호를 보내어 인터럽트를 발생시킨다.
일반적으로 인터럽트가 발생하면 CPU는 실행하던 프로그램을 잠시 중단하고 인터럽트 처리 루틴을 실행한 훙 중단된 프로그램의 실행을 재개한다. 이러한 인터럽트는 언제 발생할지 예상할 수 없기 때문에 인터럽트 처리 루틴을 운영체제 내부에 구현한다. 따라서 사용자 모드에서 프로그램이 실행되고 있는 동안에 인터럽트가 발생하면 인터럽트 처리 루틴을 실행하기 위하여 운영체제로 진입하게 된다.
예외현상
- 예외현상은 프로그램이 실행되는 중에 CPU 내부에서 발생하는 시스템 오류이다.
- 예를 들어 나누기 명령어를 처리하는 과정에서 "0으로 나누기(Divide by zero)"를 수행해야 할 경우이다. 이러한 오류는 매우 치명적이며 언제 발생할 지 예상할 수 없다.
- 일반적으로 예외 현상 처리 루틴은 인터럽트 처리 루틴처럼 운영체제 내부에 구현된다. 따라서 사용자 모드에서 프로그램이 실행되고 있는 동안에 예외 현상 처리 루틴을 실행하기 위하여 운영 체제로 진입하게 된다.
리눅스 커널
커널(Kernel)은 운영체제의 구성요소 중 핵심적인 요소로서 시스템이 부팅된 후 메모리에 상주하는 특징이 있다. 따라서 리눅스 운영체제는 리눅스 커널을 기반으로 한 운영체제를 의미한다. 그러나 리눅스 운영체제는 대부분의 구성요소를 커널로 구현하고 있기 때문에 리눅스 커널이라고 일걷는다.
내부에는 위의 그림과 같이 크게 프로세스 관리 서브시스템, 파일 서브 시스템, 입출력 장치 구동기로 구분하여 많은 루틴들이 존재하며 이들의 상호 호출 관계가 매우 복잡한 형태의 모노리딕(Monolithic)구조로 구현되어 있다.
파일 관리 서브 시스템
파일 관리 서브 시스템은 파일이 생성되어 삭제될 때까지 파일 관리를 총괄적으로 담당하는 함수들의 집합으로써 일반 파일, 디렉토리 파일, 그리고 장치 파일 관리를 위한 루틴들을 포함한다. 이 루틴들은 프로세스 관리 서브 시스템과 밀접한 관계를 유지하고 있다.
프로세스 관리 서브시스템
프로세스 관리 서브시스템은 프로세스가 생성되어 종료될 때 까지 프로세스 관리를 총괄적으로 담당하는 함수들의 집합으로써 프로세스 스케줄링, 프로세스 간 통신, 그리고 메모리 관리를 위한 루틴들을 포함한다. 이 루틴들은 운영체제의 많은 기능을 담당하며, 매우 밀접한 관계를 가지고 있기 떄문에 세분화하기 어렵다.
시스템 호출 인터페이스
사용자 모드에서 실행되는 사용자 프로그램은 시스템 호출을 통하여 커널에서 제공하는 서비스들을 요청한다. 시스템 호출 인터페이스 루틴은 사용자 프로그램과 커널 사이의 인터페이스를 담당하는 루틴으로써 시스템 호출에 의한 커널 진입점이다. 이 루틴에서는 시스템 호출의 종류를 구별하여 내부에 존재하는 해당 서비스 함수를 호출한다.
입출력 장치 인터페이스
입출력 장치 인터페이스 루틴은 입출력 장치와 커널 사이의 인터페이스를 담당하는 루틴으로써 인터럽트에 의한 커널 진입점이다. 이 루틴에서는 입출력 장치에 의한 인터럽트 종류를 구별하여 해당 서비스 함수를 호출한다. 따라서 입출력 장치를 제어하기 위한 디바이스 드라이버와 매우 밀접한 관계를 유지하고 있다.
Reference
개념 이해를 위한 운영체제
https://velog.io/@bbkyoo/series/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0
시리즈 | 면접준비/컴퓨터 구조 - bbkyoo.log
CPU는 컴퓨터에서 가장 핵심적인 역할을 수행하는 부분. '인간의 두뇌'에 해당크게 연산장치, 제어장치, 레지스터 3가지로 구성됨연산 장치산술연산과 논리연산 수행 (따라서 산술논리연산장치
velog.io
https://arainablog.tistory.com/275
2. 운영체제
1. 운영체제 개념 및 발전 목적 1.1) 운영체제의 역할 컴퓨터 시스템은 사용자, SW, HW 3가지로 구성되어 있다. 여기서 운영체제의 역할은 다음과 같다. 다양한 응용프로그램(SW)이 HW 자원을 효율적
arainablog.tistory.com
https://thdbs523.tistory.com/110
[운영체제/OS] 운영체제 개요(의미/목적/구성 요소)
운영체제의 의미 - 일반적으로 응용 프로그램의 실행을 제어하고, 입출력 장치와 사용자 사이의 인터페이스 역할을 하는 프로그램 - 사용자 관점으로 컴퓨터 시스템을 보다 편리하게 사용할 수
thdbs523.tistory.com
'CS > 운영체제' 카테고리의 다른 글
[Chapter 3] 개념 이해를 위한 운영체제 [병행성 - 리눅스 병행성] (0) | 2025.02.25 |
---|---|
[Chapter 3] 개념 이해를 위한 운영체제 [병행성 - 프로세스 간 통신] (0) | 2025.02.25 |
[Chapter 3] 개념 이해를 위한 운영체제 [병행성 - 임계 영역] (0) | 2025.02.24 |
[Chapter 3] 개념 이해를 위한 운영체제 [병행성 - 개요] (0) | 2025.02.24 |
[Chapter 2] 개념 이해를 위한 운영체제 [프로세스] (0) | 2025.02.20 |