[OS] 컴퓨터의 구조와 성능 향상

하드웨어 구성

컴퓨터의 구성

CPU, Memory, 다양한 입출력 장치

CPU와 메모리

CPU : 중앙 처리 장치, 컴퓨터 시스템을 통제하고 프로그램의 연산을 실행 및 처리하는 가장 핵심적인 컴퓨터의 제어 장치, 혹은 그 기능을 내장한 칩
메모리(RAM) : 시스템의 단기 데이터 저장소, 정보에 빠르게 액세스할 수 있도록 컴퓨터가 실시간으로 사용하는 정보를 저장

저장장치

메모리보다 느리지만 저렴하고 용량이 큼, 데이터를 영구적으로 저장

메인보드

컴퓨터 부품 사이를 이어주는 역할. 메인보드가 없으면 CPU가 메모리로 처리된 정보를 보낼 수 없음.

폰 노이만 구조

컴퓨터를 설계 관점에서 분석할 때, 1940년대 이후 지금까지 거의 모든 컴퓨터가 폰 노이만 구조를 기반으로 함
폰노이만 중앙처리장치(CPU), 메모리, 프로그램 세 가지 요소로 구성되어 있으며 CPU와 메모리는 서로 분리되어 있고 둘을 연결하는 버스를 통해 명령어 읽기, 데이터의 읽고 쓰기가 가능. 메모리 안에 프로그램과 데이터 영역은 물리적 구분이 없기 때문에 명령어와 데이터가 같은 메모리, 버스를 사용. 즉 CPU가 명령어와 데이터에 동시 접근할 수 없음
폰노이만 구조의 가장 큰 특징은 메인 메모리가 유일한 작업 공간이기 때문에 메모리 관리가 중요하다는 점.

하드웨어 사양 관련 용어

클럭

컴퓨터의 CPU 또는 디지털회로가 일정한 속도로 작동하기 위해서는 일정한 간격으로 전기적 진동을 공급 받아야한다. 즉 CPU를 비롯한 컴퓨터의 모든 부품들은 특정한 신호에 맞추어 동작을 하는데, 이 특정한 신호를 가리키는 말이 바로 클럭이다.

헤르츠

초당 몇 번의 신호가 있는지를 나타내는 단위
1초에 1번 동작 = 1Hz
3.4GHz는 1초에 클로틱이 3_400_000_000번 발생하여 CPU가 1초에 약 34억 번의 연산을 할 수 있음을 의미

시스템 버스

프로세서와 메인 메모리 사이를 연결하여 이들 2개의 컴포턴트 사이의 데이터 및 명령의 전송을 관리
FSB(Front Side Bus) 전면 버스라고도 함

CPU 내부 버스

CPU내 각 구성 요소를 연결하여 데이터, 주소 또는 제어 신호를 전달하는 신호회선
BSB(Back Size Bus) 후면 버스라고도 함

CPU와 메모리 속도

CPU 내부 버스의 속도가 시스템 버스의 속도보다 빠르기 때문에 메모리를 비롯한 주변장치의 속도가 CPU의 속도를 따라가지 못한다.

CPU의 구성과 동작

산술논리 연산장치

데이터의 덧셈, 뺄셈, 곱셈, 나눗셈 같은 산술 연산과 AND, OR 같은 논리 연산 수행

제어 장치

CPU에서 작업을 지시

레지스터

CPU 내에 데이터를 임시로 보관

