본문 바로가기
CS/BOOK

[한 권으로 읽는 컴퓨터 구조와 프로그래밍] 5. 컴퓨터 아키텍처

by 벨롭 2024. 3. 21.

 

컴퓨터 아키텍처

 

 

컴퓨터 아키텍처란 컴퓨터의 여러 구성요소를 배치하는 방법을 뜻한다. 가장 흔한 컴퓨터 아키텍처로는 폰노이만 구조와 하버드 구조가 있다.

 

 

이전에는 미리 정한 기능만을 수행하는 하드웨어를 만들어서 사용했기 때문에 다른 프로그램을 수행하기 위해서는 하드웨어 자체를 변경해야했다. 하지만 메모리 상에 프로그램의 명령어와 데이터를 올리고 CPU에서 연산을 처리하는 폰노이만 구조는 소프트웨어만 변경하더라도 다른 프로그램들의 실행이 가능하도록 만들었다. 하버드구조는 이와 비슷하지만 메모리 상에서 명령어와 데이터 영역을 구분하여 사용한다.

 

 

 

 

 

 

 

시간이 흐르면서, 컴퓨터의 성능을 개선하기 위해 여러 CPU를 사용하는 멀티 프로세서 시스템이 등장했다. 그리고 이후에는 한 발 더 나아가, 하나의 프로세서에 핵심 기능을 수행하는 코어를 여럿 담은 멀티 코어 CPU가 일반화 되었다. 이로 인해 컴퓨터는 동시에 여러 프로그램을 실행할 수 있게 되었다. 

 

 

 

 

 

 

 

운영체제

 

 

여러 프로그램을 동시에 실행하기 위해서는 일종의 관리자 프로그램이 필요하다. 바로 OS다. 관리자 프로그램은 무엇을 관리할까? 대표적으로는 컴퓨터 하드웨어 자원을 각 프로그램이 고르게 사용할 수 있도록 분배한다.

 

 

 

 

폰노이만 구조에 의해 프로그램이 실행되기 위해서는 메모리 상에 명령어와 데이터가 올라가 있어야 한다. 그런데 16GB짜리 메모리에, 10GB짜리 프로그램을 올려버리면 다른 프로그램을 위해서는 공간이 조금밖에 남지 않는다.

 

 

이를 위해 운영체제는 가상 메모리 형태로 메모리를 관리한다. 전체 프로그램을 메모리에 실어두는 것이 아니라, 일부만을 메모리에 올려두는 것이다. 그리고 메모리에 올라와있지 않은 페이지가 필요하면 필요하지 않은 페이지를 메모리에서 내리고 (스왑 아웃) 요청 받은 페이지를 메모리에 올린다. (스왑 인)

 

페이징을 통해 메모리를 관리하므로 프로그램에서는 연속적인 내용이더라도 메모리 상에는 연속적인 주소를 가지고 있지 않을 수 있다. 그렇기 때문에 CPU는 논리적인 주소인 가상 주소를 요청하고, 메모리 관리 장치인 MMU가 가상 주소를 물리 주소로 변환하는 역할을 맡는다. 만약 물리 주소에 해당 페이지가 없다면(보다 하드웨어 적인 표현으로는 한계 레지스터의 범위를 벗어난다면) 페이지 폴트 인터럽트를 발생시켜 스왑아웃-스왑인이 일어나도록 하는 것이다.

 

 

 

 

이처럼 하드웨어 자원에 접근하고 조정하는 기능은 운영체제의 핵심이다. 하드웨어 자원을 보호하기 위해 운영체제는 자신만이 이 작업을 수행할 수 있도록 한다. 프로그램이 하드웨어 자원에 접근하려면 운영체제에게 시스템콜을 보내 사용자모드에서 시스템 모드로 전환시키고, 운영체제가 대신 작업을 수행하는 방식이다.

 

 

2023.10.12 - [CS/운영체제] - [운영체제] 커널과 시스템 콜, API의 관계

 

[운영체제] 커널과 시스템 콜, API의 관계

