본문 바로가기

프로그래밍/운영체제

운영체제(1) - 시스템은 어떻게 작동하는가(Multicore system, Interrupt)

운영체제 왜 공부하지?

운영체제란 무엇인가?

 

 

 

 

우리는 우리의 문제를 더욱 쉽게 해결하기 위해 프로그램을 사용한다.

이러한 목적을 위해 하드웨어가 제작되고, 하드웨어만으로는 사용이 어렵기 때문에 응용 프로그램이 개발되었다.

여기에 자원을 제어하고 할당하는 기능을 하나의 소프트웨어로 통합한 것이 운영체제 (operating system) 이다.

 

 

라고 정의되어 있지만 우리가 평소에 이미지하고 있는 것과 크게 다르지 않을 것이다.

운영체제를 더욱 일반적으로 정의하자면 컴퓨터에서 항상 실행되는 하나의 프로그램으로 일반적으로 커널(kernel) 이라 불린다.

 

 

운영체제를 깊게 알아보기 전에 컴퓨터 시스템 구조에 대해 한번 짚고 가보자.

우리는 크게 입출력 구조, CPU, memory 로 나눌수 있다.

 

Memory 를 먼저 알아보고

CPU가 많은 역할을 하고 제일 중요한 요소이므로 시스템 구조와 이를 자세히 알아보자.

 

 

 


저장장치 구조

CPU 는 명령어를 메모리에서만 가져온다 . 이를 위해 프로그램이 반드시 메모리에 있어야 한다. 컴퓨터는 프로그램을 대부분 메인 메모리-RAM(재기록 가능 메모리) 에서 가져온다.

간단하게 생각하면 우리가 노트북을 살 때 RAM 의 성능이 좋아야 컴퓨터가 빠르게 과부화 없이 돌아간다는 것이다.

메인 메모리는 거의 휘발성 메모리이다. 필요한 모든 프로그램, 데이터를 영구히 저장하기에는 용량이 너무 작기 때문이다.

 

그래서 우리는 보조 저장 장치가 필요하다 

예를 들어 하드 디스크 드라이브를 생각해보자. 이들은 휘발성인 메인 메모리를 대신해 대량의 데이터를 영구히 보존하게 한다.

 

 

 


CPU

processor 라고도 한다.

 

단일 처리기 시스템

범용 명령어 집합을 실행할 수 있는 하나의 CPU를 가지고 있다.

그러나 특수 목적 프로세서도 있을 수 있다

장치의 작업에 특화된 프로세서로서의 장치 ( GPU,TPU...)

 

멀티코어 시스템(병렬 시스템)

간단히 말해 하나의 CPU에 여러개의 Core 가 있는것이다.

 

 

멀티코어 시스템은 밀접한 통신을 하는 둘 이상의 처리기들을 가진다.

1. 증가된 처리량( throughput)

 

2. 규모의 경제 

 

3. 증가된 신뢰성

만약 한 처리기가 고장나더라도 시스템이 정지하지 않고, 단지 속도만 느려진다. 10개의 처리기 중 하나가 고장나더라도 나머지 처리기가 고장 난 처리기가 해야 할 작업을 수행 가능하다.

이러한 능력을 graceful degradation or fault tolerant 

 

 

 

다중 처리기 시스템은 두가지 형태를 가진다.

 

비대칭적 다중처리 (asymmetric multiprocessing) 

각 처리기에 특정 태스크가 할당.

하나의 주처리기가 시스템을 제어한다. 다른 처리기들은 주 처리기의 명령을 실행하거나 미리 지정된 태스크(업무)를 실행한다.

이러한 기법은 주종 관계를 정의한다. 주 처리기는 작업을 스케쥴하고 종속 처리기에 작업을 할당한다. 

 

대칭적 다중처리(sysmmetirc multiprocessing)

모든 처리기가 대등하다는 것을 의미

가장 일반적인 시스템은 각 처리가 운영체제 기능과 사용자 프로세스를 포함한 모든작업을 처리할 수 있는 대칭적 다중처리를 사용한다.

이 모델의 장점은 중대한 성능 저하를 일으키지 않고 많은 프로세스들이 동시에 실행할 수 있다는 것이다.

그 전에 있었던 비효율은 처리기들이 특정 자료구조를 공유할 경우 피할 수 있고, 이러한 형태는 다수의 처리기 간에 프로세스와 

메모리가 동적으로 공유될 수 있게 하여 처리기 간의 불균형을 줄일 수 있다.

따라서 주종 관계가 없다.

 

 

여기서 헷갈리고 중요한 한가지!

 

다중처리기 시스템은 멀티코어가 아닐수있다.

멀티코어는 하나의 칩 내에 여러개의 코어를 가지는것이고

다중 처리기는 단지 여러개의 처리기를 가지고 있는 형태이니 주의하자!

 


 

 

시스템 구조

 

하나 이상의 cpu 와 다수의 장치 제어들로 구성 이들은 공용 버스로 연결된다.

이러한 구성요소는 버스를 통하여 공유 메모리에 접근 할 수 있다.

 

 

 


Interrupt

 

시스템은 event 가 발생하기를 기다리는데 event의 발생 여부를 interrupt에 의해 전달 받는다.

 

 

시스템은 어떻게 우리의 의사를 전달 받을까?

 

하드웨어는 언제든지 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킨다. 

키보드나 마우스 등 우리가 자주 사용하는 하드웨어 모두 이 경우이다.

 

 

 

소프트웨어는  system call이라 불리는 연산을 통해 인터럽트를 발생시킨다.

 

만약 CPU 가 인터럽트 되면, 하던 일을 중단하고 즉시 지정된 위치로 실행 위치를 옮긴다.

이 위치는 언터럽트를 처리하기로 되어 있는 루틴의 시작 주소가 기록 되어있다.

따라서 이 루틴을 실행하고 종료되면 CPU는 인터럽트 되었던 연산을 재개한다.

인터럽트 과정

 

인터럽트는 매우 중요하기 때문에 우리는 이 루틴이 적절한지 알아야한다.

이를 위해 우리는 총괄 루틴을 호출하여 인터럽트에 관한 정보를 조사한다.

총괄 루틴은 이어 인터럽트 고유의 핸들러를 호출한다. 이는 효율적이지 못하다

 

 

인터럽트는 매우 빠르게 처리되어야 한다.

이러한 방식 대신 사용 가능한 인터럽트의 개수가 미리 정해져 있기 때문에 대신 인터럽트 핸들러의 주소를 저장한 테이블을 이용하여

원하는 처리 속도를 제공할 수 있다.

이 경우 중간 루틴을 거칠 필요 없이 이 테이블을 통하여 간접적으로 인터럽트 루틴이 호출될 수 있다.

그래서 인터럽트가 요청되면 이 주소의 배열, 인터럽트 서비스 루틴의 주소를 얻을 수 있다.

 

 

Interrupt  이후

인터럽트에 의해 중단된 명령의 주소는 반드시 저장되어야 한다.

 

고정된 위치에 주소를 저장하였는데, 최근은 시스템 스택에 복귀 주소를 저장한다.

복귀전에 상태를 복구하여 인터럽트에 의해 중단 되었던 연산이 인터럽트가 발생되지 않았던 것처럼 다시 시작된다.