버스의 종류와 특징

  • 제어 버스
    1. 제어 버스에서는 다음에 어떤 작업을 할지 지시하는 제어 신호가 오고 간다.
    2. 메모리에서 데이터를 가져올지, 아니면 처리한 데이터를 옮겨놓을지에 대한 지시 정보가 오고 가는데, 메모리에서 데이터를 가져올 때는 읽기 신호, 처리한 데이터를 메모리로 옮겨놓을 때는 쓰기 신호를 보낸다.
    3. 제어 버스의 신호는 CPU, 메모리, 주변장치와 양방향으로 오고 간다.
  • 주소 버스
    1. 주소 버스에서는 메모리의 데이터를 읽거나 쓸 때 어느 위치에서 작업할 것인지를 알려주는 위치 정보(주소)가 오고 간다.
    2. 주소 버스는 메모리 주소 레지스터와 연결되어 있으며 단방향이다.
    3. CPU에서 메모리나 주변장치로 나가는 주소 정보는 있지만 버스를 통해 CPU로 전달되는 정보는 없다.
  • 데이터 버스
    1. 제어 버스가 다음에 어떤 작업을 할지 신호를 보내고 주소 버스가 위치 정보를 전달하면 데이터가 데이터 버스(data bus)에 실려 목적지까지 이동한다.
    2. 데이터 버스는 버퍼 레지스터와 연결되어 있으며 양방향이다.

버스의 대역폭

버스의 대역폭은 한 번에 전달할 수 있는 데이터의 최대 크기를 말하는데 CPU가 한 번에 처리할 수 있는 데이터의 크기와 같다. 흔히 32bit CPU, 64bit CPU라고 하는데, CPU가 한 번에 처리할 수 있는 데이터의 최대 크기를 말한다. 32bit의 경우 버스의 대역폭도 32bit이고 레지스터의 크기, 메모리에 한 번에 저장할 수 있는 데이터의 크기도 32bit이다.

참고로 CPU가 한 번에 처리할 수 있는 데이터 최대 크기를 워드(word)라고 한다. 이는 버스의 대역폭과 메모리에 한 번에 저장되는 단위도 워드라는 것을 알 수 있다. 32bit CPU에서 1워드는 32bit이다.

메모리의 종류와 부팅

메모리는 크게 두 가지로 나눌 수 있다. 읽거나 쓸 수 있는 램(RAM), 읽기만 가능한 롬(ROM) 으로 구분된다. 램은 전력이 끊기면 데이터가 사라지는 휘발성 메모리와 전력이 끊겨도 데이터 보관할 수 있는 비휘발성 메모리로 나뉜다.

휘발성 메모리

DRAM : Dynamic RAM으로 일정 시간이 되면 데이터가 사라지므로 다시 재생시켜야 한다.
SRAM : 전력이 공급되는 동안에는 데이터를 보관할 수 있어 재생할 필요가 없다. 일반적으로 메인메모리에 DRAM을 사용하고, 캐시 같은 고속 메모리에 SRAM을 사용한다.
SDRAM : 클록틱(펄스)이 발생할 때마다 데이터를 저장하는 동기 DRAM

비휘발성 메모리

비휘발성 메모리는 전력이 끊겨도 데이터를 보관해야 하므로 메모리 내부가 복잡하고 속도가 느리며 가격이 비싸다.
플래시 메모리 : 디지털 카메라, MP3, USB 드라이버같이 전력 없어도 데이터를 보관하는 저장장치로 사용
SSD : 하드디스크 대신 사용하도록 만든 비휘발성 메모리로 가격이 비싸지만 빠른 데이터 접근 속도, 저전력 등 떄문에 개인용 컴퓨터, 노트북에 자주 사용된다.

ROM

롬은 전력이 끊겨도 데이터를 보관하는 것이 장점이지만 데이터를 한 번 저장하면 바꿀 수 없다. 이러한 특성 때문에 BIOS(Basic Input Output System) 를 롬에 저장한다.
마스크 롬 (mask ROM) : 데이터를 지우거나 쓸 수 없음
PROM(Programmable ROM) : 전용 기계를 이용하여 데이터를 한 번만 저장할 수 있음
EPROM(Erasable Programmable ROM) : 데이터를 여러 번 쓰고 지울 수 있음

메모리 보호의 필요성

운영 체제에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이 메모리 보호의 주된 목적이다. 이를 통해 프로세스 내의 버그가 다른 프로세스의 동작에 영향을 미치는 것을 예방하며 악성 소프트웨어가 시스템에서 허가되지 않은 접근권한을 갖고 시스템에 영향을 끼치는 것을 막아준다.

