1. 컴퓨터, 어떻게 돌아가는걸까
2. 그럼 OS가 그 과정에서 담당하는 역할은?
3. 컴퓨터 하드웨어와 OS의 관계
- 프로세서, 메모리, 주변장치를 중심으로
00 도입
컴퓨터에 저장되어있는 영화를 볼 때 우리는 원하는 영화 파일을 마우스로 클릭하고 기다리면 화면에 비디오 플레이어가 뜨며 영상을 볼 수 있게 된다. 이 클릭을 통해 전달된 어떤 정보가 컴퓨터 내부에서 어떤 과정을 거쳐, 컴퓨터 어딘가에 저장되어있던 영화를 불러와 내가 보는 모니터에 띄워주는 과정을 거친 것이다. 컴퓨터에 대해 잘 몰라도 컴퓨터 안에 여러 물리적인 장치들이 있다는 것, 그리고 이 물리적인 장치들이 서로 통신을 하고 특정 작업을 한다는 건 알 수 있다.
이때 이 물리적인 장치를 하드웨어라 통칭하는데, 넓은 관점에서 이 하드웨어를 관리해 유저가 서비스를 제공받을 수 있게하는 것이 OS의 역할이다.
01 하드웨어
하드웨어의 종류는 정말 다양하지만, 컴퓨터는 프로세서, 메모리, 주변 장치로 크게 세 개의 하드웨어로 나눠볼 수 있다. 이 각각의 하드웨어는 무엇인지 간단히 정리하면 다음과 같다.
- 프로세서 : 계산과 연산을 담당하는 컴퓨터의 '뇌' (ex. CPU, GPU 등)
- 메모리 : 정보를 저장하고 있는 부분 (ex. DRAM, disk 등)
- 주변장치 : 프로세서와 메모리를 제외한 장치들 (ex. 마우스, 모니터, 키보드, 모뎀 등)
01-1 프로세서
프로세서는 연산과 제어작업을 주로 하며, 컴퓨터 장치의 동작을 제어하는 역할을 수행한다.
레지스터
레지스터는 메모리, 즉 저장 장치인데 프로세서의 내부에 있다는 점이 특징이다. 따라서 다른 메모리와 비교해 가장 속도가 빠르며 프로세서가 사용할 데이터를 저장하는 하드웨어다. 레지스터는 다음과 같이 세 가지 기준으로 분류해볼 수 있다.
- 용도 : 전용 / 범용
- 유저가 정보를 변경할 수 있는지의 여부 : 가시 / 불가시
가시 레지스터 : 데이터 레지스터, 주소 레지스터
불가시 레지스터 : 프로그램카운터(PC), 명령어 레지스터(IR), 누산기(ACC) 등
- PC : 다음에 실행할 코드의 주소를 가리키고 있는 곳
- IR : PC를 통해 가져온 명령어가 들어가는 곳
- ACC : 계산 과정에서 나온 값을 일시적으로 저장하는 곳
- 저장하는 정보의 종류 : 데이터 / 주소 / 상태
깊게 들어가지 않고 아주 간단히 정리하면, 이 프로세서에서 여러 레지스터들을 통해 연산이 이루어진다고 보면 된다. 이 프로세서가 어떤 일을 할지, 어떤 작업을 언제 어떻게 수행할 지 관리하는 것이 OS의 역할 중 하나다. 다시말해 프로세서가 처리할 작업을 할당하고 관리하며 프로세스의 생성 및 관리를 담당하고, 프로그램의 프로세서 사용 시간의 관리, 복수 프로그램 간 중재의 역할을 담당하는 것 또한 OS가 하는 일이다.
01-2 메모리
메모리는 쉽게 저장하는 장치, 기억 장치다. 크게 다음의 네 가지로 나누어 볼 수 있다.
- 레지스터 : (위에서 정리)
- 캐시 : 레지스터와 함께 CPU 내부에 있으나, 레지스터 보다 코어로부터 멀리 떨어져 있는 메모리
- 메인메모리 : 우리가 일반적으로 메모리라고 부르는 것. (ex. DRAM)
- 보조기억장치 : 하드디스크 같은 장치
앞서 레지스터는 프로세서 내부에 있기 때문에 아주 빠르다고 했는데, 아래로 내려올수록 속도는 느려지는 대신 큰 용량과 저렴한 가격대라고 이해하면 된다. 물론 성능이 제일 좋은 메모리만 쓰면 되지 왜 이렇게 여러 메모리로 구분지었느냐고 생각할 수 있는데, 사실 자원이 무한하다면 그럴수도 있겠다. 하지만 그렇지 않기 때문에 적절한 메모리를 조합해 성능을 최대화 한 결과가 이렇다고 생각하면 될 것 같다. 레지스터는 앞에서 살펴보았기 때문에 나머지만 아래에 정리해보았다.
(참고로 프로세서는 하드디스크까지 접근할 수 없기 때문에
하드디스크에서 메인메모리로, 특정 데이터는 메인 메모리에서 캐시에 정보를 담아둔 뒤
프로세서가 캐시나 메인메모리에 접근해 정보를 읽어오는 방식을 사용한다)
캐시(cache)
레지스터와 마찬가지로 CPU내부에 있고, 레지스터 보다는 코어에서 멀리 떨어져 있는 메모리다. 위 참고에서 언급한 것과 같이 캐시를 사용하는 이유는 정보를 불러올 때 발생할 수 있는 병목 현상, 퍼포먼스 갭을 줄이기 위해서다. 프로세서(CPU)는 매우 빠르지만, 메모리는 훨씬 느리기 때문에 둘 사이의 시간 갭을 줄이려고 좀 더 빠르게 접근할 수 있는 메모리를 사이에 삽입해두었다고 이해하면 된다. 캐시는 그 중에서도 메인메모리 입출력 병목을 해소하기 위한 메모리다. 일반적으로 캐시는 하드웨어가 자체적으로 관리하는데 데이터를 불러오는 과정은 다음과 같다
- 프로세서 " 나 AAA라는 데이터가 필요해. 캐시, 너 이 데이터 있니? "
- 캐시 " 없어 "
- 프로세서 " 그럼 메인메모리 가서 가져왕 "
- 캐시 " ( 메인 메모리에 가서 들고온 뒤 프로세서에 전달 ) "
( 나중에 다시 ) - 프로세서 " 캐시야 나 AAA 데이터 필요한데 갖고있니? "
- ( 만약 캐시가 갖고있다면 ) 캐시 " 있어! ( 전달 ) " = 캐시히트(cache hit)
- ( 만약 캐시가 갖고있지 않다면 ) 캐시 " 없어! ( 메인 메모리 가서 들고온 뒤 전달 ) " = 캐시미스(cache miss)
당연히 캐시히트가 좋고, 캐시미스는 한번 더 메모리에 접근해야 하는 일종의 손해보는 상황이다. 하지만 캐시는 매우 작은 크기의 메모리(ex. 128KB) 장치이기 때문에 많은 데이터를 저장할 수 없어 과연 병목 해소, 즉 캐시히트를 높이는 데에 도움이 될까 의심할 수 있지만, 우리는 일반적으로 데이터를 연속해서 불러올 때 서로 근처에 있는 데이터에 접근한다는 지역성의 개념으로 답할 수 있다.
지역성(Locality) : 우리가 작성하는 코드는 시간적 공간적 지역성을 지닌다.
- 공간적 로컬리티 : 한 번 참조한 주소는 그 다음에도 그 주소 근처를 참조할 가능성이 높다는 특성
- 시간적 로컬리티 : 특정 시점 t1 에 특정 주소를 참조했다면, t2에도 그 근처를 참조할 가능성이 높다는 특성
for문을 생각해보면 이해하기 쉽다. 2차원 배열에 접근할 때 우리는 n번째 원소의 0~m번째 원소를 쭉 순회한다. 캐시에 n번째 원소 덩어리를 저장*해놓으면, 0~m번째 원소 데이터를 불러올때 다시 메인메모리까지 가지 않고 캐시에서 읽어올 수 있다.
- *데이터 덩어리를 캐시에 저장한다? : 캐시는 A를 읽기 위해 A주변의 덩어리 데이터(캐시라인, 캐시블록)을 읽어옴
따라서 지역성에 따라 캐시의 적중률이 올라 병목 해소, 즉 캐시 히트 가능성이 높아지는 것이다.
주기억장치(Main memory)
주기억장치는 컴퓨터 메인보드에 꽂혀있는 메모리로 DRAM과 같은 하드웨어를 의미한다. 프로세서가 뭔가를 하려고 할때 그 '뭔가'에 필요한 프로그램과 데이터는 메인메모리에 반드시 있어야 한다. 그 이유는 앞서 잠시 언급한것처럼 프로세서가 디스크와 같이 (용량이 큰)보조기억장치까지 접근할 수 없고 주기억장치까지 접근할 수 있기 때문이다.
정리하면, 프로세서 (<=> (캐시)) <=> 주기억장치 <=> 보조기억장치 의 흐름으로 데이터를 불러오는 것이다. 물론 가운데 메모리 다 없애고 프로세서가 직접 보조기억장치로 접근하면 되지않냐! 라는 질문을 던질 수 있다. 중앙에 여러 메모리를 거쳐야 하는 이유는 사실 하드웨어 발전 속도의 차이 때문이다. 프로세서는 빠르게 발전했고, 디스크(보조기억장치)는 느리게 발전했다. 그래서 메모리가 너무 느리다보니 이 갭을 줄여줄 다른 메모리를 사이에 두게 된 것이다. 따라서 디스크보다는 적은 용량을 갖고있지만, 속도는 더 빠른 메모리를 두게 되었고 메인 메모리가 바로 프로세서가 접근할 수 있는 메모리 중 가장 용량이 크고 저렴한 메모리인 것이다.
즉, 디스크 입출력 병목을 해소하기 위한 목적이라 정리할 수 있다.
보조기억장치
하드디스크, CD, DVD, SD카드같은 장치로 데이터를 저장하는 메모리다. 보조기억장치는 용량이 크고 가격이 저렴한 편으로 보통 보조기억장치의 데이터에서 필요한 데이터를 메인메모리에 올려놓고 쓰게된다. 그런데 만약 실행하려는 프로그램 또는 데이터의 크기가 주기억장치(메인 메모리)보다 큰 경우도 있는데 왜 에러가 나지 않는 걸까? 그 이유는 보조기억장치의 일부를 메모리처럼 사용하는 가상메모리(Virtual memory) 덕분이다. 이 가상 메모리 덕분에 메인메모리보다 큰 데이터도 읽고 사용할 수 있다.
이 메모리도 OS가 관리하는 자원 중 하나라고 볼 수 있다. OS는 메모리에 무엇을 얼만큼 할당하고 회수할지 관리하는 역할을 한다.
01-3 주변장치
프로세서와 메모리를 제외한 나머지 하드웨어들을 주변 장치로 분류할 수 있는데 흔히 사용하는 입력장치(키보드, 마우스, 터치 인터페이스 등)와 출력장치(모니터, 프린터, 스피커 등), 저장에 사용되는 보조기억장치가 여기에 속한다. 이러한 주변 장치 하드웨어들을 잘 사용할 수 있게끔 주변장치 제작 벤더들이 드라이버를 제공하는데 OS는 이 장치 드라이버 또한 관리하는 역할을 한다. OS는 이 드라이버라는 인터페이스를 읽어 컴퓨터에서 이 하드웨어를 제어할 수 있게해준다. 예를 들어 키보드에 입력을 하면, OS가 시스템에 어떠한 입력이 들어왔음을 알려주는데 이것을 인터럽트(Interrupt)라고 한다.
02 참고 - 시스템 버스
컴퓨터 하드웨어를 사놓고 가만히 있으면 아무일도 생기지 않는다. 이 하드웨어들을 움직여 우리가 원하는 작업을 하게 하려면 서로 유기적으로 작동하게끔 통신해야한다. 이 통신을 하는 통로가 시스템 버스다. 마치 버스에 승객이 타고 목적지인 정류장에 내리는 것처럼, 시스템 버스에 탄 승객들(데이터,주소,제어신호)은 각각 데이터버스, 주소버스, 제어버스를 타고 목적지까지 도달해 작업을 수행하게 된다. (참고: 유튜브 무료 OS강의 31분부터 설명이 상세히 잘 되어있다)
** KOREATECH 무료 OS강의(클릭) 학습 후 나름대로 이해한 뒤 정리한 내용입니다. **
'CS > Operating System' 카테고리의 다른 글
[ OS 기초 ] 04. 프로세스 스케줄링 (0) | 2021.06.24 |
---|---|
[ OS 기초 ] 03. 스레드 관리 (0) | 2021.06.23 |
[ OS 기초 ] 02. 프로세스 관리 (0) | 2021.06.23 |
[ OS 기초 ] 01. OS개요(2) (0) | 2021.06.21 |
[ OS 기초 ] 01. OS개요 (0) | 2021.06.20 |
댓글