OS

컴퓨터 성능 향상 기술

Debin 2022. 6. 15.
반응형

이전 시간에 배운 내용 중 상기해야할 부분이 있다.

메모리의 속도는 시스템 버스의 속도와 같고 CPU의 속도는 CPU 내부 버스의 속도와 같다.

CPU 내부 버스의 속도가 시스템 버스의 속도보다 빠르기 때문에

메모리를 비롯한 주변장치의 속도가 CPU의 속도를 따라가지 못한다는 것이다.

이번 포스팅에서는 장치 간 속도 차이를 개선하고 시스템의 작업 속도를 올리기 위해 개발된 기술 중 운영체제와 관련된 기술을 공부해보겠다.

버퍼

버퍼는 속도에 차이가 있는 두 장치 사이에서 그 차이를 완화하는 역할을 맡는다.

얘를 들어 창고에 있는 과일 5개를 도마 위로 옮긴다고 생각하자.

한 번에 1개씩 옮기면 총 다섯 번을 왕복한다. 그러나 귤을 바구니에 담아서 옮기면 5개를 한 번에 옮길 수 있어 효율적인데,

바구니를 버퍼에 비유할 수 있다.

입출력장치에서 데이터를 가져오는 경우도 마찬가지다.

느린 입출력장치에서 데이터를 읽을 때마다 하나씩 전송하면 작업량에 비해 실제로 전송되는 데이터의 양이 매우 작지만,

일정량의 데이터를 모아 한꺼번에 전송하면 적은 노력으로도 많은 데이터를 옮길 수 있다.

일정량의 데이터를 모아 전송함으로써 속도의 차이를 완화시킨다.

사용되는 대표적인 예시는 동영상 스트리밍이다.

동영상을 볼 때 네트워크에서 데이터가 들어오는 시간과 플레이어가 재생되는 시간의 속도 차이가 발생할 수 있는데,

플레이어가 재생되는 도중에 데이터가 도착하지 않으면 동영상이 끊기는데, 이를 방지하기 위해 동영상 데이터의 일정 부분을 

버퍼에 넣은 후 실행한다.

버퍼를 비유한 그림

스풀

버퍼와 유사한 용어인 스풀이다.

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

스풀러는 인쇄할 내용을 순차적으로 출력하는 소프트웨어로, 출력 명령을 내린 프로그램과 독립적으로 동작한다.

 

워드프로세서로 작업하고 프린터로 출력하는 경우를 생각해보면, 스풀러가 없다면 워드프로세서가 입출력을 다 처리해야한다.

그러면 프린터 출력도 워드프로세서가 진행하므로 출력을 진행하는 동안에는 입력을 받는 다른 작업을 진행할 수 없다.

이때 스풀러를 사용하면 인쇄할 내용을 스풀러 공간에 저장하고 워드프로세서는 다른 작업을 할 수 있다.

문서 작업과 프린터 출력 작업이 독립적으로 진행되는 것이다.

 

스풀러와 버퍼는 차이점이 있다. 버퍼의 경우 어떤 프로그램이 사용하는 데이터든 버퍼가 차면 이동이 시작된다.

다시 말해 프로그램들이 버퍼를 공유하는데, 스풀러는 한 인쇄물이 완료될 때까지 다른 인쇄물이 끼어들 수 없으므로 프로그램 간에 배타적이다.

캐시

캐시는 메모리와 CPU간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해두는 임시 저장소다.

캐시는 필요한 데이터를 모아 한번에 전달하는 버퍼의 일종으로 CPU가 앞으로 사용할 것으로 예상되는 데이터를 미리 가져다놓는다.

이렇게 미리 가져오는 작업을 미리 가져오기라고 한다.

 

캐시는 CPU안에 있으며 CPU 내부 버스의 속도로 작동한다. 메모리의 경우 시스템 버스의 속도로 작동하기 때문에 느리다.

캐시는 빠른 속도로 작동하는 CPU와 느린 속도로 작동하는 메모리 사이에서 두 장치의 속도 차이를 완화해준다.

 

캐시는 메모리의 내용 중 일부를 미리 가져오고, CPU는 메모리에 접근해야 할 때 캐시를 먼저 방문하여 원하는 데이터가 있는지 찾아본다.

