운영체제

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 캐시와 CPU 파이프라인

순정법사 2024.12.03

A. 캐시와 CPU 파이프라인

1. 캐시

a. 캐시 기초

컴퓨터 구조 원리 : 캐시

 

 

레드 : cpu 

노란색 : 메모리

전기가 아무리 빨라도 물리적으로 좀 멀어보임 (데이터 낭비)

 

따라서 캐시를 사용함

 

b. cpu의 캐시관리

cpu는 이런식으로 관리된다

 

레지스터는 cpu의 손발

아래 캐시들은 단기기억장치 (서빙할 때 메모장 같은 것)

 

내부는 이런식으로 저장돔

 

c. 캐시 철학

 

물리적으로 모든 데이터를 가져오지 않고

잠시 기억해두는것! ==> 이것이 캐시

 

 

d. 캐시 실습

접근하는 비용이 얼마나 걸렸는지 테스트하기

 

 

버퍼를 하나 생성하고 GetTickCount64로 시간을 재고

반복문을 사용해 버퍼에 넣어주기 

그럼 버퍼에는 캐시가 [a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] 이런식으로 저장되게 되는데

 

 

위와 같은 코드지만 추가로 j,i를 바꿔서 찾는 시간이 얼마나 걸리는지 비교해보면

 

==> 3배씩 속도차이가 남 (캐싱을 하고있기 때문)

 

[a] [b] [c] [d] [e] [f] [g] [h] [i] -- 이렇게 캐싱되어있던게

a다음 f를 찾아야 하니까 시간이 늘어나게 됨

 

이 방법을 통해 간접적으로 캐시가 작동하고 있는구나 알 수 있음

 

 

2. 컴퓨터 구조원리 : 파이프라인

a. 파이프라인이란?

 

빨래를 한다고 하면 하나 끝나고 하나 하려면 너무 시간도 많이 걸림

그래도 비어있는 곳에 순차적으로 실행해야 한다 

 

 

Cpu가 일할때도 마찬가지임

하나의 명령어가 4단계를 거치게 됨

 

1. 가져오고

2. 인지(분석)

3. 실행

4. 돌려놓기

 

위에서처럼 순서대로 실행될 수 있는데,

위험하게 cpu가 독립적인 명령어라고 판단하면 순서를 바꿀 수 있음

 

b. 실습

 

스레드 두개를 만들어주고

첫 번째 스레드에서는 레디에 따라 y 값이 달라지게 함

두번째도 비슷하게 진행 

 

 

메인함수는 무한루프를 돌면서 카운팅

스레드 두개를 만들고  

스레드를 모두 가동하면 레디를 트루

몇번 만에 빠져나오는지 보면

 

 

💥 위 스레드에서 아무리 맞춰봐도 0이 될 수가 없음

 

이건  cpu가 명령어를 뒤집어버려서 코드가 끝까지 실행되는 것 (멀티 스레드 환경)

근데 환경이 다양해서 꼭 무조건 이렇게 실행되는 것은 아님

 

 

이것도 운영 체제에 따라서 최적화되어 Yeah가 실행될 수 있음

 

이 키워드를 사용하게 되면 최적화 하지 말아달라는 것 (하지만 잘 사용하지 않음)

 

위와 같이 환경에 따라서 잘못 작동할 경우가 있기 때문에 흑마법이다

 

상식으로 알아두면 됨!