기억장치
컴퓨터의 기억장치는 중앙처리장치 내부의 레지스터, 중앙처리장치와 직접 버스로 연결되는 주기억장치, 그리고 입출력 장치로 연결되는 보조기억장치로 구성되어 있습니다.
컴퓨터의 주기억장치(Main memory)은 주로 전원이 켜져 있을 때 실행하는 프로그램과 데이터를 저장하고, 보조기억장치(Auxiliary storage)는 영구적으로 프로그램과 데이터를 저장합니다.
주기억장치는 중앙처리장치와 온라인으로 연결되고, 보조기억장치는 오프라인으로 연결됩니다.
온라인 연결은 중앙처리장치가 필요할 때 항상 사용할 수 있다는 의미이고, 오프라인은 별도의 연결 과정을 거친 후 사용할 수 있다는 의미입니다.
레지스터는 주기억장치의 내용을 필요에 따라 임시로 중앙처리장치 안에 저장하는 용도로 사용됩니다.
주기억장치(Main memory)
주기억장치는 ROM(Read Only Memory)과 RAM(Random Access Memory)으로 구성됩니다.
ROM은 그 안에 저장된 데이터를 읽기만 가능하고, 지우거나 다른 값으로 갱신할 수 없는 기억 소자입니다.
전원이 제거되더라도, ROM에 저장된 데이터를 그대로 유지됩니다.
전원이 인가될 때, 처음으로 실행하는 프로그램인 부트로더를 저장하는 용도로 ROM을 사용합니다.
(부트로더는 시스템 스택을 설정, 서비스 루틴을 기억 장치에 적재, 인터럽트 벡터 설정 등의 역할을 수행합니다.)
반면, RAM에 저장된 데이터를 읽고 쓰기가 가능하며, 전원이 제거되면 RAM의 내용이 모두 지워집니다.
컴퓨터는 보조 기억장치에 있는 프로그램을 RAM으로 복사한 후, RAM에서 실행합니다.
휘발성 | 비휘발성 | 삭제 가능 | 삭제 불가능 |
RAM | ROM, 보조기억장치 | RAM, 보조기억장치 | ROM |
보조기억장치
보조기억장치는 프로그램과 데이터를 영구적으로 보관할 목적으로 사용되는 입출력 장치입니다.
중앙처리장치는 보조기억장치에 저장되어있는 데이터를 주기억장치로 옮겨놓고 사용합니다.
종류로는 플로피 디스크, 하드 디스크, SSD, 마그네틱 테이프, CD-ROM 등이 있습니다.
보조기억장치는 컴퓨터와 오프라인으로 연결되어 있으므로,
중앙처리장치가 필요할 때 즉시 보조기억장치의 데이터를 엑세스 할 수 없습니다.
컴퓨터는 입출력 장치를 연결하는 방식으로 보조기억장치를 엑세스하며, 한 번 연결하여 적은 양의 데이터를 송수신하는 것은 전체적인 성능이 낮아지는 요인이 됩니다.
따라서, 컴퓨터는 주기억장치에 많은 양의 데이터를 모아 두었다가 한 번에 보조기억장치로 전송하고, 보조기억장치에서 많은 양의 데이터를 읽어 주기억장치로 저장해두고 필요한 데이터를 가져옵니다.
(⚠️ 컴퓨터와 보조기억장치 간에 데이터를 전송하는 단위를 블록(block)이라고 합니다.)
블록의 크기는 보조기억장치의 용량 증가와 함께 1K 바이트, 2K 바이트, 4K 바이트로 점점 증가하는 추세입니다.
엑세스 방법
엑세스 방법에는 순차 엑세스, 직접 엑세스, 임의 엑세스, 연관 엑세스 방법 등이 있습니다.
여기서는 순차/직접/임의 엑세스만 간단히 설명하고 넘어가겠습니다.
- 순차 엑세스(Sequential access) :
- 일렬로 저장된 데이터를 처음부터 차례대로 엑세스하는 방식
- 필요한 데이터가 저장된 위치에 따라 엑세스 시간이 달라짐. (ex. 자기 테이프)
- 직접 엑세스(Direct access) :
- 기억장치의 임의 위치로 디스크 헤드를 이동시켜 엑세스하는 방식
- 디스크 헤드가 이동하는 시간에따라 엑세스 시간이 달라짐
- 임의 엑세스(Random access)
- 주소에 의하여 데이터를 엑세스하는 방식
- 기억장치의 임의 위치를 엑세스하는 시간이 같음
- 각 기억장치의 위치마다 고유의 주소가 할당되어 있으며,
RAM도 임의 엑세스 방식을 사용
기억장치 계층
컴퓨터의 기억장치는 용량이 크고, 속도가 빠르고, 가격이 저렴할수록 좋습니다.
하지만, 이 세 가지 특징은 상반되는 특징을 갖고 있습니다.
(속도가 빨라지면, 가격이 ⬆️, 용량이 커지면, 가격이 ⬆️)
컴퓨터는 기억장치를 빠르게 엑세스 하면서도, 많은 용량을 사용하기 위해서 기억장치를 계층적으로 구성하여 운영하고 있습니다.
윗 계층일수록 중앙처리장치의 사용 빈도가 증가하고, 엑세스 시간이 짧고, 용량이 적고, 비트당 가격이 비쌉니다.
컴퓨터는 속도가 느리고, 용량이 큰 기억장치의 내용 중에서 중앙처리장치가 자주 사용하는 데이터를 속도가 빠른 기억장치로 옮겨 놓고 사용함으로써, 전체적인 기억장치 엑세스 속도를 개선하는 전략을 사용합니다.
디스크 캐시
보조기억장치와 데이터를 주고 받기 위해서 디스크 캐시를 사용하기도 합니다.
디스크 캐시는 주기억장치 혹은 보조기억장치에 존재할 수 있으며, 일반적으로 두 개의 장치 모두 디스크 캐시를 포함하고 있습니다.
아래는 응용 프로그램이 데이터를 디스크의 파일로 전송하는 과정입니다.
- 응용 프로그램은 디스크에 대한 파일 출력을 운영체제에게 요청
- 운영체제는 파일에 기록할 데이터를 주기억장치에 마련되어 있는 디스크 캐시로 저장하고, 응용 프로그램에게 데이터 전송이 완료되었음을 알림
- 운영체제는 한 개의 블록에 대한 데이터가 디스크 캐시에 모일 때까지 기다렸다가, 블록이 채워지면, 적절한 시간에 보조기억장치로 한 개의 블록을 전송, 이때 보조기억장치는 자신의 디스크 캐시에 데이터를 저장하고, 운영체제에게 디스크 기록이 완료되었다고 보고
- 디스크는 컴퓨터 시스템과 독립적으로 동작하는 입출력 장치이므로, 디스크 캐시의 데이터를 안전한 시간에 디스크로 기록
디스크 캐시의 운영은 전적으로 운영체제가 관리합니다.
캐시기억장치
프로그램 내장형 컴퓨터는 프로그램과 데이터를 주기억장치에 저장해두고, 명령어를 하나씩 중앙처리장치로 인출하여 실행합니다.
이러한 구조는 폰 노이만이 처음으로 제안하였으며,
주기억장치를 프로그램 기억장치와 데이터 기억장치로 분리하여, 명령어와 데이터를 동시에 엑세스하여, 기억장치 엑세스 속도를 개선한 하버드 구조도 있습니다.
문제는 주기억장치의 엑세스 속도가 중앙처리장치보다 4 ~ 10배 느리다는 것입니다.
중앙처리장치는 주기억장치에서 명령어나 데이터를 인출하기 위해서 긴 시간 동안 대기해야합니다.
이러한 문제점을 해결하기 위해 캐시 기억장치를 사용합니다.
중앙처리장치와 주기억장치 사이에 존재하는 캐시 기억장치는 용량은 적지만, 엑세스 속도는 레지스터의 속도와 같거나 조금 느립니다.
중앙처리장치가 주기억장치를 엑세스하려고 기억장치 주소를 생성하면, 캐시 제어기는 해당 주소를 포함하는 여러 개 또는 수십 개의 데이터를 한 번에 캐시 기억장치로 옮겨 놓고, 그곳에서 데이터를 엑세스하도록 만듭니다.
참조의 지역성
프로세스는 프로그램을 수행할 때 기억장치의 특정 부분을 집중적으로 참조하는 경향이 있습니다.
이러한 특성을 참조의 지역성이라고 하며, 이것이 캐시 도입으로 기억장치의 엑세스 속도를 개선할 수 있는 이유입니다.
참조의 지역성은 공간적 참조의 지역성과 시간적 참조의 지역성으로 구분됩니다.
- 공간적 참조의 지역성
- 인접한 영역의 명령어 또는 데이터가 다음 번에도 계속 참조될 가능성이 큰 것을 의미
- 아래의 경우 hit할 가능성이 높음
- 현재 실행 중인 명령어의 다음 명령어를 수행
- 루프를 실행
- 함수 호출 (함수 안에서는 지역 변수를 많이 사용하는데, 지역 변수는 스택과 같은 일정한 영역에 집중적으로 배치됨)
- 시간적 참조의 지역성
- 한번 사용된 프로그램이 일정한 시간 내에 다시 참조될 가능성이 크다는 의미
- 프로그램 코드는 한 번 사용한 데이터를 여러 번 사용하는 경향이 있고, 함수에서 복귀하면, 원래 수행하던 코드 영역을 다시 수행할 가능성이 높음
따라서, 참조의 지역성을 고려할 때, 주기억장치에서 캐시 기억장치로 옮겨온 데이터를 중앙처리장치가 여러번 사용할 가능성이 큽니다.
퀵소트는 시간 복잡도 면에서 빠른 것도 있지만, 배열 안에서 자리 바꿈으로 처리가 되기 때문에 적중률이 높아서 속도가 빠른 이유도 있습니다.
또한, 해시 충돌 회피 방법으로, Open Addressing 방식에서 n칸 옆의 슬롯을 검사하는 LInear probing의 경우 인접한 영역을 확인하기 때문에 적중률이 높습니다. 다만, 데이터가 밀집 저장되는 클러스터링 문제가 발생할 수 있습니다.
충돌 발생 시, 이동할 칸의 수를 새로운 해시 함수로 계산하는 Double Hashing 방식은 클러스터링을 효과적으로 회피할 수 있지만, 적중률이 매우 낮습니다.
컴퓨터 시스템은 아래와 같은 방식으로 캐시를 활용합니다.
- 중앙처리장치가 기억장치를 엑세스하려고 주소를 생성한다.
- 중앙처리 장치가 요청한 데이터가 캐시 안에 존재한다면, 중앙처리장치는 캐시 안에서 데이터를 가져온다.
- 만일 데이터가 캐시 안에 존재하지 않는다면, 주기억장치에서 중앙처리장치가 원하는 데이터를 포함한 데이터 블록을 캐시로 복사한 후, 캐시에서 해당 단어를 중앙처리장치로 전송한다.
중앙처리장치가 요청한 데이터가 캐시에 들어 있는 것을 "적중하였다(hit)"라고 말하고, 존재하지 않는 것을 "실패하였다(miss)"라고 말합니다.
또한, 적중률은 중앙처리장치의 기억장치에 대한 전체 요청 수에 대하여 적중한 수를 퍼센트로 표현한 척도로, 실제로 95 ~ 99%로 측정됩니다.
적중률에 의하여 캐시를 도입함으로써 기억장치 엑세스 속도가 얼마나 개선되었는지 계산할 수 있으며, 적중률은 응용 프로그램의 지역성에 의하여 결정됩니다. 데이터베이스 같은 경우 캐시 적중률이 낮으며, 신호처리 프로그램의 경우 캐시 적중률이 높은 것으로 알려져 있습니다.
주기억장치와 캐시 간에는 여러 개의 단어로 구성된 블록 단위로 데이터를 전송하며, 일반적으로 주기억장치의 데이터 전송 단위를 블록block)이라고 부르고, 캐시의 전송 단위를 라인(line) 또는 슬롯(slot)이라고 부릅니다.
주기억장치의 블록 크기와 캐시의 라인 크기를 서로 다르게 설정할 수 있으나, 일반적으로 같게 설정합니다.
계층적 캐시
최근에는 마이크로프로세서 칩 내부에 캐시를 포함함으로써, 두 레벨의 캐시를 사용하기도 합니다.
(⚠️ 마이크로프로세서는 중앙처리장치의 기능을 하나의 칩 안에 내장한 소자, 작은 칩안에 중앙처리장치를 구현했다는 의미로 Micro 사용)
칩 내부에 포함된 캐시를 온 칩(on-chip) 캐시 또는 레벨1 캐시라고 부르고, 칩 외부의 캐시를 오프 칩(off-chip) 캐시 또는 레벨 2 캐시라고 부릅니다.
레벨 2 캐시는 엑세스 속도 면에서 레벨 1 캐시보다 느리고, 주기억장치보다 빠르며, 용량 면에서는 레벨1 캐시보다 많습니다.
교체 정책
캐시 실패(miss)가 발생할 때, 주기억장치에서 새로 가져온 블록은 기존 캐시에 저장된 라인 중 하나와 교체되어야 합니다.
여러 개의 캐시 라인 중에서 어느 것을 선택하는 지 결정하는 방법을 교체 정책이라고 합니다.
교체 정책을 선택할 때의 기준은 적중률을 높게 유지하는 것입니다.
또한, 캐시의 목적이 기억장치의 엑세스 속도를 빠르게 하기 위함이므로, 캐시 교체 정책은 하드웨어로 구현되어야 합니다.
가장 이상적인 교체 정책은 교체 대상인 캐시 라인 중에서 향후 가장 오랫동안 사용하지 않은 라인을 선택하는 것이지만,
가장 오랫동안 사용하지 않을지는 미래의 일이기 때문에 현실적으로 구현이 불가능합니다.
- LRU(Least Recently Used)
- 현재부터 과거로 볼때, 가장 오래 전에 사용하였던 라인을 선택하여 교체
- 한동안 사용하지 않았기 때문에 앞으로도 사용할 가능성이 적다는 추정에 근거한 방법
- 우수한 적중률을 유지
- 캐시 라인마다 사용한 시기를 기록하는
USE 카운터를 둔다. - 캐시 라인을 엑세스할 때마다, 해당 라인의 USE 카운터를 0으로 만들고, 다른 라인의 USE 카운터를 증가
- 대상 라인 중에서 USE 카운터의 값이 가장 큰 라인을 선택
- FIFO(First-In-First-Out)
- 캐시 안에 가장 오랫동안 존재했던 라인을 교체
- 가장 오래된 라인이더라도 자주 사용될 가능성이 있으므로, 적중률 면에서 높은 효율을 보이지 않는 것으로 알려짐
- 캐시 라인에 새 블록이 들어올 때, USE 카운터를 0으로 만들고, 다른 라인의 USE 카운터를 증가
- 교체할 때, 대상 라인 중에서 USE 카운터 값이 가장 큰 라인을 선택
- LFU (Least Frequency Used)
- 사용 횟수가 가장 적은 라인을 교체
- 최근 캐시에 들어온 라인이 교체 대상으로 선택될 가능성이 있다는 단점이 있음
- 새로운 블록이 캐시에 들어올 때마다 USE 카운터를 0으로 만들고, 사용될 때마다 USE 카운터를 증가시킴으로써 구현
- Random
- 임의로 교체할 라인을 선택
- 제법 효율이 좋음
쓰기 정책
기억장치에 대한 쓰기는 궁극적으로 주기억장치에 데이터가 기록되어야 합니다.
쓰기 정책은 캐시와 주기억장치에 대한 쓰기 동작을 처리하는 방법을 규정하며, write-through, write-back 정책이 있습니다.
- Write-through
- 쓰기 정책이 수행될 때마다 캐시 라인의 해당 단어와 주기억장치의 단어를 모두 수정하는 방법
- 주기억장치는 항상 유효한 데이터를 보관하게 됨
- 항상 캐시와 주기억장치의 내용을 같게 유지할 수 있으며, 캐시 라인을 교체할 때 주기억장치의 블록을 선택된 캐시 라인으로 복사하면 된다는 장점이 있다.
- 하지만, 주기억장치를 엑세스하는 횟수가 증가하여 전체적인 개선 속도가 느려지는 단점이 있다.
- Write-back
- 쓰기 동작이 수행될 때, 일단 캐시 라인의 단어만을 수정하고, 주기억장치의 단어를 수정하지 않음
- 대신 캐시 라인이 변경될 때마다, 해당 라인이 수정되었다고 표시
- 이 정보를
dirty 비트라고 한다. - 나중에 dirty 비트가 세트되어 있는 캐시 라인을 교체할 때, 해당 라인 전체를 주기억장치 블록으로 복사한 다음, 새로운 블록을 가져온다.
- Write-through 정책보다는 기억장치 엑세스 속도가 빠르다는 것이 장점이지만, 주기억장치와 캐시의 내용이 일치하지 않는 순간이 존재한다는 것이 주요 단점이다.
프로세스, 프로세서, 코어
프로세스(Process)는 실행중인 프로그램을 의미하며, 프로세서(Processor)는 현재는 CPU와 혼용되어 사용되고 있습니다.
코어(Core)는 프로세서의 주요 구성 요소입니다.
프로그램의 명령을 읽고 수행하는 독립적인 처리 장치로, 프로세서가 하는 일을 분담하여 처리합니다.
코어는 메모리에서 명령을 가져오거나 실행하며, 하나의 프로세서는 여러 개의 코어를 가질 수 있습니다.
프로세서 | Core |
컴퓨터 내의 전자 회로 | 프로세서 내의 전자 회로 |
컴퓨터에 여러 개의 프로세서가 있을 수 있다. | 프로세서에 여러 개의 코어(Core)가 있을 수 있다 |
일관성 유지
중앙처리장치 이외에 입출력장치도 DMA 방식으로 기억장치에 엑세스할 수 있으며,
한 개의 컴퓨터에 여러 개의 프로세스를 탑재한 멀티 프로세서 시스템인 경우, 프로세서마다 독립적으로 기억장치에 엑세스 합니다.
이런 환경에서 캐시 장치를 운영할 때, 다음과 같은 문제점이 발생할 수 있습니다.
- 주기억장치의 한 개의 블록이 여러 개의 캐시에 복사될 수 있다. 만일 프로세서 중 하나가 데이터를 자신의 캐시에 기록하면 같은 블록을 복사해 갖고 있는 프로세서의 캐시 라인은 틀린 값을 갖게 된다.
- 만일 입출력 장치가 주기억장치에 데이터를 직접 기록하는 경우, 해당 데이터가 포함된 블록을 복사하고 있는 캐시 라인은 틀린 값을 갖게 된다.
캐시와 주기억장치의 내용이 일치하지 않는 상태를 무효 상태(Invalid state)라고 하고, 캐시와 주기억장치의 내용이 같도록 유지하는 문제를 일관성 유지(coherence)라고 합니다.
- 캐시 불가능 영역 지정
- 여러 개의 프로세서들이 동시에 사용하는 주기억장치의 데이터 영역을 캐시로 들어가지 않도록 지정
- 버스 감시 :
- 각 프로세서의 캐시 제어기는 시스템 버스에서 데이터 쓰기가 발생하는 것을 감시.
- 만일 자신의 캐시가 새로 갱신되는 기억장치 블록을 저장하고 있다면, 해당 라인을 무효화
Write-through정책을 채택하는 경우, 이 방법을 주로 사용
- 동시 갱신
- 주기억장치의 데이터를 수정할 때 , 모든 캐시의 내용을 모두 수정
질문
- 데이터 베이스의 캐시 적중률이 낮은 이유는?
출처
- 한 눈에 보이는 컴퓨터 구조, 9장 기억장치(생능출판사, 전중남)
- 프로세서(Processor), 코어(Core), 쓰레드(Thread)
- CPU, 프로세서, 코어는 어떤 연관성과 차이점이 있을까?
'스터디' 카테고리의 다른 글
데코레이터 패턴(Decorator Pattern)이란? (0) | 2023.04.04 |
---|---|
22.11.15 SSAFY 스터디 CS 발표 - 디자인 패턴 (전략 패턴) (0) | 2022.12.01 |
22.11.8 SSAFY 스터디 CS 발표 - 디자인 패턴 (템플릿 메서드 패턴) (0) | 2022.11.07 |
22.09.22 SSAFY 스터디 CS 발표 - 컴퓨터 구조 (0) | 2022.09.22 |
22.08.18 SSAFY 스터디 CS 발표 - Java 어셈블리어 분석 (0) | 2022.08.16 |