메모리 보호 방법

  1. 작업의 메모리 시작 주소를 경계 레지스터에 저장 후 작업
  2. 작업이 차지하고 있는 메모리 크기(마지막 주소 - 시작 주소)를 한계 레지스터에 저장
  3. 작업이 진행되는 동안 경계 레지스터와 한계 레지스터의 주소 범위를 벗어나는지 하드웨어적으로 점검
  4. 값을 벗어나면 메모리 오류와 관련된 인터럽트 발생
  5. 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램 강제 종료

부팅

  1. 컴퓨터 전원 ON
    • 메인보드에 전력이 들어옴
  2. ROM BIOS 동작
    • CPU가 ROM(Read Only Memory)에 저장된 BIOS(Basic Input/Output System) 실행
    • BIOS : 컴퓨터의 하드웨어 장치들의 I/O을 관리하는 펌웨어, 컴퓨터의 하드웨어 장치들과 운영체제 사이에 위치하여 운영체제가 하드웨어 I/O를 제어할 때 BIOS를 통해 제어하게 됨
  3. BIOS의 POST 과정
    • CPU에 의해 실행된 BIOS는 컴퓨터의 하드웨어 장치들(CPU를 제외한 메모리, 디스크 등)을 검사하는 POST(Power On Self Test) 과정 진행
    • BIOS는 POST과정이 진행된 후 부팅할 수 있는 보조기억장치(USB, 디스크 등)를 선택
    • 부팅 우선 순위에 따라 부팅할 보조기억장치를 찾는다.
  4. RAM에 OS를 적재
    • BIOS는 주변 하드웨어 장치들을 검사하는 POST 과정 이후, 부팅할 보조기억장치를 선택하고 부팅할 하드디스크의 MBR(Master Boot Record)에 저장되어 있는 부트로더(Boot Loader)를 실행
    • 부트로더는 하드디스크의 첫 섹터인 MBR내 OS를 RAM에 로드(OS Loading)
    • 부트로더(Boot Loader) : 운영체제를 시작하기 위해 OS를 RAM에 올려주는 부팅 전용 프로그램

버퍼

버퍼

어떤 장치에서 다른 장치로 데이터를 송신할 때 일어나는 시간의 차이나 데이터 흐름의 속도 차이를 조정하기 위해 일시적으로 데이터를 기억시키는 장치.

스풀

소프트웨어적인 버퍼의 일종으로 CPU와 입출력장치가 서로 독립적으로 수행하도록 고안된것이다. 대표적인 예로 프린터의 스풀러가 있다.

평소에 워드로 문서편집을 한 후 인쇄를 하게되면 CPU가 이를 처리할 시 출력이 끝날때까지 워드를 사용하지 못한다. 이를 방지하고자 인쇄할 내용을 하드디스크에 스풀러 공간에 저장하여 CPU는 다른 작업을 수행할 수 있다. 스풀러와 일반적인 버퍼의 차이점은 버퍼의 경우 여러 프로그램에 데이터들을 모아서 한번에 전송하지만 스풀러의 경우 한 인쇄물이 완료될때까지 다른 인쇄물이 끼어들 수 없다.

캐시

캐시는 메모리의 있는 데이터의 일부를 미리 CPU영역에 저장하는 방법을 통해서 속도의 차이를 완화하는 방법이다. CPU는 데이터를 가져올 시 캐시에서 검사 후 데이터가 없는 경우에만 메모리에서 가져온다. 캐시에서 데이터를 찾으면 캐시 히드, 못찾으면 캐시 미스라고 한다.

즉시 쓰기

CPU에서 연산결과를 캐시메모리에 저장할 경우 바로 메인메모리에도 값을 저장하는 방식. 이 방식은 메인메모리와 캐시메모리의 값이 항상 동일하다는 장점이 있음. 하지만 쓰기 동작이 발생할 때마다 캐시메모리와 메인메모리에 쓰기 동작이 발생하기 때문에 시간이 길어짐.

지연 쓰기

