🧐 Volatile 자바에서 지원하는 volatile이라는 키워드는 다음과 같은 특성을 가집니다. volatile로 선언된 변수가 있는 코드는 최적화되지 않습니다. volatile 키워드는 변수를 'Main Memory에 저장하겠다'라고 명시하는 것입니다. 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌, Main Memory에서 읽는 것입니다. 🧐 사용하는 이유 volatile키워드의 사용 이유를 알기 위해서는 메모리 구조를 알아둘 필요가 있습니다. 🧐 메모리 구조 보통의 메모리 구조는 다음과 같습니다. CPU 내에는 성능 향상을 위해서 L1 Cache가 내장되어 있습니다. CPU 코어는 메모리에서 읽어온 값을 캐시에 저장하고, 캐시에서 값을 읽어서 작업합니다. 값을 읽어올 때 우선..
🧐 그라파나 (Grafana) 이전 글에서 간단히 언급했지만 다시 한 번 하도록 하겠습니다. 프로메테우스가 DB라고 한다면, 이 DB에 있는 데이터를 불러서 사용자가 보기 편하게 보여주는 대시보드가 필요합니다. 그라파나는 데이터를 그래프로 보여주는 툴입니다. 수 많은 그래프를 제공하고, 프로메테우스를 포함한 다양한 데이터소스를 지원합니다. 🧐 그라파나 설치 그라파나 설치 사이트(https://grafana.com/grafana/download)로 이동합니다. 여기서는 맥 OS 기준으로 설치를 진행하겠습니다. 위의 명령어를 복사합니다. 이후 그라파나를 설치할 (임의의)폴더로 이동한 뒤, 위의 명령어를 그대로 입력합니다. (설치하는데 시간이 좀 걸릴 수 있습니다) 그라파나를 설치할 폴더의 bin 폴더로 이동..
🧐 Collectors.toMap이 뭔가요? Stream을 사용하는 경우, 최종 연산으로 collect()를 사용하는 경우, Stream의 요소들을 수집하여 특정한 자료구조로 변환할 수 있습니다. 이때 Map으로 변환하기 위해서는 Collectors.toMap을 사용합니다. 흔히 사용하는 toMap은 다음과 같습니다. List strings = Arrays.asList("apple", "banana", "pear"); Map map = strings.stream() .collect(Collectors.toMap(String::length, Function.identity())); System.out.println(map); // 결과: {4=pear, 5=apple, 6=banana} 그러나 위 코드에는..
🧐 Associative Cache Associatvie Cache는 유연한 블록 배치(placement)를 통해 캐시 실패율(Miss rate)을 줄이는 방법입니다. 이전 글 까지에서는 메모리 블록을 캐시에 넣을 때 각 블록이 캐시의 딱 한 장소에만 들어갈 수 있도록 하는 단순한 배치 방법인 directed mapped를 사용하였습니다. directed mapped는 블록을 배치하는 다양한 방식들 중, 극단적으로 블록을 한 곳에만 넣을 수 있도록 하는 방법입니다. 반대쪽 극단에는 블록이 캐시의 어느 곳에나 들어갈 수 있도록 하는 방식이 있습니다. 👉 fully associative 블록이 캐시의 어느 곳에나 들어갈 수 있도록 하는 캐시 구조를 의미합니다. 메모리 블록을 캐시 내의 어떤 엔트리와도 연관(..
🧐 피연산자 (Operands) 산술 명령어의 피연산자에는 제약이 있습니다. 레지스터(register)의 주소 혹은 상수만이 해당 위치에 올 수 있습니다. RISC-V 컴퓨터는 32개의 레지스터를 가지고 있으며, 각각의 레지스터는 64비트를 저장할 수 있습니다. (32비트 컴퓨터의 경우 레지스터는 32비트를 저장할 수 있습니다.) 각각의 레지스터는 x0 부터 x31 까지의 주소를 가집니다. 여기서 워드(Word)라는 단어가 등장하는데, 워드는 컴퓨터에서의 접근 단위이며, 레지스터의 크기에 해당합니다. 그러나 본래의 의미와는 다르게 일반적으로 Word라고 하면 32비트를 떠올리며, 64비트 컴퓨터에서는 Word가 64비트이지만 Word는 32비트라는 인식이 강하므로, 64비트를 나타내기 위해 Double ..