2020. 9. 29. 16:12ㆍ운영체제/Overview
1. 운영체제
운영체제는 하드웨어 자원과 시스템을 효율적으로 관리해서 사용자에게 서비스를 제공하는 시스템 소프트웨어다. 컴퓨터 장치가 들어있는 모든 기기에는 운영체제라는 시스템 소프트웨어가 탑재되어있다고 생각하면 된다. 최근에는 시계. 자동차, TV 등 컴퓨터가 탑재된 것들이 나오고 있고, 이에 맞는 운영체제들도 출시되고 있다. 출시보다는 범위가 확장된다는 표현이 맞는 것 같다.
아무튼, 우리는 운영체제가 하드웨어 자원을 관리한다는 것을 주목할 필요가 있다. 왜냐하면 이번 포스팅에서 이 부분을 전체적으로 간략히 다룰 것이기 때문이다. 그렇다면 운영체제가 관리하는 하드웨어는 무엇이 있을까?
운영체제는 크게 세 가지의 하드웨어를 관리한다.
- 프로세서
- 메모리
- 주변장치
프로세서는 우리가 흔히 알고있는 CPU, GPU다. 이는 컴퓨터의 뇌에 해당되며, 기능은 무언가를 계산하는 녀석이라고 생각하면 된다. 메모리는 말 그대로 무언가를 기억하고 저장하는 녀석이라고 생각하면 된다. 컴퓨터는 인간이 아니라 기억을 할 순 없으니, 저장한다고 생각하는게 더 편할 것이다. 주변장치는 처리받은 명령어와 데이터를 주고 받고 실행하는 장치라고 생각하면 된다. 주변 장치에는 우리가 흔히 쓰는 마우스, 키보드를 생각하면 된다.
그렇다면, 각 하드웨어 내부에는 어떤 것들이 있을까?
2. 프로세서
프로세서는 연산장치(ALU), 레지스터, 제어장치(Control Unit)으로 구성되어 있다.
연산장치(ALU)는 제어장치의 명령어를 받아서 이에따라 산술, 논리 연산등을 수행한다. 제어 장치는 명령어를 데이터 이동, 컴퓨터의 흐름을 명령어라는 것을 이용하여 제어한다. 전쟁에서 지휘관의 역할을 수행한다고 보면 될 것 같다. 레지스터는 프로세서에 있는 내부 메모리다. 이 메모리의 특징은 가장 작은 용량을 가지고 있으면서도 가장 빠른 속도를 가지고 있다는 것이다.
레지스터는 용도에 따라, 특정 상황에 따라 다음과 같이 분류 될 수 있다.
- 용도에 따른 분류: 전용 레지스터,. 범용 레지스터
- 사용자의 정보 변경 가능 여부에 따른 분류: 사용자 가시 레지스터, 사용자 불 가시 레지스터
- 저장하는 데이터 종류에 따른 분류: 데이터 레지스터, 주소 레지스터, 상태 레지스터
범용 레지스터는 메모리에서 받은 일반 데이터, 계산 결과 값을 임시로 저장하는 메모리를 말한다. 전용 레지스터는 명렁어 수행에 필요한 특수 데이터를 저장하는 메모리를 말한다.
데이터 레지스터(가시 레지스터)는 연산을 하기전에 메모리부터 읽은 데이터, 연산 중간 값을 저장하는 역할을 한다. 여기서 연산 중간값은 누산기(Accumulator)라는 곳에서 임시로 저장한다. 누산기는 불 가시 레지스터다. 예를 들어 1+1이 무엇이냐고 물어봤을 때, 결과 값이 2가 나오더라도 이 값을 기억해내지 못한다면 출력할 수가 없다. 따라서 우리는 누산기를 이용하여 2라는 값을 임시로 저장한 후 출력을 하거나, 연속된 계산이 있으면 여기서 2라는 값을 꺼내서 쓰면 된다.
주소 레지스터(가시 레지스터)는 주소를 저장해서 메모리 접근에 사용되는 레지스터이다. 주소 레지스터에는 기준 주소 레지스터, 인덱스 레지스터, 스택 포인터 레지스터가 존재한다. 기준 주소 레지스터는 프로그램을 실행할 때 사용하는 기준 주소 값을 사용한다. 기준 주소는 관련정보를 저장하거나 연속공간을 지정할 때 참조하는 주소이며, 이 레지스터는 페이지나 세그먼트와 같은 블록화된 정보에 접근하는데 사용한다.
인덱스 레지스터는 유효 주소를 계산하는데 필요한 정보를 저장한다. 마지막으로 스택 포인터 레지스터는 메모리에 프로세서 스택을 구현하는데 사용하며, 많은 프로세서와 주소 레지스터를 데이터 스택 포인터와 큐 포인터를 사용한다. 보통 반환 주소, 프로세서 상태 정보, 서브루틴의 임시 변수를 저장한다.
프로그램 카운터(불 가시 레지스터)는 다음에 실행할 명령어의 주소를 보관하는 레지스터다. 계수기로 되어있어 실행할 명령어를 메모리에서 읽으면 명령어의 길이만큼 증가하여 다음 명령어를 가리키며, 분기 명령어는 목적 주소로 갱신할 수 있다. 명령어 레지스터는 현재 실행하는 명령어를 보관하는 레지스터다.
3. 메모리
메모리는 [그림2]와 같이 네 개의 계층으로 나눌 수 있다.
위로 갈수록 속도와 가격이 올라가고, 아래로 갈 수록 용량과 가격이 낮아진다.
1. 메인 메모리(주 기억장치)
메인메모리는 프로세서가 수행할 프로그램과 데이터를 저장하는 역할을 한다. 메인 메모리는 보조 기억장치(HDD)와 프로세서(CPU)의 속도 차를 줄여주기 위해 이들 중간에 껴서 프로세서가 일할 동안, 다음 일거리를 보조기억장치로부터 받아 보관하는 역할을 수행한다.
2. 캐시
메인 메모리가 중간에 꼈음에도 불구하고 또 다른 문제가 생겼다. 그것은 메인 메모리와 프로세서 사이에도 속도가 여전히 크다는 것이었다. 따라서 이 둘의 속도차를 보완하기 위해 캐시라는 메모리를 도입했다. 캐시는 히트와 미스 두 가지 상태를 가진다. 캐시 히트는 필요한 데이터가 캐시 메모리에 있는 상태를 말하고, 캐시 미스는 필요한 데이터가 캐시 메모리에 없는 상태를 말한다. 그런데 캐시 용량은 128KB 정도로 굉장히 작은데 어떻게 메모리 역할을 할 수 있을까? 그 역할을 수행할 수 있는 이유는 캐시의 지역성이 있기 때문이다.
캐시는 공간적 지역성, 시간적 지역성을 가진다. 공간적 지역성은 A지역을 참조했을 경우, 주변지역(초록색영역)도 참조할 가능성이 높다고 판단하는 것이다. 따라서 캐시는 캐시미스 상태가 되었을 경우, 데이터를 보조기억장치에서 찾는다. 요청 데이터가 보조기억장치에 있을 경우 데이터 하나만을 가져오는 것이 아니라, 공간적 지역성에 의거하여 [그림 3]의 모양으로 데이터 번들러를 가져온다.
하지만, 시간적 지역성은 번들러 형태가 아닌 라인 형태의 데이터를 가져온다. for문을 예로 들 수 있는데,
for(let i=0; i<16; i++){
...
}
반복문의 경우 우리가 설정한 숫자(시간)의 순서로 순환하는 문법이다. 캐시의 시간적 지역성도 이와 같다. 0초를 참조하면 16초까지의 데이터를 한번에 가져오기 때문에 2초, 15초에 있는 데이터를 찾더라도 캐시의 상태는 히트를 유지하게 된다. 그러나 17초의 데이터를 요청받게 되면 캐시의 상태는 미스가 되며, 보조 기억장치에서 가져올때는 17초에서 33초까지의 해당되는 라인형데이터를 가져와서 캐시에 저장하는 과정을 반복한다.