2. 컴퓨터의 구조와 성능 향상

2021. 5. 2. 19:41Computer Sciences/OS

1. 컴퓨터의 기본 구성

하드웨어의 구성

컴퓨터는 크게 CPU, 메모리, 입출력장치로 구성되어 있다.

CPU

명령어를 해석하여 실행하는 장치이다.

메모리

작업에 필요한 프로그램과 데이터를 저장하는 장치. 바이트 단위로 분할되어 있으며 분할 공간마다 주소로 구분한다.

입출력장치

외부의 데이터를 컴퓨터로 입력하고, 내부의 데이터를 사용자에게 출력하는 장치이다.

저장장치

자성을 이용하는 장치, 레이저를 이용하는 장치, 메모리를 이용하는 장치로 구분된다.

  • 자성 - 카세트테이프, 플로피디스크, 하드디스크 등
  • 레이저 - CD, DVD, 블루레이 등
  • 메모리 - USB, SD 카드, SSD 등

버스

각 장치를 연결하는 선의 집합이자 데이터가 지나다니는 통로이다.

메인보드

CPU와 메모리 등 여러 부품을 연결하는 판이다.

버스가 복잡하게 얽혀있으며 전력이 공급되는 버스로 연결된 부품들이 작동된다.

폰노이만 구조

오늘날 대부분의 컴퓨터는 폰노이만 구조를 따른다. 폰노이만 구조는 다음과 같다.

  • 이진수 체계이다.
  • 메모리에 프로그램을 적재하여 실행시켜야 한다.

하드웨어 관련 용어

클록(clock)

CPU 속도와 관련된 용어이다. 클록이 일정 간격으로 틱(tick)을 만들면 거기에 맞춰 CPU 내의 모든 구성요소가 작업을 한다. 틱은 펄스(pulse) 혹은 클록틱이라고도 부른다. 버스에는 여러 개의 부품이 연결되어 있는데, 메인 보드의 클록이 턱을 보낼 때마다 데이터를 보내거나 받는다.

헤르츠(Hz)

클록틱이 발생하는 속도를 나타내는 단위다. 1초에 클록틱이 몇 번 발생하는지를 나타내는데, 1초에 1번이면 1Hz, 1초에 1,000번이면 1kHz이다. 버스도 클록틱에 맞춰 데이터를 전송하기 때문에 메인보드의 성능도 클록으로 표시한다.

시스템 버스

메모리와 주변장치를 연결하는 버스이다. FSB(Front-Side Bus), 즉 전면 버스라고 한다.

메인 보드의 속도가 아무리 빨라도 메모리의 속도가 낮으면 메모리의 속도에 맞춰 컴퓨터가 작동한다.

CPU 내부 버스

CPU 내부에 있는 장치를 연결하는 버스이다. BSB(Back-Side Bus), 즉 후면 버스라고 한다.

CPU 내부 버스의 속도는 CPU의 클록과 같아서 시스템 버스보다 훨씬 빠르다.

CPU는 CPU 내부 버스의 속도로 동작하고 메모리는 시스템 버스의 속도로 작동하기 때문에 두 버스의 속도 차이로 인해 작업이 지연되는 문제가 있다.

2. CPU와 메모리

CPU의 구성과 동작

CPU는 산술논리 연산장치, 제어장치, 레지스터로 구성된다.

ALU

CPU에서 데이터의 연산을 담당하는 장치이다.

덧셈, 뺄셈, 곱셈, 나눗셈 같은 산술 연산과 AND, OR 같은 논리 연산을 수행한다.

제어장치(Control Unit)

CPU에서 작업을 지시하는 장치이다.

Register set

CPU 내에서 임시로 데이터를 저장하는 장치이다.

사용자가 변경할 수 있느냐의 유무에 따라 사용자 가시 레지스터와 사용자 비가시 레지스터로 구분된다.

레지스터

