OS 개념, 구성, 작동..

2년 전에 정보처리기사 준비하면서 정리했던 글인데 적다말아서 올릴까말까 하다가 포스팅 합니다. ㅋ

-----------------------------------------------

정보처리기사를 준비하면서 그동안 까먹고 있었던 운영체제를 다시 공부하게 되었다. Study for Teaching이라는 말이 있지 않던가..? Study for Teaching이라는 단어가 맞나, 아무튼 가르치기 위해서 공부를 한다고 하듯이 블로그에 글을 올리면서 동기부여를 받으려고 한다. 너무 오랜만에 시스템쪽을 공부하여 부족한 점이 있겠지만 이 글이 누군가에게 도움이 됐으면 한다.

운영체제 (Operating System)

Introduction to Operating System

목적
- 컴퓨터 시스템의 기초적인 구조/구성을 묘사할 수 있다.
- OS에서의 주요 구성 요소들에 대해 설명할 수 있다.
- 컴퓨터의 환경에 대한 많은 종류들에 대해 설명할 수 있다.
- Open-Source OS에 대해 다뤄볼 수 있다.


Operating System은 무엇일까?

많은 이들이 운영체제라고 하면 Windows, iOS, Android, Linux 등에 대한 예시를 들 수 있지만 정확히 무엇을 하는 것인지는 잘 알지 못한다. 운영체제에 대해 정확히 알기 위해서는 컴퓨터의 하드웨어와 소프트웨어에 대해 이해하는 것이 필요하다.

먼저, 컴퓨터라는 것은 간단히 말해 기계 장치이다. 우리가 흔히 알고 있는 CPU 장치, 모니터 장치, 메모리 장치들이 복합적으로 구성된 기계 장치이다. 이 기계라는 개념은 실체하는 개념으로 이러한 부품들을 우리는 하드웨어라고 일컫는다.

소프트웨어는 반면 가상적인 개념이라고도 할 수 있다. 실제 세계에서 눈으로 보이는 실체가 아니라는 것이다. 소프트웨어라는 것은 유저의 필요에 맞게 컴퓨터를 사용하는 가상 장치와 같은 것이다. 우리는 소프트웨어라 부른다.

문제는 이러한 하드웨어를 통해 소프트웨어를 우리가 어떻게 만들 것이냐는 것이다. 1과 0으로 구성된 이 장치를 우리가 어떻게 편하게 이용할 수 있을까. 해답은 운영체제이다.

운영체제라는 것은 간단히 말해 컴퓨터를 사용하는 유저가 컴퓨터 하드웨어를 사용할 수 있게끔 해주는 중간 다리 역할을 하는 프로그램이다. 우리가 직접 컴퓨터의 1과 0을 바꾸어가며 컴퓨터를 사용한다는 것은 불가능에 가깝다. 이 컴퓨터 하드웨어를 기본적으로 유저가 쉽게 사용할 수 있게끔 해주는 것이 운영체제라 보면 되겠다.

즉 운영체제의 목적에는 3가지가 있다.
1) 유저의 프로그램을 실행하고 유저의 문제를 보다 쉽게 해결해주기 위해.
2) 컴퓨터 시스템을 사용하기 편리하게 만들기 위해.
3) 효과적인 방향으로 컴퓨터 하드웨어를 사용하기 위해.

컴퓨터 시스템 구조

컴퓨터 시스템의 구조는 보통 4가지의 구성요소로 파악할 수 있다.

1) 하드웨어 - 컴퓨팅 자원을 기본적으로 제공해준다. (CPU, memory, I/O devices)
2) 운영체제 (Operating System) - 다양한 어플리케이션과 유저들 사이에서 하드웨어를 제어해주고 융합하는 역할을 맡는다.
3) 응용 프로그램 (Application Program) - 우리가 흔히 말하는 그 소프트웨어. 워드 프로세서, 컴파일러, 웹 브라우져, DB 시스템, 비디오 게임과 같은 프로그램들을 말한다.
4) 사용자 (User) - 컴퓨터를 이용하는 자. (사람, 기계, 다른 컴퓨터가 될 수도 있다.)



그림 보면 쉽게 이해할 수 있다.

그러면 운영체제가 무엇을 할까?
다음과 같은 예시를 살펴보도록 하자.

1) 사용자는 편리하고, 그리고 쉽게 좋은 효율성으로 컴퓨터를 사용하고 싶다.
--> 컴퓨팅 자원 관리를 그러면 누군가 자동적으로 해줘야겠네?
2) mainframe이나 minicomputer같이 공유된 컴퓨터에서 모든 사용자들이 행복하게 컴퓨터를 사용하고 싶다.
--> 모든 사용자들의 명령들을 한 컴퓨터에서 어떻게 처리해줘야하지?
3) workstation과 같은 전용 시스템에서는 보통 전용 자원을 사용하지만 서버로부터 자원을 사용하기도 한다.
--> 전용 자원을 사용안하고 다른 자원을 가져오면 그 관리는 어떻게 하지?
4) 모바일 폰은 자원은 작지만 사용성과 배터리에 최적화되어 있다.
--> 사용성과 배터리 라이프에 어떻게 최적화하여 구성해야 할까?

