운영체제

운영체제 소개

소재훈 2021. 9. 12. 04:36

운영체제를 알아보기 전에 컴퓨터가 어떻게 생겼는가, 그 중에서도 폰노이만 아키텍쳐를 알아보자

폰노이만 아키텍쳐는 CPU와 메모리로 구성되어 있고, 그 외의 입출력장치들이 있고 이것들이 버스라는 데이터 통로로 연결되어있는 것이다.

CPU의 구성요소에는

1. decoder: instruction(기계어 명령문)을 해독하는 장치(Control Unit 이라고 하기도 한다.)

2. ALU(Arthismetic Load Unit): 온갖 종류의 연산을 처리해주는 장치

3. Register: CPU안의 메모리 레지스터는 크게 둘로 나눌 수 있다.

    1) 시스템에서 사용하는 레지스터 (PC, IR)

    2) 사용자 프로그램에서 사용하는 레지스터

 

프로그램이 실행되기 위해서는 프로그램을 짠 후에 컴파일을 거쳐서 기계어를 생성하는데, 기계어(instruction set)는 CPU마다 자기 나름의 instruction set을 가지고 있지만, 크게 보면 네 그룹의 instruction을 이야기 할 수 있다.

1. Load

2. Store

3. 연산

4. Jump: PC값을 변경해 프로그램의 흐름을 바꾸어 준다. 일반 프로그램에서는 제어문(반복문, 분기문)이 흐름을 바꾸어 준다.

 

"a = b + c 라는 배정문(Assignment Statement)는 기계어로 바뀌면 어떻게 되는가??" 를 "b라는 변수가 가지고 있는 값과 c라는 변수가 가지고 있는 값을 더해서 a라는 변수에 넣어라" 라는 의미 인것을 해석하기 위해서 컴파일러라는 것은 일종의 번역기(translator)역할을 한다.

이러한 과정이 CPU에서 일어나고 그러기 위해서는 메모리에서 object code가 Fetch(읽어 들이는 것)해서 처리하고 그 다음에 명령어를 처리하게 된다.

 

프로그램에서 사용하는 변수에 대한 공간이 메모리에 할당되어야 하는데, 운영체제가 그것을 두 그룹 으로 나누어서 관리한다.

1. static 하게 할당되는 영역: 프로그램 시작부터 끝까지 할당되고 위치가 변경되지 않음.
2. dynamic하게 할당되는 영역: 필요할 때 만들었다가 사용하고 나면 없어지는 영역

 

dynamic하게 할당되는 대표적인 것들이 지역변수이고, static하게 할당되는 것이 전역변수이다. 그래서 static한 영역을 Data영역이라고 하고, dynamic한 영역을 Stack&Heap 영역이라고 한다.

Stack에는 activation record, Heap에는 동적 자료구조가 할당 된다.

 

 

 

 

 

 

 

 

 

 

Fetch와 Decode/Execution: 메모리의 Code영역에서 하나씩 Fetch해서 그것을 Decoding해서 Execution하고 그것이 계속 처리되는 것 하나하나를 Instruction Cycle이라고 한다.

여기서 이제 Interrupt가 발생했는지의 여부를 따진다.

1. No: Fetch로 돌아가고 자동적으로 PC가 그 다음을 가리키게 된다.

2. Yes: Control이 OS로 넘어온다. 운영체제로 넘어와서 해당되는 인터럽트 핸들러를 수행한 후에 다시 사용자 프로그램으로 돌아간다.

이런식으로 컴퓨터에서의 기본적인 동작이 수행된다.

 

OS에서는 또한 사용자 프로그램이 잘 실행 될 수 있게끔 컴퓨팅 리소스를 관리한다. 이때 컴퓨팅 리소스란 CPU, 메모리, 입출력장치 등 프로그램이 실행될 때 필요한 리소스들을 말한다. 따라서 운영체제를 간단히 말해서 Resource Allocator 라고 할 수 있다.


Interrupt

Interrupt는 크게 3종류의 Interrupt를 생각할 수 있다.

1. 하드웨어, 입출력 장치 인터럽트
2. Exception, 예외
3. System Call