사용자 가시 레지스터(User-visible register)

사용자 프로그램에 의해 변경되는 레지스터이다.

  • 데이터 레지스터(DR): 메모리에서 가져온 데이터를 임시로 보관할 때 사용된다. CPU에 있는 대부분의 레지스터가 DR이기 때문에 범용 레지스터라고도 부른다.
  • 주소 레지스터(AR): 데이터 또는 명령어가 저장된 메모리의 주소를 저장하는 레지스터다.

사용자 비가시 레지스터(User-unvisible register)

사용자가 임의로 변경할 수 없는 레지스터이다.

  • 프로그램 카운터(PC): 다음에 실행할 명령어의 주소가 저장되는 레지스터이다.
  • 명령어 레지스터(IR): 현재 실행 중인 명령어를 저장한다.
  • 메모리 주소 레지스터(MAR): 메모리에서 데이터를 가져오거나 데이터를 보낼 때 주소를 지정하기 위해 사용한다.
  • 메모리 버퍼 레지스터(MBR): 메모리에서 가져온 데이터나 보낼 데이터를 일시적으로 저장하는 레지스터이다. MAR과 항상 같이 동작한다.

버스

버스는 CPU와 메모리, 주변장치 간에 데이터를 주고받을 때 사용한다. 버스에는 다음 작업을 지시하는 제어 신호, 메모리의 위치 정보를 알려주는 주소, 처리할 데이터가 오고 가며 제어 버스, 주소 버스, 데이터 버스에 실린다.

제어 버스

제어장치와 연결된 버스로, CPU가 메모리와 주변장치에 제어 신호를 보내기 위해 사용된다. 작업 완료 시나 오류 발생 시 제어신호를 보내기 때문에 양방향이다.

주소 버스

MAR과 연결된 버스로, 메모리나 주변장치에 데이터를 읽거나 쓸 때 위치 정보를 보내기 위하여 사용되며 단방향이다.

데이터 버스

MBR과 연결된 버스로, 데이터의 이동이 양방향으로 이루어진다.

대역폭

버스가 한 번에 전달할 수 있는 데이터의 최대 크기. CPU가 한 번에 처리할 수 있는 데이터의 크기(단어, word)와 같다.

메모리의 종류와 부팅

모든 프로그램은 메모리에 올라와야 실행될 수 있다. 메모리에는 실행에 필요한 프로그램과 데이터각 존재하며, CPU와 협업하여 작업이 이루어진다. 메모리를 이루는 소자 하나의 크기는 1bit이지만 소자 하나만으로 데이터를 표현할 수 없어 메모리의 주소는 바이트 단위로 지정되고, 메모리에서 데이터를 읽거나 쓸 때는 워드 단위로 움직인다.

휘발성 메모리

DRAM(Dynamic RAM)과 SRAM(Static RAM)으로 구분된다.

DRAM

저장된 데이터가 일정 시간이 지나면 사라지므로 일정 시간마다 재생시켜야 한다.

SRAM

전력이 공급되는 동안에는 데이터를 보관할 수 있어 재생할 필요가 없다. 따라서 속도는 빠르지만 가격이 비싸다. 일반적으로 메인메모리는 DRAM을, 캐시 같은 고속 메모리는 SRAM을 사용한다.

SDRAM

DRAM이 발전된 형태로 SRAM과 는 완전히 다른 종류의 램이다. SDRAM은 클록틱(펄스)이 발생할 때마다 데이터를 저장하는 동기 DRAM이다.

비휘발성 메모리

플래시 메모리, FRAM, PRAM 등이 있다.

플래시 메모리

디지털카메라, MP3 플레이어, USB와 같이 전력이 없어도 데이터를 보관하는 저장장치로 많이 사용된다. 하지만 플래시 메모리의 각 소자는 최대 사용 횟수가 제한되어 있어 보통 소자 하나당 몇 천 번에서 만 번 정도 사용하면 제 기능을 잃으므로, SD 카드나 USB를 오래 사용하면 성능이 저하되거나 데이터가 손실될 수 있으니 주의해야 한다.

