1. 음식점으로 예시
01 직원이 한명인 경우
주문을 받을때마다 주문 현황판에서 입력하는 것이 아니라 데이터를 꾹꾹 넣어 가지고 한 번에 주문현황판에 가서 입력한다.
주문을 바꿔야 되는 경우가 생길때 아까 만약 주문 현황판에 입력했으면 거기까지 가서 주문 현황판에 가서 취소를 하는 작업이 필요하겠지만 직원이 수첩에 적고 있는 상태이니까 콜라를 지우고 사이다를 적으면 된다.
02 직원이 여러명일 경우
수첩은 공유하는 것이 아니므로 직원 개개인의 수첩이 존재한다. 아까와 같은 상황에 1번직원이 수첩에 콜라를 적어놓았는데 2번 직원을 불러서 주문을 번복하게 되면 2번 직원은 애초에 콜라 주문을 받은 적이 없다. 주문 현황판을 봐도 콜라가 주문에 들어간 것이 없다. 그래서 주문을 번복하게 되는 상황이 어떠한 상황인지 모르는 상황이 된다. 최종적인 주문현황판을 모르기 때문에 알바들끼리 혼선이 일어날 수 있다.
2. 캐시 장치 - 기억 장치
컴퓨터 시스템에서 CPU와 주기억장치 사이에 위치한 임시메모리이다. 주로 사용하는 데이터와 명령어의 복사본을 저장하고 CPU가 이를 빠르게 접근할 수 있도록 도와준다. 주기억장치보다 매우 빠른 접근 시간을 가진다.
L1 , L2등의 계층이 있으며 순서대로 속도는 느리지만 저장 용량이 더 크다.
음식점으로 비유를 해보자면 CPU는 음식점이고, 각각 코어는 직원들이다.
최종적으로 메모리에 기입하는 것은 메모리와 CPU가 멀리 떨어져있기 때문에 매번 RAM에 가서 메모리를 갱신하는 것은 매우 힘든 일이다. 어떤 변수나 메모리 값을 조작한다고 했을 때 그거를 바로 메모리에 바꿔치기 하는 것이 아니라 일단은 캐시장치에 기입을 하고 나중에 시간이 지나고 한꺼번에 메모리에 올리는 작업을 할 것이다.
01 Temporal Locality
시간적으로 보면, 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다. 방금 주문한걸 메모해 놓으면 편하지 않을까? 방금 주문한 사람이 또 주문할 확률이 높다고 캐싱을 하면 더 좋을 것 같다.
2) Spacial Locality
공간적으로 보면, 방금 주문한 사람 근처에 있는 사람이 추가 주문을 할 확률이 높다. 방금 주문한 사람과 합석하고 있는 사람들의 주문 목록도 메모해 놓으면 편하지 않을까? 방금 접근한 변수와 인접한 주소에 있는 주소들이 또 방문될것 같다는 예감
3. 캐시가 잘 작동하고 있는지 테스트 코드
class Program
{
static void Main(string[] args)
{
int[,] arr = new int[10000, 10000];
{
long now = DateTime.Now.Ticks;
for (int y = 0; y < 10000; y++)
for (int x = 0; x < 10000; x++)
arr[y, x] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"(y,x)순서 걸린 시간은 {end - now}");
}
{
long now = DateTime.Now.Ticks;
for (int y = 0; y < 10000; y++)
for (int x = 0; x < 10000; x++)
arr[x, y] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"(x,y)순서 걸린 시간은 {end - now}");
}
}
}
01 (y,x) [] [] [] [] [], [] [] [] [] []
long now = DateTime.Now.Ticks;
for (int y = 0; y < 10000; y++)
for (int x = 0; x < 10000; x++)
arr[y, x] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"(y,x)순서 걸린 시간은 {end - now}");
주변에 인접한 애들을 접근해서 캐시에 갖고 있겠다. 상대적으로 빠르다
2) (x,y) []
[]
[]
long now = DateTime.Now.Ticks;
for (int y = 0; y < 10000; y++)
for (int x = 0; x < 10000; x++)
arr[x, y] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"(x,y)순서 걸린 시간은 {end - now}");
이런식으로 띄엄띄엄 접근해서 공간적 이점을 활용할 수 없으므로 걸린 시간이 비교적 길다.
참고 : 본 내용은 MMORPG PART4 강의를 수강하여 작성하였습니다.
https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4
'cs공부 > 운영체제' 카테고리의 다른 글
운영체제 - Interlocked(Increment,Exchange,Add메서드 등) (0) | 2023.05.15 |
---|---|
운영체제 - RaceCondition, Atomic (0) | 2023.05.11 |
운영체제 - 쓰레드(Thread), 기아상태,쓰레드풀(Thread Pool) (0) | 2023.04.28 |
운영체제 - 문맥교환(Context switching), 프로세스의 상태 (0) | 2023.04.28 |
운영체제 - 프로세스(Process) (0) | 2023.04.28 |
댓글