Intel processor event-vector table

위의 표를 보면 Interrupt 번호 중 0 ~ 31 번은 Exception(예외)에 할당되어 있다. 이중 몇개는 소프트웨어 문제로 발생하는 예외이고, 대표적으로는 device error가 있다.

32번 부터 255번 까지 할당된 예외를 maskable Interrupt라고 한다.


Storage Device Hieracy

register는 CPU안에 있는 메모리이고, CPU와 main memory사이의 cache는 Fetch를 빨리하기 위해서 사용한다. 이후에 더 자세히 알아보자.

 

 

 

 

 

 

 

 

 

 


User mode 와 Kernel mode

왼쪽의 그림에서 처럼 사용자 프로그램(일반 프로그램)이 실행될 때를 user mode 라고 하고, OS로 권한이 넘어와서 실행될 때를 kernel mode라고 한다. kernel mode는 권한이 user mode 보다 높고 사용자 레벨에서 할 수 없던 것을 할 수 있게 된다.

 

 

 

 

사용자 프로그램에서 System Call을 하면 운영체제에서 사용자를 위해서 작업을 처리해준다.

kernel mode를 supervised mode, system mode, previleged mode 라고 하기도 한다. UNIX계열에서는 모드의 previleged level 을 둘 때 사용자 프로그램에서 3이고, kernel mode 일때는 0이다. 모드를 지정하는데 두 비트를 사용하기 때문에, 00, 01, 10, 11의 4개의 레벨을 만들어 사용할 수 있는데, UNIX에서는 전통적으로 00과 11두개만 사용하고 있다. 숫자가 작을수록 권한이 더 높다.


Timer

말 그대로 "시계"의 역할을 하며 일반 사용자와 직접 관련되는 시계는 크게 3종류가 있다.

1. CPU의 HZ: CPU성능을 이야기 할때 말하는 것으로 CPU의 클럭에 따라서 하드웨어 로직이 움직인다.
2. 일반 시계: 우리의 일상생활 속의 시계와 동일하다.
3. Timer Interrupt: 운영체제에서 사용하는 시계로, 이 시계가 주기적으로 Interrupt를 걸어준다. Timer Interrupt가 하나 걸리는 것을 "Tick"이라고 한다. 이 Tick이 운영체제에서 사용하는 시간 단위가 된다.
ex) Timer Interrupt가 1ms마다 걸린다면 interrupt가 1000번 걸리면 1초이므로 1000Tick = 1sec가 된다.

Resource Mangement

운영체제는 리소스 매니저다. 리소스는 CP, 메모리, 입출력장치, 파일등을 관리하고 프로세스(사용자)에게 할당해서 작업이 실행될 수 있게끔 해준다.

Program Counter(PC): 다음에 실행될 instruction의 주소를 가리키고 있다. 그 주소의 메모리 번지로부터 Fetch를 해오게 된다.


Cache Management

cache 메모리를 사용하는 목적은 instruction을 매번 메모리에서 Fetch해오게 되면 그 속도가 80~250ms 이므로 보다 접근 속도가 빠른 cache메모리를 사용하는 것이다. 그리고 메모리의 내용 일부를 cache메모리에 가져다 놓고, CPU에서 항상 cache에 접근하도록 하자. 두가지 경우가 있을 수 있다.

1. CPU에서 PC가 가리키는 번지로 캐시에 접근 했는데 원하는 내용이 캐시 메모리에 있었다.(Cache Hit!)
2. 캐시에 원하는 내용이 없으면 필요한 내용을 메인 메모리에서 캐시에 가져다 놓고 캐시에 접근해야 한다.(Cache miss!)

Cache Hit가 되면 바로 처리될 수 있지만 Cache Miss가 일어나게 되면 메모리에서 가져다 써야한다. 따라서 전체적인 속도를 올리기 위해서는 Hit Ratio를 올려야 한다. Hit의 비율이 높아질수록 전체적으로 보았을 때 속도가 빨라진다. 그리고 얼마나 빨라지는지를 알기 위해서는 기대치(expectation value) 계산을 해야한다.