ROM

전력이 끊겨도 데이터를 보관할 수 있고, 데이터를 한 번 저장하면 바꿀 수 없다. 이러한 특성 때문에 바이오스를 ROM에 저장한다.

  • Mask ROM: 데이터를 지우거나 쓸 수 없는 ROM
  • PROM: 전용 기계를 이용하여 데이터를 한 번만 저장할 수 있는 ROM
  • EPROM: 데이터를 여러 번 쓰고 지울 수 있는 ROM. 비싸다.

메모리 보호

현대의 운영체제는 시분할 기법을 사용하여 여러 프로그램을 동시에 실행하므로 사용자 영역이 여러 개의 작업 공간으로 나뉘어 있다. 이러한 상황에서 메모리가 보호되지 않으면 영역 간 침범이 일어날 수 있고, 프로그램을 파괴하거나 데이터가 지워질 수도 있으며, 최악의 경우 운영체제 영역을 침범하여 시스템이 멈출 수도 있다.

운영체제도 소프트웨어 중 하나이므로, CPU를 사용하는 작업 중 하나이다. 때문에 사용자의 작업이 진행되는 동안에는 운영체제의 작업이 잠시 중단된다. 운영체제의 작업이 중단된 상태에서 사용자의 작업으로부터 메모리를 보호하려면 하드웨어의 도움이 필요하다.

메모리를 보호하기 위한 절차는 다음과 같다.

  1. CPU는 현재 진행 중인 작업의 메모리 시작 주소를 경계 레지스터(bound register)에 저장한 후 작업을 한다.
  1. 현재 진행 중인 작업이 차지하고 있는 메모리의 크기, 즉 마지막 주소까지의 차이를 한계 레지스터(limit register)에 저장한다.
  1. 그리고 사용자의 작업이 진행되는 동안 이 두 레지스터는 주소 범위를 벗어나는지 하드웨어적으로 점검함으로써 메모리를 보호한다.
  1. 만약 두 레지스터의 값을 벗어나면 메모리 오류와 관련된 인터럽트가 발생한다. 인터럽트가 발생하면 모든 작업이 중단되고 CPU는 운영체제를 깨워서 인터럽트를 처리하도록 하고, 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램을 강제 종료시킨다.

부팅

컴퓨터를 켰을 때 운영체제를 메모리에 올리는 과정을 말한다. 부팅 과정은 다음과 같다.

  1. 사용자가 전원을 켜면 롬에 저장된 바이오스가 실행된다. 바이오스는 CPU, 메모리, 하드디스크, 키보드, 마우스와 같은 주요 하드웨어가 제대로 동작하는지 확인하고 이상이 없으면 하드디스크의 마스터 부트 레코드에 저장된 작은 프로그램을 메모리로 가져와 실행한다.
  1. 마스터 부트 레코드(MBR)는 하드디스크의 첫 번째 섹터를 가리키며, 운영체제를 실행하기 위한 코드인 부트스트랩이 이곳에 저장되어 있다. 부트스트랩 코드는 운영체제를 메모리로 가져와 실행하는 역할을 하는 프로그램이다.
  1. MBR에 있는 부트스트랩이 메모리에 올라오면 하드디스크에 저장된 운영체제를 메모리로 불러온다.

3. 컴퓨터 성능 향상 기술

버퍼

속도에 차이가 있는 두 장치 사이에서 그 차이를 완화하는 역할을 한다. 일정량의 데이터를 모아 옮김으로써 속도의 차이를 완하하는 장치이다.

스풀

CPU와 입출력장치가 독립적으로 동작하도록 고안된 소프트웨어적인 버퍼로, 대표적인 예가 프린터에 사용되는 스풀러이다.