캐시에서 원하는 데이터를 찾았다면 캐시 히트라고 하며, 그 데이터를 바로 사용한다.

그러나 원하는 데이터가 캐시에 없으면 메모리로 가서 데이터를 찾는데 이를 캐시 미스라고 한다.

캐시 히트가 되는 비율을 캐시 적중률이라고 하며, 일반적인 컴퓨터의 캐시 적중률은 약 90%이다.

 

캐시의 구조

캐시 적중률을 높이는 방법은 다음과 같다.

  1. 캐시의 크기를 늘린다.
  2. 앞으로 많이 사용될 데이터를 캐시로 미리 가져온다.

즉시 쓰기와 지연 쓰기

캐시에 있는 데이터가 변경되는 경우 이를 반영해야 하는 문제도 있다.

캐시는 메모리에 있는 데이터를 임시로 가져온 것이기 때문에 캐시에 있는 데이터가 변경되면 메모리에 있는 원래 데이터를 변경해야 한다.

캐시의 변경된 데이터를 메모리에 반영하는 데에는 즉시 쓰기 방식과 지연 쓰기 방식이 있다.

  • 즉시 쓰기
    캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 방식이다.
    메모리와의 빈번한 데이터 전송으로 인해 성능이 느려지는 것이 단점이다.
    메모리의 최신 값이 항상 유지되므로 급작스러운 정전에도 데이터를 잃지 않는다.
  • 지연 쓰기
    캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 것이 아니라 변경된 내용을 모아서 주기적으로 반영하는 방식이다.
    카피백이라고도 하며 메모리와 데이터 전송 횟수가 줄어서 성능 향상을 기대할 수 있다.
    그러나 메모리와 캐시된 데이터 사이의 불일치가 발생할 수도 있다.

캐시는 명령어와 데이터 구분 없이 모든 자료를 가져오는 일반 캐시와

명령어와 데이터를 구분하여 가져오는 특수 캐시라는 두 가지 레벨로 구분된다.

명령어 캐시는 명령어 레지스터와 연결되어 있고, 데이터 캐시는 데이터 레지스터와 연결되어 있다.

명렁어 캐시나 데이터 캐시는 CPU 레지스터에 직접 연결되기 때문에 L1 캐시라고 부르며,

일반 캐시는 메모리와 연결되므로 L2 캐시라고 부른다.

레벨별 캐시의 구조

저장장치의 계층 구조

저장장치의 계층 구조는 속도가 빠르고 값이 비싼 저장장치를 CPU 가까운 쪽에 두고,

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

저장장치의 계층 구조

컴퓨터는 CPU와 메모리의 협업으로 작업을 한다.

그러나 메모리의 속도가 CPU보다 느리다. 

저장장치의 계층 구조에서는 CPU와 가까운 쪽에 레지스터나 캐시를 배치하여 CPU가 작업을 빨리 진행할 수 있게 한다.

또한 메모리에서 작업한 내용을 하드디스크와 같이 저렴하고 용량이 큰 저장장치에 영구적으로 저장할 수 있게 한다.

저장장치의 계층 구조는 사용자가 저렴한 가격으로 용량은 하드디스크처럼 사용하고 작업 속도는 레지스터처럼 빠르도록 만들어준다.

 

그러나 문제가 존재한다.

바로 저장 장치의 계층 구조에서 중복되는 데이터의 일관성을 유지해야한다는 것이 문제다.

인터럽트

과거에는 CPU가 직접 입출력장치에서 데이터를 가져오거나 내보냈는데, 이를 폴링 방식이라고 한다.

CPU가 명령어 해석과 실행이라는 본래 역할 외에 모든 입출력까지 관여해야 하므로 작업 효율이 떨어진다.

오늘날에는 CPU가 모든 입출력에 관여하면 작업 효율이 굉장히 비효율적이다. 

이러한 문제를 해결하기 위해 등장한 것이 인터럽트 방식이다.

 

인터럽트 방식은 요리사 옆에 주방 보조를 두는 것과 비슷하다. 

인터럽트 방식은 CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영함으로써 시스템의 효율을 높인다.

즉 데이터의 입출력이 이루어지는 동안 CPU가 다른 작업을 할 수 있다.