CPU의 연산결과를 캐시메모리에 저장해두고 메인메모리에는 저장하지 않음. 변경된 캐시메모리의 블록에 1비트의 태그로 표시를 해두고, 해당 블록이 삭제되기 전에 메인메모리에 저장하는 방식. 이 방식은 메인메모리와 캐시메모리 간의 데이터가 불일치 할 수 있음.

L1 캐시와 L2 캐시

캐시메모리가 두 개 존재함. 하나는 CPU내에 들어있는 캐시메모리로 아주 작지만 아주 빠름. 다른 하나는 CPU외에 있는 캐시메모리로, 상대적으로 느리지만 용량은 더 큼.

L1은 CPU내에 있는 캐시메모리를 말하고, L2는 CPU 외(메모리)에 있는 캐시메모리를 말함. L1은 L2보다 속도는 빠르지만 적중률이 낮음.

저장장치의 계층 구조

속도가 빠르고 값이 비싼 저장장치를 CPU에 가까운 쪽에 두고, 값이 싸고 용량이 큰 저장장치를 반대쪽에 배치하여 적당한 가격으로 빠른 속도와 큰 용량을 동시에 얻는 방법. 

컴퓨터는 CPU와 메모리의 협업으로 작업을 하지만 메모리의 속도가 CPU보다 느리다. 저장장치의 계층구조에서는 CPU와 가까운 쪽에 레지스터나 캐시를 배치하여 CPU가 작업을 빨리 진행할 수 있게 해준다. 또한, 메모리에서 작업한 내용을 하드디스크같이 저렴하고 용량이 큰 저장장치에 영구적으로 저장할 수 있게 한다. 저장장치의 계층구조는 사용자가 저렴한 가격으로 용량은 하드디스크처럼 사용하고 작업속도는 레지스터처럼 빠르게 만들어준다. 

인터럽트

폴링 방식

CPU가 주변 입출력 장치들(키보드, 센서, LCD 등)에서의 변화를 지속적으로 계속 확인하고 그에 따라 프로그램을 처리하는 방식을 말한다. 프로그램은 쉽게 구현할 수 있지만 예를 들어 컴퓨터의 키보드를 폴링방식으로 구현한다고 생각해보자. 컴퓨터로 영화를 보고 있는데도 키보드를 치고 있는지 아닌지 계속 확인하는 작업을 한다면 CPU의 성능을 제대로 활용할 수 없다. 하지만 아두이노, AVR 등에서 간단한 프로젝트를 구현할 때는 코드를 작성하기 간편하다는 장점 때문에 폴링 방식을 사용하기도 한다.

  • 장점
    1. 정해진 순서에 의해 명령을 반복적으로 처리하므로 프로그램을 작성하고 이해하기 쉽다(소규모 프로그램을 작성할 때만).
  • 단점
    1. 입출력 장치들과의 상호작용을 폴링 방식으로 많이 할 수록 CPU를 점유하는 시간이 증가하기 때문에 성능이 크게 떨어진다.
  1. 한 루프를 다 돌아야지만 상태 변화를 확인 할 수 있다. 즉, 정확한 타이밍에 인터럽트가 발생했는지 알 수 없고 폴링 루프가 길어질 수록 반응 속도가 늦어지거나 실행되지 않을 가능성이 높아진다.

인터럽트 방식

cpu가 프로세스를 실행하고 있을 때 입출력, 파일읽기, 예외사항 등이 발생하여 처리가 필요한 경우 cpu에 알려주는 것
CPU가 한 프로세스에서 작업을 수행하는 도중에 인터럽트가 발생하면 하던 일을 중단하고 이미 정해진 코드를 실행해서 인터럽트의 요청을 처리하는 방식으로 동작한다. 여기서 이미 정해진 코드 흐름을 인터럽트 서비스 루틴(Interrupt Service Routine, ISR) 또는 인터럽트 핸들러(Interrupt Handler)라고 부른다.

인터럽트 번호