스풀러는 일종의 버퍼이지만 버퍼와 차이점이 있다. 버퍼의 경우 어떤 프로그램이 사용하는 데이터든 버퍼가 차면 이동이 시작된다. 다시 말해 프로그램들이 버퍼를 공유한다. 하지만 스풀러는 한 작업 중에 다른 작업이 끼어들지 못하게 하므로 프로그램간에 배타적이다.

캐시

메모리와 CPU 간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해두는 임시 장소이다. 캐시는 필요한 데이터를 모아 한꺼번에 전달하는 버퍼의 일종으로, CPU가 앞으로 사용할 것으로 예상되는 데이터를 미리 가져다놓는다.

저장장치의 계층 구조

4. 인터럽트

폴링

초기의 컴퓨터 시스템에는 주변장치가 많지 않아서 폴링 방식으로 운영됐다. 폴링(polling)은 CPU가 직접 입출력장치에서 데이터를 가져오거나 내보내는 방식이다. 폴링 방식은 CPU가 입출력장치의 상태를 주기적으로 검사하여 일정 조건을 만족할 때까지 데이터를 처리한다. CPU가 명령어 해석과 실행 이외에 모든 입출력까지 관여해야 하므로 작업 효율이 떨어졌다. 이러한 문제를 해결하고자 나온 것이 인터럽트 방식이다.

인터럽트

CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영함으로써 시스템의 효율을 높인다. 즉 데이터의 입출력이 이루어지는 동안 CPU가 다른 작업을 할 수 있다.

  1. CPU가 입출력 관리자에게 입출력 명령을 보낸다.
  1. 입출력 관리자는 명령받은 데이터를 메모리에 가져다놓거나 메모리에 있는 데이터를 저장장치로 옮긴다.
  1. 데이터 전송이 완료되면 입출력 관리자는 완료 신호를 CPU에 보낸다.

이때 입출력 관리자가 CPU에 보내는 완료 신호를 인터럽트(Interrupt)라고 한다. CPU는 입출력 관리자에게 작업 지시를 내리고 다른 일을 하다가 완료 신호를 받으면 하던 일을 멈추고 옮겨진 데이터를 처리한다.

인터럽트 방식에서는 많은 주변장치 중 어떤 것의 작업이 끝났는지를 CPU에 알려주기 위해 인터럽트 번호를 사용한다. 이는 운영체제마다 다르다.

CPU는 입출력 관리자에게 여러 개의 입출력 작업을 동시에 시킬 수 있다. 이 경우 여러 작업이 동시에 완료되고 그때마다 인터럽트를 여러 번 사용해야 하는데 이는 매우 비효율적이다. 그래서 여러 개의 인터럽트를 하나의 배열로 만든 인터럽트 벡터를 사용한다.

DMA

CPU는 입출력일 필요할 때 입출력 관리자에게 입출력 요청을 보내고 하던 일을 계속한다. 명령을 받은 입출력 관리자는 CPU가 요청한 데이터를 메모리에 가져다놓아야 하는데, 메모리는 CPU만 접근 권한을 가진 작업 공간이라서 접근하지 못한다. 이를 위해 입출력 관리자는 직접 메모리 접근(DMA)라는 권한을 얻어 메모리에 접근하여 데이터를 옮긴다.

메모리 매핑 입출력

DMA를 사용하면 메모리가 복잡해진다. 메모리에는 CPU가 사용하는 데이터와 입출력 장치가 사용하는 데이터가 섞여있어, DMA를 통해 들어온 데이터를 메모리에 아무렇게나 둔다면 CPU가 사용하는 데이터와 섞여서 관리하기 어려울 것이다. 이를 위해 메모리를 나누어 사용하는 방법이 도입됐다. CPU가 사용하는 메모리 공간과 DMA를 통해 들어오거나 나가는 데이터를 위한 공간을 분리하는 것이다. 이렇게 메모리의 일정 공간을 입출력에 할당하는 기법을 메모리 매핑 입출력(Memory Mapped I/O, MMIO)라고 한다.

