꾸준히 공부하는 습관은 어느정도 다시 자리잡은 것 같다. 다만, 매주 이야기하고 있지만, 시간을 효율적으로 사용하려고 노력 중이다. 여전히 알고리즘은 매일 1문제 씩 풀고있다.
캐시 메모리의 원리
Cache - Temporary Storage
- 캐시 메모리(Cache Memory)는 CPU 프로세서가 빠른 속도로 데이터를 주고 받을 수 있도록 도와주는 메모리
- CPU프로세서와 인접한 곳에 위치
- 참조 지역성 원리(Locality of Reference) 자주 사용되는 데이터에 대한 판단 기준 (시간 지역성과 공간 지역성으로 구분) 주 기억장치 | 보조기억장치 등과 같은 메모리 저장소의 데이터를 미리 가져와 보관하는 임시 저장소 역할
Cache Blocks - Tag Field, Valid Bit, Data
- 캐시 메모리의 데이터 그룹 단위
- 각각의 Cache Block은 Data를 담고 있으며, Cache Tag와 묶어서 하나의 Cache Entry를 구성
- Cache Tag
고유 식별 값으로 CPU 프로세서는 캐시 태그 값을 통해 캐시 블록에 접근- Valid Bit
해당 Cache Block에 올바른 데이터가 담겨져 있는지를 나타내는 정보 Cache Block이 비어있거나 올바르지 못한 값을 가지고 있으면 유효비트는 0으로 설정(Set) 되어 유효한 블록이 없음을 표시
- Valid Bit
- 캐시가 빠른 이유 참조 지역성의 원리에 따라, 자주 사용하는 데이터를 우선적으로 저장하고 있기 때문
- Cache Tag와 Valid Bit를 통한 메모리 접근 방식 (시간복잡도 O(N))
캐시 메모리의 크기
- Cache Line 캐시 메모리는 S개의 집합(Set)으로 묶여져 있으며, 각 집합은 E개의 Cache Entry를 소유
- 필요한 Cache Memory의 크기 = 메모리에 존재하는 Cache Block의 전체 개수와 블록 하나 당의 크기 (Block Size)로 계산
- 주의점 CacheTag와 Valid Bit는필요한 캐시 메모리의 크기와는 별도로 요구되는 공간
추가적으로 Index Field도 캐시 메모리의 크기에 영향 X
⇒별도의 비트 필드를 가지지 않아도 하드웨어 물리적인 주소로 바로 연결
EX. Cache Tag = Tag Field(17bit) + Valid Bit(1bit), Cache Block(32byte)라 가정
32KB캐시라는 뜻은 32KB의 Data를 저장할 수 있는 Cache Memory를 의미 (Tag Field와 Valid Bit 제외) 32KB 캐시 메모리 = (32byte Cache Block) * 1024 이며 하나의 Cache Block 당 17 + 1bit의 Cache Tag를 가지고 있어서 총 18Kb의 메모리를 더 가지고 있고 있고, 이를 KB로 변환하면 2.25KB 즉, 32KB의 캐시 메모리는 2.25KB의 TagField 메모리를 추가로 가지고 있기때문에 실질적으로 34.25KB의 크기를 가짐
KB = KiloByte, Kb = KiloBit
출처
Spring lombok의 Builder
- Builder를 delombok 수행 시 아래와 같이 나옴
- @NoArgsConstructor | @AllArgsConstructor | @RequiredArgsConstructor 즉, Constructor가 필수적으로 필요
public class DevDto {
@NonNull
String firstName;
Integer age;
LocalDateTime startAt;
public static DevDtoBuilder builder() {
return new DevDtoBuilder();
}
public static class DevDtoBuilder {
private @NonNull String firstName;
private Integer age;
private LocalDateTime startAt;
DevDtoBuilder() {
}
public DevDtoBuilder firstName(@NonNull String firstName) {
this.firstName = firstName;
return this;
}
public DevDtoBuilder age(Integer age) {
this.age = age;
return this;
}
public DevDtoBuilder startAt(LocalDateTime startAt) {
this.startAt = startAt;
return this;
}
public DevDto build() {
return new DevDto(firstName, age, startAt);
}
public String toString() {
return "DevDto.DevDtoBuilder(firstName=" + this.firstName + ", age=" + this.age + ", startAt=" + this.startAt + ")";
}
}
}
DevDtoTest.java
- DevDto.builder() 와 .build() 사이의 값들을 파라미터로 새로운 인스턴스를 생성하여 반환 ⇒ 중간의 필드 변수들을 인자로하는 Constructor 존재 필요
느낀점
그룹 스터디에서 스프링 인강을 듣기로 해서 처음 스프링 공부할 때 들었던 인강을 다시 듣기 시작했다.
그 때는 정말 하나도 들리지 않았던 이야기들이 지금은 훨씬 많이 들리고 이해도 많이 되서 뿌듯하기도했다. 어쩌면 1년의 시간이 흘렀으니까 당연할 수도 있지만, 그래도 실력이 늘었다는 뜻이니까....
특히 위에 정리한 Builder같은 경우는 내부 구조가 궁금해서 delombok 후 전체적인 구조를 이해하는데 시간을 많이 썼다.
공부 방식에는 답이 없지만 취업 공부에는 답이 있는 것 같기도 하다. 요즘 스스로 하고 싶은 공부도 많고, 욕심이 많은 것 같다. 욕심을 줄일 것 아니면, 더 노력해서 목표한 것들을 꾸준히 이루도록 하자.
'끄적끄적 > 회고록' 카테고리의 다른 글
11월 2주차 회고록 (2) | 2022.11.14 |
---|---|
11월 1주차 회고록 (2) | 2022.11.08 |
댓글