각 인터럽트는 고유의 번호를 가지고 있다. 인터럽트 번호 자체는 예외상황 인터럽트를 제외하고는 운영체제에서 결졍한다.

인터럽트 벡터

인터럽트가 발생했을 때, 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간.

인터럽트 방식의 동작 과정

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

직접 메모리 접근(DMA)

특정 하드웨어 하위 시스템이 CPU와 독립적으로 메인 시스템 메모리에 접근할 수 있게 해주는 컴퓨터 시스템의 기능

메모리 매핑 입출력

메모리의 일정 공간을 입출력에 할당하는 기법

사이클 훔치기

CPU와 입출력 관리자의 DMA(직접 메모리 접근)가 동시에 메모리에 접근하고 할때, 보통 CPU가 양보한다. 그 이유는 CPU의 작업 속도보다 입출력장치 속도가 더 느리기 때문이다. CPU 입장에서는 입출력 관리자의 직접 메모리 접근이 사이클을 훔쳐간 것이기 때문에 사이클 훔치기라고 불린다.

병렬 처리의 개념

병렬 처리

동시에 여러 개의 명령을 처리하여 작업의 능률을 올리는 방식

파이프라인 기법

하나의 코어에 여러 개의 스레드를 이용하는 방식

슈퍼스칼라 기법

듀얼코어 CPU를 이용해 2개의 작업을 동시에 처리하는 방식

병렬 처리 시 고려 사항

  • 상호 의존성이 없어야 병렬 처리가 가능하다.

  • 각 단계의 시간을 거의 일정하게 맞춰야 병렬 처리가 원만하게 이뤄진다. 시간이 다를 경우 오랜 시간이 걸리는 작업에서 병목현상이 나타날 수 있다.

  • 전체 작업 시간을 몇 단계로 나눌지 잘 따져봐야 한다. 이론적으로 병렬 처리의 깊이가 깊을수록 동시에 작업할 수 있는 작업의 수가 많아져서 성능이 높아질 것 같지만, 새로운 작업을 불러오는 데 오랜 시간이 걸려 성능이 떨어진다.

병렬 처리 기법

CPU에서 명령어가 실행되는 과정

  1. 명령어 패치(IF) : 다음에 실행할 명령어를 명령어 레지스터에 저장
  2. 명령어 해석(ID) : 명령어 해석
  3. 실행(EX) : 해석한 결과를 토대로 명령어 실행
  4. 쓰기(WB) : 실행된 결과를 메모리에 저장

파이프라인 기법

CPU 사용을 극대화하기 위해 명령을 겹쳐서 실행하는 방법

파이프라인의 위험

  • 데이터 위험(Data Hazard) 미수행된 명령의 결과값 참조 시도 발생

  • 제어 위험(Control Hazard) 순차적 명령어가 분기에 의해 버려지는 경우

  • 구조적 위험(Structural Hazard) 자원 충돌로 여러 명령의 동시 수행 시 발생

슈퍼스칼라 기법

파이프라인을 처리할 수 있는 코어를 여러 개 구성하여 복수의 명령어가 동시에 실 행되도록 하는 방식
대부분은 파이프라인 기법과 동일하지만 코어를 2개 구성하여 각 단계에서 동시에 실행되는 명령어가 2개라는 점이 다름

슈퍼파이프라인 기법

슈퍼 파이프라인(super pipeline)은 파이프라인의 한 종류이다. 파이프라인은 어떤 명령어에 대해 한 클럭동안 동작이 끝나면 다음 명령어에 대해 그 동작이 수행되지만, 슈퍼 파이프라인에서는 어떤 동작이 실행될 때, 그 클럭을 나누어서 다음 명령어에 대한 동작을 수행한다. 클럭이 높아짐에 따라서 나누기가 힘들어져서 잘 사용되지 않는다.

슈퍼파이프라인 슈퍼스칼라 기법

슈퍼파이프라인 기법을 여러 개의 코어에서 동시에 수행하는 방식

VLIW 기법

소프트웨어적으로 병렬 처리하는 방법

Categories:

Updated:

Leave a comment