사이클 훔치기

CPU와 DMA가 동시에 메모리에 접근하면 둘 중 하나는 양보해야 한다. 보통 CPU가 양보한다. CPU의 작업 속도보다 입출력장치의 속도가 느리기 때문이다. 이러한 상황을 사이클 훔치기(Cycle stealing)라고 한다.

4. 병렬 처리

병렬 처리(parallel processing)는 동시에 여러 개의 명령을 처리하여 작업의 능률을 올리는 방식이다.

병렬 처리 시 고려사항

  • 상호 의존성이 없어야 한다
  • 각 단계의 시간을 거의 일정하게 맞춰야 병렬 처리가 원만하게 이루어진다.
  • 전체 작업 시간을 몇 단계로 나눌 것인지 잘 계산해야 한다. 보통 깊이를 10~20 정도로 한다.

병렬 처리 기법

CPU에서 명령어가 실행되는 과정은 다음과 같이 4단계로 나누어진다.

  1. 명령어 패치(Instruction Fetch, IF)
    • 다음에 실행할 명령어를 명령어 레지스터에 저장한다
  1. 명령어 해석(Instruction Decode, ID)
    • 명령어를 해석한다
  1. 실행(EXecution, EX)
    • 해석한 결과를 토대로 명령어를 실행한다
  1. 쓰기(Write Back, WB)
    • 실행된 결과를 메모리에 저장한다.

파이프라인 기법

하나의 코어에 여러 개의 스레드를 사용하여 명령을 겹처서 실행하는 방법이다.

명령어를 여러 단계로 분할한 후, 각 단계를 동시에 처리하는 하드웨어를 독립적으로 구성한다.

파이프라인 기법은 다음과 같은 문제가 있다.

  • 데이터 위험
    • 데이터의 의존성 때문에 발생하는 문제이다. 예시로 데이터 A를 필요로 하는 두 번재 명령어는 앞의 명렁어가 끝날 때까지 동시에 실행되어서는 안된다. 이는 명령어 단계를 지연하여 해결한다.
  • 제어 위험
    • 분기를 하는 if문 혹은 goto문 같은 명령에서 프로그램 카운터 값을 갑자기 변화시켜 발생하는 위험이다. 보통의 경우 프로그램이 순차적으로 실행된다고 가정하므로 동시에 실행되는 명령어들이 순차적으로 실행된다. 하지만 명령어가 goto문이라면 다음 문장이 아니라 다른 문장으로 이동하게 되어 현재 동시에 처리되고 있는 명령어들이 쓸모없어진다. 이는 분기 예측이나 분기 지연 방법으로 해결한다.
  • 구조 위험
    • 서로 다른 명령어가 같은 자원에 접근하려 할 때 발생하는 문제이다. 예를 들어 명령어 A가 레지스터 X를 사용하고 있는데 병렬 처리되는 명령어 B도 X를 사용해야 한다면 서로 충돌하게 된다.

슈퍼스칼라

파이프라인을 처리할 수 있는 코어를 여러 개 구성하여 복수의 명령어가 동시에 실행되도록 하는 방식이다. 이 방식도 마찬가지로 처리되는 명령어가 상호 의존성 없이 독립적이어야 하며, 이를 위한 처리도 컴파일러에서 이루어지도록 조정해야 한다. 오늘날 대부분의 CPU는 슈퍼스칼라 기법을 사용하고 있다.

'Computer Sciences > OS' 카테고리의 다른 글

4. CPU 스케줄링  (0) 2021.05.03
3-3. 프로세스의 연산  (0) 2021.05.02
3-2. PCB와 문맥 교환  (0) 2021.05.02
3-1. 프로세스의 개요  (0) 2021.05.02
1. 운영체제란?  (0) 2021.05.02