운영체제의 정의

1) OS는 자원 할당
Computing 자원들을 관리해주는 고마운 친구이다. 자원 사용을 효과적이고 공정하게 하기 위해 자원 요구들을 알고리즘적으로 처리한다. 이걸 못한다면 우리가 소프트웨어를 짤 때 컴퓨터 자원을 어떻게 할당하여 넣을지 다 고려해서 넣어야 할 것이다.

2) OS는 제어 프로그램
컴퓨터를 사용하면서 발생할 수 있는 에러들을 예방하기 위해 프로그램의 실행을 제어한다.
이게 없으면 나누기 0 이런거 어떻게 처리할 것인가..

물론 통상적인 정의는 아니다.

운영체제란 운영체제 업체가 우리에게 제공하는 것 중에 하나라고 정의하는 게 오히려 더 가까울 수도... ㅋ.ㅋ...

컴퓨터의 Startup
컴퓨터는 어떻게 시작할까?

컴퓨터의 전원을 키거나 리부트하면 bootstrap program이 적재된다.
대표적으로 ROM이나 EPROM에 저장되어 있으며 firmware라고 잘 알려져 있다.
이는 시스템을 어떻게 초기화할지에 대해 결정한다. OS kernel을 적재하고 실행을 시작하는 역할을 한다. 기본적으로 kernel이라는 것이 앞에서 언급한 OS의 기능들을 한다. 컴퓨팅 자원을 관리하고 프로그램을 제어하고.. 적재한다는 것은 Computermemory에 불러온다고 생각하면 될 듯하다.

컴퓨터 시스템의 구성

컴퓨터 시스템의 구성을 살펴보도록 하자.
한 개 이상의 CPU디바이스 컨트롤러에서 공유된 메모리에 접근하도록 하는 공용 버스들을 통해 연결된다.
CPU나 디바이스의 병렬적인 실행은 메모리의 주기에 들어가기 위해 경쟁하는 구조가 된다.
즉 CPU나 디바이스에서 주어진 명령을 해결하기 위해서는 메모리에 적재되어야 하는데 병렬적으로 이러한 명령들이 많아지면 서로 경쟁한다는 뜻이다.


컴퓨터 시스템의 작동

1) I/O 디바이스와 CPU는 병렬적으로 실행할 수 있다.
2) 각 디바이스의 컨트롤러는 특정 장치의 유형을 담당하고 있다.
3) 각 디바이스에는 local buffer를 가지고 있다. (데이터를 임시적으로 저장하는 공간)
4) CPU는 data를 local buffer들간, main memory들간 움직여주는 역할을 담당한다.
5) I/O는 디바이스에서 컨트롤러의 local bueffer로의 이동을 이미한다.
6) 디바이스 컨트롤러는 CPU에 interrupt가 일어날 때 작동을 종료하라는 것을 알려주는 역할을 한다.

여기서 잠깐 인터럽트라는 것이 무엇일까?

CPU는 장치들의 요구들을 처리해주는 역할을 한다. 그런데 이러한 요구들을 어떻게 처리해줄까?

먼저, CPU가 주기적으로 각 장치들한테 "너 뭐 할 것 있음? 내가 도와드림?"이라고 먼저 선빵치는 경우가 있다. 이 경우를 Polling이라고 한다.
반대로, 각 장치가 먼저 "이것 좀 해주세요 ㅠㅠ"하고 부탁하는 경우가 있다. 이 경우를 Interrupt라고 한다.

폴링기법은 I/O가 아주 빈번하게 상태가 변해 상태 감지를 많이 해야할 경우 적합하고,
인터럽트는 빈번하지 않은 I/O에 적합했다. 하지만 I/O 장치의 응답 속도는 매우 느려 폴링 방법을 배제하는 것이 CPU의 효율을 높이는 것이었기도 했다고 한다...



Interrupt의 공용된 기능

- 인터럽트는 Interrupt Service Routine으로 제어를 변환하는 역할을 한다. 보통 interrupt vector를 통해 거치며, 모든 service routine들의 주소들을 포함하고 있다.
- 인터럽트 아키텍처는 인터럽트 Instruction의 주소들을 무조건 가지고 있어야한다.
- trap이나 exception은 오류나 유저의 요규에 의해 발생되는 software로 생성된 interrupt를 말한다.
- OS는 보통 interrupt에 의해 기반한다.

즉 간단하게 말하면, 마이크로프로세서가 Interrupt를 감지하면, 실행중인 Machine Code를 중단한다.
그리고 해당 인터럽트를 위한 처리 프로그램으로 점프하여 해당 일을 수행한다.
이 때, 인터럽트 처리를 위한 루틴을 Interrupt Service Routine이라고 부른다. 이러한 루틴은 일반적으로 Interrupt Vector에 의해 결정된다. 이는 Service Routine의 주소를 포함하는 vector를 말하며, 주로 하드웨어적으로 CPU Core에 입력되어 현재 진행중인 기계어 코드가 종료되면 실행된다.



댓글

가장 많이 본 글