컴퓨터 부품들은 `클럭 신호`에 맞춰 동작한다.
CPU는 `명령어 사이클`이라는 정해진 흐름에 맞춰 명령어들을 실행한다.
그렇다면 `클럭 신호`가 빠르게 반복되면 CPU를 포함한 컴퓨터 부품들은 그만큼 빠르게 동작할까?
기본적으로는 그렇겠지만, 필요 이상으로 클럭을 높이면 오히려 발열이 심각해진다.
💡용어 정리
클럭 속도
`Hz` 단위로 측정
`Hz`는 1초에 클럭이 반복되는 횟수 = 1초에 100번 반복되면 100Hz
그렇다면, 클럭 속도를 높이는 것 외의 방법은 없을까?
- 코어 수: 듀얼 코어, 멀티 코어, ...
- 스레드 수: 멀티 스레드, ...
💡용어 정리
코어(Core)
: 명령어를 실행하는 부품
CPU 내에서 명령어를 실행하는 부품으로 여러 개 있을 수 있음
*멀티코어 프로세서: 여러 개의 코어를 포함하고 있는 CPU
코어 수 프로세서 명칭 1 싱글코어(single-core) 2 듀얼코어(dual-core) 3 트리플코어(triple-core) 4 쿼드코어(quad-core) 6 헥사코어(hexa-core) 8 옥타코어(octa-core) 10 데카코어(deca-core) 12 도데카코어(dodeca-core)
그렇다면 코어를 늘리면 연산 속도도 그에 비례할까요?
조별과제를 생각하면 쉬워요... 사람이 많아진다고 빠르게 일을 마무리할 수 있는 건 아니잖아요... 코어도 그렇습니다.
스레드
: 실행 흐름의 단위
- 하드웨어적 스레드: 하나의 코어가 동시에 처리하는 명령어 단위
- 소프트웨어적 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위
ex) 입력받은 내용을 화면에 보여주는 기능, 맞춤법 검사, 수시로 저장 등
1코어 1스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있음
명령어 파이프라인
`명령어 인출` - `명령어 해석` - `명령어 실행` - `결과 저장`
각 단계가 겹치지 않는다면 CPU는 각 단계를 동시 실행 가능
이렇게만 보면 잘 이해되지 않을 수 있어요.
그래서 각 단계가 1시간씩만 소요된다고 가정해봅시다.
1시간씩 4단계를 거치니, 명령어 파이프라인을 사용하지 않을 경우, 4단계 1세트를 실행하려면 4시간이 소요되겠죠.
명령어 파이프라인을 사용하면 각 단계가 겹치지만 않으면 돼요.
그러면
인출 | 해석 | 실행 | 저장 | |||
인출 | 해석 | 실행 | 저장 | |||
인출 | 해석 | 실행 | 저장 | |||
인출 | 해석 | 실행 | 저장 |
이런 식으로 실행할 수 있게 되겠죠.
이러면 `명령어 파이프라인` 정말 좋네! 라고만 생각할 수 있는데 이 친구들이 성능 향상에 실패하는 경우가 존재합니다.
명령어 파이프라인 위험
- 데이터 위험: 명령어 간의 의존성에 의해 야기
- 제어 위험: 프로그램 카운터의 갑작스런 변화
- 구조적 위험: 서로 다른 명령어가 같은 CPU 부품(ALU, Register)를 쓰려 할 때
`데이터 위험`의 경우, 이전 명령어를 끝까지 실행해야만 다음 명령어를 실행할 수 있는 경우가 있잖아요.
예를 들어,
R2 레지스터 값과 R3 레지스터 값이 있고 이 값을 더한 것을 R1 레지스터에 저장해요.
그리고 저장된 R1 레지스터 값과 R5 레지스터 값을 더해서 R4 레지스터에 저장하는 식으로 앞선 명령어가 실행된 뒤에 실행되는 경우는 명령어 파이프라인이 오히려 위험할 수 있어요.
`제어 위험`의 경우는 1번째 명령어를 동작시켜 실행까지 가는데 실행해보니까 변경해야 할 사항이 있다거나 하는 경우에는 2번째, 3번째 명령어가 앞 단계(인출, 해석 등)를 동작하고 있다고 해도 쓰지 못하게 됩니다.
`구조적 위험`의 경우는 ALU만 봐도 쉽게 상상할 수 있어요.
다른 계산을 하는데 하나의 계산기로 동시에 실행되면 당연히 제대로 동작한다고 말할 수는 없겠죠?
슈퍼스칼라
: CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조( = `멀티스레드 프로세서`)
쉽게 상상해서, 컨베이어 벨트를 여러 개 쓴다고 생각하면 됩니다.
이론적으로는 파이프라인 개수에 비례해 처리 속도가 증가해야 하는데, 우리 앞서 본 위험들이 있죠.
파이프라인 위험도의 증가를 원인으로 파이프라인 개수에 비례해 처리 속도가 증가하지는 않아요.
지금까지는 모두 순차적으로 명령어를 처리하는 방식이었습니다.
서로 의존하는 친구들이기 때문에 그랬는데, 서로 의존도가 없는 경우, `비순차적 명령어 처리` 즉, 합법적으로 새치기가 가능합니다.
그렇게 해도 의존도가 없으니 전체 프로그램 실행 흐름에 영향이 없기 때문이에요.
명령어 집합
: CPU가 이해할 수 있는 명령어들의 모음
즉, CPU의 언어
어떤 언어를 쓰느냐에 따라 어떻게 더 편하게 동작하도록 할지를 정한 약속을 ISA
CISC(Complex Instruction Set Computer) | RISC(Reduced Instruction Set Computer) |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어의 수가 적음 | 프로그램을 이루는 명령어의 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝 어려움 | 파이프라이닝 쉬움 |
RAM
주기억장치인 RAM은 `휘발성 저장 장치`
보조기억장치에 저장된 것들을 RAM(주기억장치)이 가져와서 CPU에 전달해주는 것
DRAM(Dynamic RAM)
저장된 데이터가 동적으로 사라지는 RAM
데이터 소멸을 막기 위해서 주기적으로 재활성화 해야 함
일반적으로 메모리로 사용됨 = 상대적으로 소비전력 낮고 집적도가 높아 대용량으로 설계하기 용이
SRAM(Static RAM)
저장된 데이터가 사라지지 않는(정적인) RAM
DRAM보다 일반적으로 더 빠름
일반적으로 캐시 메모리에서 사용됨 = 상대적으로 소비전력 높고 집적도 낮아 대용량 설계보다는 속도가 빨라야 하는 장치에 사용
SDRAM(Synchronous DRAM)
특별한 DRAM
클럭 신호와 동기화된 DRAM
DDR SDRAM(Double Data Rate SDRAM)
특별한 SDRAM
최근 가장 대중적으로 사용됨
대역폭을 넓혀 속도를 빠르게 만드는 SDRAM
💡용어 정리
대역폭
: 데이터를 주고 받는 길의 너비
일방통행길과 4차선 도로의 차이를 생각하면 쉽다.
주소
메모리에 저장된 값들은 계속해서 변화함
새롭게 실행되는 프로그램이 새롭게 메모리에 들어가고 실행이 끝난 프로그램은 메모리에서 삭제되기 때문에 같은 프로그램을 실행해도 실행할 때마다 주소가 달라짐
그래서 CPU와 실행 중인 프로그램이 현재 메모리 몇 번지에 무엇이 저장되어 있는지 다 알 수 없다.
- 물리 주소: 메모리 입장에서 바라본 주소, 정보가 실제로 저장된 하드웨어상의 주소
- 논리 주소: CPU와 실행 중인 프로그램 입장에서 바라본 주소, 각각에게 부여된 0번지부터 시작하는 주소
인터넷 브라우저, 게임, 메모장이 켜져 있다고 할 때
인터넷 브라우저의 0번지, 게임의 0번지, 메모장의 0번지가 다 따로 있는 것이 논리 주소이고
이 모든 것을 하나에 모아 인터넷 브라우저는 4번지, 게임은 7번지, 메모장은 15번지와 같이 겹치지 않도록 되는 것이 물리 주소이다.
물리 주소와 논리 주소를 변환해주는 하드웨어인 `MMU`(메모리 관리 장치)가 그래서 존재한다.
`MMU`는 논리 주소와 베이스 레지스터(프로그램 원래 주소) 값을 더해 논리 주소를 물리 주소로 변환한다.
프로그램이 여러 개 돌아가고 있고, CPU에서 다른 프로그램의 영역을 침범할 수 있는 명령어를 실행할 때, 이를 막아주는 것을 `메모리 보호`라고 한다.
이를 한계 레지스터가 도와주고 있다.
한계 레지스터: 논리 주소의 최대 크기 저장
베이스 레지스터 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값
이전 포스팅에서 메인보드에는 시스템 버스가 운영되고 있다고 했잖아요.
당연히 거리가 멀면 버스로 이동하는 시간이 많아질테니 느릴테고 가까우면 빠르겠죠?
그래서, CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느립니다.
속도가 빠른 저장 장치는 저장 용량은 작고 가격은 비싸죠.
이번에는 저장 장치에 대해 알아봅시다.
저장 장치 계층 구조
저장 장치 계층 구조 | 속도 | 용량 | 가격 |
레지스터 | 빠름 | 작음 | 비쌈 |
캐시 메모리 | 조금 빠름 | 조금 작음 | 조금 비쌈 |
메모리 | 중간 | 중간 | 중간 |
보조기억장치 | 느림 | 큼 | 저렴 |
캐시 메모리
CPU와 메모리 사이에 위치한 SRAM 기반의 저장 장치
CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생
CPU = 집, 캐시 메모리 = 편의점, 메모리 = 대형 마트 라고 생각해보자.
집에서 물건을 사러 갈 때, 원래는 멀리 있는 대형 마트에 매번 갔어야 했는데, 편의점이 생겨나고 필요한 것들이 편의점에도 생기니 가까이에 있는 편의점에 방문해 물건을 사게 된 것을 생각하면 좀 더 이해가 쉽다.
캐시 메모리는 L1, L2, L3와 같은 계층이 캐시 내부에서 형성되어 있고, 이도 마찬가지로 L1부터 L3로 갈수록 속도가 느려진다.
여기서 우리가 주목해야 할 점은 캐시 메모리도 메모리보다는 용량이 작다는 점이다. 그렇기에 당연하게도 모든 내용을 저장할 수는 없다. 그래서 캐시 메모리에는 CPU가 자주 사용할 법한 내용을 예측해 저장한다.
예측이 들어맞으면 `캐시 히트`, 예측이 틀리면 `캐시 미스`라고 한다.
캐시 적중률 = 캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)
그렇다면 이 예측은 어떻게 하는 것일까?
참조 지역성의 원리
CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리
- 최근 접했던 메모리 공간에 다시 접근하려는 경향
- 접근한 메모리 공간 근처를 접근하려는 경향(공간 지역성)
하드디스크
- 구성: 스핀들, 플래터, 디스크 암, 헤드
- 저장 단위: (플래터에서) track, sector 단위로 데이터 저장
같은 track이 위치한 곳을 모아 연결한 논리적 단위를 cylinder라고 한다.
연속된 정보는 이 실린더에 기록된다.
- 데이터 접근 과정
- 탐색 시간(seek time): 접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간
- 회전 지연(rotational latency): 헤더가 있는 곳으로 플래터를 회전시키는 시간
- 전송 시간(transfer time): 하드 디스크와 컴퓨터 간 데이터를 전송하는 시간
플래시 메모리
- 저장 단위: cell 단위로 데이터 저장
1셀에 1비트 저장: SLC
1셀에 2비트 저장: MLC
1셀에 3비트 저장: TLC
1셀에 4비트 저장: QLC
* 1셀을 1집이라고 생각하고 1비트를 1사람이라고 생각하면 쉽다.
구분 | SLC | MLC | TLC |
cell당 bit | 1bit | 2bit | 3bit |
수명 | 길다 | 중간 | 짧다 |
읽기/쓰기 속도 | 빠름 | 중간 | 느림 |
용량 대비 가격 | 비쌈 | 중간 | 쌈 |
셀이 모여 MB, GB, TB 저장 장치가 됨
셀이 모여 page - page 모여 block - block 모여 plane - plane 모여 die
읽기/쓰기 단위: 페이지
삭제 단위: 블록
페이지의 상태
- Free: 어떤 데이터도 저장 X, 새로운 데이터 저장 가능
- Valid: 이미 유효한 데이터 저장하고 있음
- Invalid: 유효하지 않은 데이터를 저장하고 있음
RAID(Redundant Array of Independent Disks)
: 하드디스크와 SSD로 사용하는 기술
: 데이터의 안전성 || 높은 성능을 위해 여러 물리적 보조기억장치를 마치 하나의 논리적 보조기억장치처럼 사용
ex) 1TB 5개를 묶어 5TB 1개의 장치로 사용하는 것
RAID 레벨
- RAID 0
데이터를 단순히 나누어 저장
각 하드디스크는 번갈아가며 데이터 저장, 저장되는 데이터가 하드디스크 개수만큼 나뉘어 저장
stripe: 줄무늬처럼 분산되어 저장된 데이터
striping: 분산하여 저장하는 것
- 장점: 입출력 속도 향상
- 단점: 저장된 정보 안전 X
- RAID 1
데이터를 쓸 때 원본과 복사본 2군데에 씀(쓰기 속도 느림)
mirroring: 복사본을 만드는 방식
- 장점: 저장된 정보 안전
- 단점: 하드디스크 개수가 한정되었을 때 사용 가능한 용량 적음 = 비용 증가로 이어질 수 있음
- RAID 4
RAID 1처럼 완전한 복사본을 만드는 대신 오류를 검출하고 복구하기 위한 정보(패리티 비트) 저장
패리티를 저장한 장치를 이용해 다른 장치의 오류 검출, 오류 있으면 복구
- 단점: 패리티 디스크의 병목
- RAID 5
패리티 정보를 분산해 저장
- RAID 6
두 종류의 패리티(오류를 검출, 복구 수단)
- 단점: 5보다 안전하지만 쓰기는 느림
이제 입출력장치에 대해 알아볼 차례다.
입출력 장치는 `장치 컨트롤러`를 통해 컴퓨터 내부와 정보를 주고 받는다.
`장치 컨트롤러의 역할`
- CPU와 입출력 장치 간의 일종의 번역가 역할 수행
- 오류 검출
- 데이터 버퍼링
: 전송률이 높은 장치와 낮은 장치 사이에서 주고 받은 데이터를 `버퍼`라는 임시 저장 공간에 저장해 전송률을 비슷하게 맞추는 것
`장치 드라이버`
: 컴퓨터/운영체제가 연결된 장치의 드라이버를 인식하고 실행할 수 있으면 컴퓨터 내부와 정보를 주고 받을 수 있음
반대로 없으면 정보 주고 받을 수 없음
'CS' 카테고리의 다른 글
RESTful API (0) | 2024.08.17 |
---|---|
해시 테이블(Hash Table), 해시 맵(Hash Map) (2) | 2024.08.16 |
[혼자 공부하는 컴퓨터 구조+운영체제]01 (0) | 2024.08.15 |