말록 설명하기에는 내가 아직 말록에 대한 지식이 부족한것 같다.
정리를 잘한 동기의 주소를 첨부한다.
https://wonyoung2257.tistory.com/87
그런 사람 없겠지만, 나의 코드가 궁금한 사람을 위해 링크를 남겨놓겠다.
https://github.com/dbsgur/malloc-lab/blob/main/mm.c
주소 번역
주소번역은 N-원소 가상주소공간 (VAS : virtual address space)와 M-원소 물리 주소 공간(PAS : Pysical Address Space)의 원소들간의 매핑이다.
PTBR(Page Table Base Register)은 현재 페이지 테이블을 가리킨다.
n비트 가상 주소는 두개의 컴포넌트를 가진다. : p비트 가상 페이지 오프셋(VPO:Virtual Page Offset)과 n-p 비트 가상 페이지 번호 (VPN : Virtual Page Number).
MMU는 VPN을 사용해서 적합한 PTE를 선택한다.
CPU 하드웨어가 페이지 적중이 있을 때 수행하는 단계
1 ) 프로세서는 가상주소를 생성하고 이것을 MMU로 보낸다.
2 ) MMU는 PTE 주소를 생성하고 이것을 캐시/메인 메모리에 요청한다.
3 ) 캐시/메인 메모리는 PTE를 MMU로 리턴한다.
4 ) MMU는 물리주소를 구성하고 이것을 캐시/메인 메모리로 보낸다.
5 ) 캐시/메인 메모리는 요청한 데이터 워드를 프로세서로 보낸다.
페이지 오류를 처리하는 것은 하드웨어와 운영체제 커널과의 협력을 필요로 한다.
1~3 단계는 위와 동일
4 ) PTE 유효비트는 0이므로 MMU는 예외를 발생시키고 CPU 내의 제어를 운영체제 커널의 페이지 오류 예외 핸들러로 이동시킨다.
5 ) 오류 핸들러는 물리 메모리 내의 희생자 페이지를 결정하고 만일 이 페이지가 수정되었다면 디스크로 페이지를 이동한다.
6 ) 오류 핸들러는 새 페이지를 페이지 이동해서 들여오고, 메모리 내의 PTE를 갱신한다.
7 ) 오류 핸들러는 처음의 프로세스로 돌아가고, 오류 인스트럭션은 재시작된다.
CPU는 문제를 일으킨 가상주소를 MMU로 다시 전송한다.
이 가상페이지는 이제 물리 메모리 내에 캐시되어 있으므로 적중이 발생하고 MMU가 단계들을 수행한 후에 메인 메모리는 요청한 워드를 프로세서로 넘겨준다.
TLB를 사용한 주소 번역 속도와 개선
CPU가 가상 주소를 생성할 때마다 MMU는 가상주소를 물리주소로 번역하기 위해서 PTE를 참조해야한다.
적은 비용이지만 비용이 들기 때문에, 많은 시스템들은 이 비용마저도 MMU내에 번역 참조 버퍼(TLB: Translation Lookaside Buffer)라고 부르는 작은 캐시를 포함해서 제거하려고 한다.
TLB는 작은 가상주소 지정 캐시로, 각 라인은 하나의 PTE로 구성된 하나의 블록을 저장한다.
TLB는 대게 높은 수준의 결합성을 가진다.
집합 선택과 라인 매칭을 위해 사용되는 Index와 tag필드는 가상주소 내의 가상페이지 번호에서 추출된다.
TLB 적중시 단계
1 ) CPU는 가상주소를 생성한다.
2, 3 ) MMU는 적당한 PTE를 TLB로부터 선입한다.
4 ) MMU는 가상주소를 물리 주소로 번역하고, 그것을 캐시/메인 메모리로 전송한다.
5 ) 캐시/메인 메모리는 요청한 데이터 워드를 CPU로 리턴한다.
여기서 핵심은 모든 주소 번역 단계들이 온칩(on-chip) MMU내에서 수행되기 때문에 매우 빠르다는 것이다.
TLB 미스가 발생하면 MMU는 PTE를 L1 캐시에서 선입해야 한다.
새롭게 선입한 PTE는 TLB에 저장되며 기존의 엔트리를 지울 수도 있다.
메모리 계층 구조
CPU 레지스터들은 가장 자주 이용하는 데이터를 보관한다.
작고 빠른 캐시 메모리는 CPU 부근에서 비교적 느린 메인메모리에 저장된 데이터와 인스트럭션들의 부분집합에 대한 준비장소로 사용된다.
저장 장치 기술
Random Access MeMory ( RAM) 램은 두종류를 가진다.
정적램 - SRAM(Static RAM)
동적램보다 더빠르고 훨씬 비싸다.
캐시 메모리로 사용되며 CPU칩 내부 또는 외부에 장착된다.
각 비트를 이중안정(bistable) 메모리 셀에 저장한다.
정적램은 이중안정 본성으로 인해 SRAM 메모리 셀은 자신의 값을 전원이 공급되는 한 무한히 유지하게된다.
심지어 이 회로는 전기적 잡음 같은 외력이 전압을 흔들 때도 외력이 없어지면 안정한 값으로 돌아가게 된다.
동적램 - DRAM(Dynamic RAM)
DRAM은 메인메모리와 그래픽 시스템의 프레임 버퍼로도 사용된다.
각 비트를 전하로 캐패시터에 저장한다. 이 캐패시터는 매우 작다.
SRAM과 달리 DRAM 셀은 외란에 대해서 매우 민감하다. 캐패시터 전압이 달라지면 다시 회복할 수 없다.
메인 메모리 접근하기
데이터는 'bus'라고 하는 공유된 전기회로를 통해서 프로세서와 DRAM 메인 메모리 간에 앞뒤로 교환된다.
CPU와 메모리 간의 매 전송은 버스 트랜잭션(bus transaction)이라고 부르는 일련의 단계들을 통해서 이뤄진다.
읽기 트랜잭션은 데이터를 메인 메모리에서 CPU로 이동시키고,
쓰기 트랜잭션은 CPU에서 메인메모리로 이동시킨다.
버스는 주소, 데이터, 제어 신호를 포함하는 병렬 선들의 집합이다.
주요 컴포넌트들은 CPU칩, I/O브릿지 라고 부르는 칩셋(메모리 컨트롤러를 포함하는), 메인 메모리를 구성하는 DRAM메모리 모듈로 이루어진다.
이 컴포넌트들은 두 종류의 버스로 연결된다.
CPU를 I/O브릿지로 연결하는 시스템 버스와 I/O와 메인메모리를 연결하는 메모리 버스로 구성된다.
지역성
좋은 프로그램은 다른 최근에 참조했던 데이터 아이템 근처의 데이터 아이템이나 최근에 자신을 참조했던 데이터 아이템을 참조하려는 경향이 있다.
지역성의 원리라고 알려진 위와 같은 경향은 하드웨어와 소프트웨어 시스템의 성능과 설계에 엄청난 영향을 주는 지속적인 개념이다.
좋은 시간 지역상을 갖는 프로그램에서는 한번 참조된 메모리 위치는 가까운 미래에 다시 여러번 참조될 가능성이 높다.
좋은 공간 지역성을 가지는 프로그램에서는 만일 어떤 메모리 위치가 일단 참조되면, 이 프로그램은 가까운 미래에 근처의 메모리 위치를 참조할 가능성이 높다.
시스템이 메인 메모리를 가장 최근에 참조한 가상 주소공간 블록에 대한 캐시로 사용될 수 있게 해준다.
예를 들어, 브라우저나 디스크 상의 가장 최근에 참조한 문서들을 캐싱해서 시간적 지역성을 활용한다.
메모리 계층구조에서의 캐시
일반적으로 cache는 보다 크고 느린 디바이스에 저장된 데이터 객체를 위한 준비영역으로 사용하는 작고 빠른 저장장치다.
캐시를 사용하는 과정은 caching이라 한다.
메모리 계층 구조의 중심 개념은 각 레벨 k에 대하여, k에 있는 보다 빠르고 더 작은 저장장치가 레벨 k+1에 있는 더 크고 느린 저장장치를 위한 캐시 서비스를 제공한다는 것이다.
예를 들어 , 로컬디스크는 네트워크 너머 원격 디스크로부터 가져온 파일들에 대한 캐시를 서비스 한다.
또한, 캐시의 교체 정책은 LRU(Least Recently Used Algorithms)을 채택해 사용한다.
캐시에 찾는 데이터 있따 -> 캐시 적중 cache hit
캐시에 찾는 데이터 없다 -> 캐시 미스 cache miss
캐시미스의 종류
cold cache - 비어있는 캐시 (처음 캐시 참조했을 때, 캐시는 비어있다.)
conflict cache
캐시를 관리하는 로직은 하드웨어, 소프트웨어 또는 이들 모두의 조합이 될 수 있다.
캐시는 자동으로 동작하며 프로그램으로부터 특정한 또는 명시적인 동작을 요구하지 않는다.
캐시 메모리
C(캐시) = S(캐시 집합의 배열 개수) * E(집합은 E개의 캐시라인들로 이뤄짐) * B(각 라인은 2^b바이트의 정보를 포함함)
캐시는 집합의 배열이다. 각 집합은 하나 이상의 라인을 포함한다. 각 라인은 유효비트, 태그 비트, 데이터 블록을 포함한다.
CPU가 메인메모리는 주소 A를 캐시로 보낸다 .
주소A는 주소 비트를 나누어 t(tag bit), s(set index), b(block offset) bit로 나눈다.
s는 S집합 배열의 인덱스를 구성한다. -> 워드가 어떤 집합에 저장되어야 하는지 알려준다.
t는 집합의 몇번째 라인이 워드를 포함하고 있는지 알려준다.
집합의 라인이 유효비트가 1이고, 해당 줄의 태그비트가 주소 A의 태그비트와 일치할 때만 해당워드를 포함한다.
직접 매핑 캐시
1:1 매칭 캐시
충돌미스를 방지하기 위해 인덱스를 중간것을 쓴다.
집합 결합성 캐시
N:1매칭 캐시
완전결합성 캐시
모든캐시라인들을 갖는 하나의 집합으로 구성된다.
캐시의 빈곳에 아무곳이나 넣는다.
캐시가 다찰때까지 충돌이 안난다.
비교기(?)라는 것이 있는데 이것을 매우 많이쓴다. 그래서 가장 비싸다. 그러나 가장 빠르다.
실제 캐시 계층 구조의 해부
캐시들은 데이터 뿐아니라 인스트럭션들도 저장할 수 있다.
i-cache 인스트럭션만을 보관하는 캐시
d-cache 데이터만 저장하는 캐시
통합캐시 - 둘다하는 욕심쟁이 캐쉬 ~
요즘 CPU는 각 코어마다 자체적인 L1 i-cache, L1 d-cache, L2 통합캐시를 가지고 모든 코어들은 한개의 on-chip L3 통합 캐시를 서로 공유한다. 또한 모든 SRAM 캐시 메모리들이 CPU 칩내에 들어있다.
캐시 쓰기전략
write - through
쓰기작업을 할때에 캐시, 메모리에 모두 업데이트하여 저장한다.
데이터의 일관성은 보장되지만 시간이 오래걸린다는 단점이 있다.
write - back
쓰기작업을 할때에 캐시에만 업데이트하여 저장한다. 대신에 dirty bit에 변경되었다는 것을 표시해놓는다.
그리고 캐시가 교체될때 메모리에 데이터를 업데이트하여 저장해준다.
시간이 빠르다는 장점이 있지만 데이터의 일관성이 보장되지 않는다는 단점이 있다.
그래서 일반적으로, 계층구조의 좀 더 아래에 있는 캐시들은 write - through 보다는 write - back을 사용할 가능성이 높아진다.
잡설
나는 프론트엔드 개발자 지망생이다.
정글에 와서 CS를 배우고 있는 것이 도움이 될까 ? 라는 생각이 들면서 많이 불안하고 미래에 대한 두려움이 커졌다.
그래서 코치님, 정글 선배님에게 조언을 구해보았고 결론은 하나였다.
그냥 열심히해라.ㅋㅋㅋㅋ
그리고 나는 위와 같은 고민하기 전에 나 자신에게 "정글에 와서 최선을 다했냐?" 는 물음표를 던져보았다.
그리고 나의 대답은 "아니다." 였다.
그래서 오늘부터 나는 저딴 고민하기 이전에 하루하루 최선을 다할것이답!
,,,,,
하루하루 정리를 했어야 했는데 몰아서 하려니 너무 힘들다.
그래서 이번 포스팅은 쓰다가 나중에 대충쓴것 같아 마음이 아프다.
다음부터는 하루 하루 꾸준히 써보도록하자.
이글을 읽는 모두들 열코다 🔥🔥🔥🔥🔥🔥!!
'SW정글사관학교' 카테고리의 다른 글
[SW 정글] 5/12 TIL 네트워크 프로그래밍 (0) | 2022.05.14 |
---|---|
[SW 정글] 웹서버 구현 error - 403 Forbidden , Tiny couldn't read the file: ./ (feat, c) (0) | 2022.05.13 |
[SW 정글] 5/6 TIL 가상메모리 (2) | 2022.05.07 |
[SW 정글] 5/5 TIL - malloc 구현 왜 하냐? (feat, c) (1) | 2022.05.07 |
[SW 정글] 5/1 ~ 5/4 TIL RB Tree (feat, C) (1) | 2022.05.04 |