본문 바로가기
Lecture/OS

컴퓨터 성능 향상 기술

by YUNZEE 2023. 10. 14.
728x90

시스템 작업 속도를 올리기 위해 개발된 기술 중 운영체제와 관련된 것을 살펴보고자 한다.

 

버퍼 buffer

버퍼는 두 장치 사이의 속도 차이를 완화하는 역할을 한다. 예를 들어 5개의 귤을 옮길 때 5번 왔다갔다 하는 것이 아니라  바구니에 한번에 5개를 담고 옮기면 더욱 효율적이다. 이 경우의 바구니는 버퍼로 비유된다.

이렇게 일정량의 데이터를 모아서 옮겨 속도 차이를 완화하는 장치가 버퍼다.

 

스풀 SPOOL

버퍼와 유사한 용어로 스풀이 있다. 스풀은 CPU와 입출력장치가 독립적으로 동작하도록 고완된 소프트웨어적인 버퍼로, 대표적인 예는 프린터와 사용되는 스풀러(spooler)다. 스풀러는 인쇄할 내용을 순차적으로 출력하는 소프트웨어로 출력 명령을 내린 프로그램과 독립적으로 작동한다. 우리는 스풀러를 사용해서 인쇄할 내용을 하드디스크의 스풀러 공간에 저장하고 워드 프로세스는 다른 작업을 할 수 있게 한다.  문서 작업과 프린터 출력 작업이 독립적으로 진행되는 것 이다.(한컴에서 양식을 인쇄 버튼을 클릭하고나서 한컴을 나간다고 해서 출력이 중지되는 것이 아니라 계속 출력됨)

 

캐시cache

캐시는 메모리와 CPU간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해 두는 임시 장소다. CPU가 앞으로 사용할 것으로 예상되는 데이터를 미리 가져다 놓는다. 이렇게 미리 가져오는 작업을 '미리 가져오기(prefetch)'라고 한다.

캐시는 메모리의 내용 중 일부를 미리 가져오고 CPU는 메모리에 접근할 때 먼저 캐시를 방문하여 원하는 데이터가 있는지 찾아본다. 캐시에서 원하는 데이터를 찾았을 때 캐시 히트(cache hit)라고 하며 그 데이터를 바로 사용한다. 그러나 원하는 데이터가 캐시에 없으면 메모리로 가서 데이터를 찾는다. 이를 캐시 미스(cache miss)라고 한다.

 

저장장치의 계층 구조

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

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

 

인터럽트interrupt

초기의 컴퓨터 시스템에는 주변장치가 많지 않았지만  당시에는 CPU가 직접 입출력장치에서 데이터를 가져오거나 내보냈는데, 이를 폴링 방식이라고 한다.  예를 들어 요리사가 요리하다 말고 재료가 필요해서 보관 창고로 직접 갔다오는 것을 표현한다. 따라서 CPU가 명령어 해석과 실행이라는 본래 역할 외에 모든 입출력까지 관여해야 하므로 작업 효율이 떨어진다. 오늘날의 컴퓨터에는 주변장치가 많기 때문에 CPU가 모든 입출력에 관여하면 작업 효율이 현저하게 떨어진다. 이러한 문제를 해결하기 위해 등장한 것이 인터럽트(interrupt)방식이다. 인터럽트 방식을 요리사 모형에 비유하면 요리사 옆에 주방 보조를 두어 필요한 재료를 가져와 도마 위에 올려놓고 재료가 준비된 것을 요리사에게 알려준다. 

 

인터럽트 방식의 동작 과정

입출력 관리자가 CPU에 보내는 완료 신호를 인터럽트라고 한다. CPU는 입출력 관리자에게 작업 지시를 내리고 다른 일을 하다가 완료 신호를 받으면 하던 일을 중단하고 옮겨진 데이터를 처리한다. 이처럼 하던 작업을 중단하고 처리해야 하는 신호라는 의미에서 인터럽트라는 이름을 붙었다.

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

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

 

직접 메모리 접근

인터럽트 장식을 이해했다면 직접 메모리 접근도 쉽게 이해할 수 있을 것이다.

입출력이 필요할 때 CPU는 입출력 관리자에게 입출력 요청을 보내고 자신은 하던 일을 계속한다. 명령을 받은 입출력 관리자는 CPU가 요청한 데이터를 메모리에 가져다 놓아야 하는데 이때 문제가 있다. 메모리는 CPU만 접근 권환을 가진 작업 공간이라 입출력 관리자는 접근이 불가하다. 따라서 입출력 관리자에게는 CPU의 허락 없이 메모리에 접근할 수 있는 권한이 필요한데, 이것을 직접 메모리 접근 DMA이라고 한다.

 

메모리 맵 입출력

하지만 직접 메모리 접근을 사용하면 메모리가 복잡해진다. 왜냐하면 직접 메모리 접근을 통해 들어온 데이터를 메모리에 아무렇게 둔다면 CPU가 사용하는 데이터와 섞여서 관리하기 어려울 것이다. 그래서 이를 막기 위해 메모리를 나누어 사용하는 방법이 도입되었다. CPU가 사용하는 메모리 공간과 직접 메모리 접근을 통해 들어오고 나가는 데이터를 위한 공간을 분리하는 것이다. 이렇게 메모리의 일정 공간을 입출력에 할당하는 기법을 메모리 맵 입출력(MMIO) 이라고 한다.

 

사이클 훔치기

메모리는 CPU가 관할하는 중요한 장치이지만 직접 메모리 접근을 통해 입출력 장치도 메모리를 사용할 수 있게 되었다. 그런데 CPU와 직접 메모리 접근이 동시에 메모리에 접근하려 한다면 어떤 일이 발생할까? 이 경우에 누군가는 양보해야 하는데 보통은 CPU가 메모리 사용 권한을 양보한다. CPU의 작업 속도보다 입출력장치의 속도가 느리기 때문이다. CPU입장에 서는 직접 메모리 접근이 사이클을 훔쳐 간 것이 되기 때문에 이러한 상황을 사이클 훔치기(cycle stealing) 라고 부른다.

728x90

'Lecture > OS' 카테고리의 다른 글

프로세스 제어 블록과 문맥 교환  (0) 2023.10.16
멀티 프로세싱  (4) 2023.10.16
CPU와 메모리  (0) 2023.10.12
컴퓨터의 기본 구성  (0) 2023.10.10
운영체제의 구성  (0) 2023.09.21