이 때 입출력 관리자 또는 장치 관리자가 주방 보조에 해당한다.

인터럽트 방식의 동작 과정

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

입출력 관리자가 CPU에 보내는 완료 신호를 인터럽트라고 한다.

CPU는 입출력 관리자에게 지시를 내리고 다른 작업을 하다가 완료 신호를 받으면 하던 일을 중단하고 옮겨진 데이터를 처리한다.

작업을 중단하고 처리해야 하는 신호라는 의미에서 인터럽트라고 불리게 되었다.

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

 

CPU는 입출력 관리자에게 여러 개의 입출력 작업을 시킬 수 있다.

여러 작업이 동시에 완료되고 그때마다 인터럽트를 여러 번 사용해야 하는데 이는 매우 비효율적이다.

그래서 여러 개의 인터럽트를 하나의 배열로 만든 인터럽트 벡터를 사용한다.

아래 그림에서는 인터럽트 0번과 3번이 동시에 발생했다는 것을 알 수 있다. CPU가 인터럽트 벡터를 받으면 

인터럽트 0번과 3번의 작업을 동시에 처리한다.

인터럽트 처리 과정

인터럽트는 다양한 종류가 있다.

  1. 입출력 작업이 완료되었음을 알리는 인터럽트
  2. 메모리에서 실행 중인 어떤 작업이 자신에게 주어진 메모리 영역을 넘어서 작업을 하려면 발생하는 인터럽트
  3. 0으로 숫자를 나누면 발생하는 인터럽트
  4. 컴퓨터 본체 전원 버튼을 눌러 강제 종료를 시키면 발생하는 인터럽트
  5. 이 밖에도 다양한 인터럽트가 있다.

직접 메모리 접근

입출력이 필요할 때 CPU는 입출력 관리자에게 입출력 요청을 보내고 자신이 하던 일을 진행한다.

입출력 관리자는 그럼 CPU가 요청한 데이터를 메모리에 올려야 하는데 이 때 문제가 있다.

메모리는 CPU만 접근 권한을 가진 작업 공간이라 원칙적으로는 입출력 관리자의 접근이 불가능하다.

따라서 CPU가 접근 권한을 허용해줘야 하는데, 이러한 권한을 직접 메모리 접근(DMA)라고 한다.

데이터 전송을 지시받은 입출력 관리자는 DMA가 있어야 CPU의 권한 없이 작업이 가능하다.

메모리 매핑 입출력

위에서 살펴본 직접 메모리 접근 방식을 사용하면 메모리가 복잡해진다.

메모리에는 CPU가 사용하는 데이터와 입출력 장치가 사용하는 데이턱다 섞이게 된다.

직접 메모리 접근을 통해 들어온 데이터를 메모리에 아무렇게나 둔다면 CPU가 사용하는 데이터와 섞여서 관리하기 어려울 것이므로 이를 막기 위해 메모리를 나누어 사용하는 방법이 도입되었다.

CPU가 사용하는 메모리 공간과 직접 메모리 접근을 통해 들어오거나 나가는 데이터를 위한 공간을 분리하는 것이다.

이렇게 메모리의 일정 공간을 입출력에 할당하는 기법을 메모리 매핑 입출력이라고 한다.

메모리 매핑 입출력

사이클 훔치기

만약 CPU와 직접 메모리 접근이 동시에 메모리에 접근하려 한다면 어떤 일이 발생할까?

두 장치가 동시에 메모리에 접근하면 누군가는 양보를 하는데 보통은 CPU가 메모리 사용 권한을 양보한다.

CPU의 작업 속도보다 입출력장치의 작업 속도가 느리므로 직접 메모리 접근에 양보하는 것으로,

이러한 상황을 사이클 훔치기라고한다.

 

이상으로 포스팅을 마칩니다. 감사합니다.

 

참고 자료

쉽게 배우는 운영체제 (저자 : 조성호)

https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791156644071 

 

운영체제 - 교보문고

명쾌한 비유와 사례로 쉽게 배우는 운영체제의 구조와 원리 컴퓨터 관련 학과 학생을 대상으로 운영체제의 구조와 원리를 설명한 책입니다. 주요 개념은 일상생활의 사례를 통해 쉽게 이해하고

www.kyobobook.co.kr

 

반응형

댓글