운영체제를 공부하다보면, 운영체제의 구조와 각각의 역할은 알겠는데 그래서 어떻게 유기적으로 작동하는지 헷갈리기가 쉽다. 최대한 쉽게 설명하기 위해 핵심적인 관계만 설명하고자 한다.

kyeong8139.tistory.com

 

 

 

 

 

 

페이지 폴트든, 시스템 콜이든 CPU 입장에서는 현재 실행중인 프로그램을 잠시 중단시키고 해당 요청에 대응하는 작업을 수행할 필요가 있다. 그런데 CPU가 항상 멈출 필요가 있는지 없는지 관리하기는 어렵다. 따라서 주변장치가 인터럽트 요청을 생성하면, 프로세서는 실행중인 프로그램을 잠시 중단 시키고 인터럽트 핸들러라는 프로그램을 실행해 작업을 수행한다.

 

 

 

 

 

 

 

메모리 계층과 성능

 

 

하드웨어적인 발달과 운영체제의 든든한 지원으로 CPU가 동시에 여러 프로그램을 실행할 수 있게 되었지만, 메모리에 접근하는 시간은 그렇게까지 단축되지 못했다. 이 간극을 해결하기 위해서 조금 더 빠른 메모리가 등장했다. 바로 캐시다. 

 

 

 

캐시는 RAM보다는 빠르지만 훨씬 작은 크기를 가지고 있다. 그렇기 때문에 'CPU가 필요할만한' 데이터만 실어두는 것이 중요하다. 그래서 캐시는 예측을 통해 데이터를 실어둔다. 이 예측이 맞으면 캐시 히트, 틀리면 캐시 미스라고 한다.

 

어떻게 하면 캐시히트를 늘릴 수 있을까? CPU 메모리 컨트롤러는 메모리에서 연속된 열에 있는 데이터를 한꺼번에 가져온다. 대부분은 연속된 위치에 있는 데이터가 필요하기 때문이다. 더 복잡하게는 조건 분기 명령어의 결과를 예측해 가져오기도 한다.

 

 

 

 

 

메모리 상의 데이터 배치

 


메모리상의 데이터는 일직선으로 관리되는 것도 아니며, 프로그램마다 온전히 독립적인 것도 아니다.

 

 

 


메모리 상의 데이터는 크기를 알고 있는 정적 데이터와 실행 전에는 크기를 알 수 없는 동적 데이터가 함께 존재한다. 그리고 프로그램의 컨텍스트를 담고 있는 스택을 위한 메모리도 필요하다. MMU를 통해 명령어, 데이터, 스택이 각기 다른 물리적 메모리 페이지에 매핑되게 할 수 있다. 하지만 가상 메모리는 이런 여러 데이터 영역이 서로 충돌하지 않도록 그림과 같은 메모리 배치를 사용한다.

또한 동적 링크 (MMU를 통해 같은 라이브러리를 공유하는 방법) 여러 프로그램이 사용할 수 있는 공유 라이브러리를 활용하기도 한다. 

 

 

 

 

 

 

-- 확인 문제 --

 

1. 페이지 교체 작업 흐름을 나열하세요.

ㄱ. MMU가 페이지 폴트 인터럽트를 발생시킴
ㄴ. 스왑아웃 - 스왑인이 일어남
ㄷ. 물리주소가 한계 레지스터의 범위를 벗어남
ㄹ. MMU가 CPU로부터 요청받은 가상주소를 물리주소로 변환함

 

 

2. 컴퓨터 아키텍처에는 대표적으로 (1)과 (2)가 있다. 이전에는 미리 정한 기능만을 수행하는 하드웨어를 만들어서 사용했기 때문에 다른 프로그램을 수행하기 위해서는 하드웨어 자체를 변경해야했다. 하지만 메모리 상에 프로그램의 명령어와 데이터를 올리고 CPU에서 연산을 처리하는 (1)은 소프트웨어만 변경하더라도 다른 프로그램들의 실행이 가능하도록 만들었다. (2)는 이와 비슷하지만 메모리 상에서 명령어와 데이터 영역을 구분하여 사용한다.