Single Core 환경은
(CPU - Cache) ----- Memory 형태로 되어 있다.
Cache는 Main Memory보다 용량은 작지만, 주요 data들을 모아 둔 작고 빠른 임시저장장치이다.
이 Cache를 이요함으로써 CPU와 Memory 간의 다소 느린 속도를 보완해줄 수 있다.
그렇다면 Multi Core는 어떨까
(CPU - Cache) -----
|----- Memory
(CPU - Cache) -----
와 같은 형태일 것이다. (core는 더 많을 수도 있다)
이 경우에 문제가 복잡해진다.
CPU1에서 CPU2로 작업을 옮기려면 CPU2에서 다시 필요한 정보를 Memory에서 Cache로 가져오고,
또 Context Switch가 발생하면 CPU1의 Cache로 필요한 정보를 가져오게 되면서
problem of cache coherence(캐시 일관성 문제)가 발생하게 되어 Overhead 떄문에 Single Core보다 훨씬 더 형편없는 성능을 보일 지도 모른다.
그렇다면 이 문제는 어떻게 해결되는가?
-> Bus snooping
각 Cache는 bus를 모니터링하면서 Memory가 업데이트되는 것을 감시한다.
그러다가 다른 캐시에서 해당 영역의 업데이트가 발생하면 자신의 캐시 위에 있는 영역의 복사본을 무효와 하거나 업데이트한다.
예를 들어,
1) CPU0이 주소 1번지의 데이터 'D'를 읽었다.
2) D가 업데이트 되어 D'가 되었다.
3) CPU1이 주소 1번지의 오래된 데이터인 D를 re-read하려 한다.
=> 요게 바로 Cache coherence(캐시 일관성) 문제다
bus snooping을 사용하면
CPU1이 '나 메모리 1번지에서 값 갖고 간다~' 했을 때
CPU0이 보고 있다가 '어? 최신 버전은 나한테 있어. 이거 가지고 가'
한다고 생각하면 된다.
'SKKU SW > Operating System' 카테고리의 다른 글
[OS] [Linux / UNIX] sync, fsync 함수 (1) | 2024.06.09 |
---|---|
[OS] Anonymous pipe와 Named pipe (0) | 2024.06.07 |
[OS] Multiprocessor Scheduling - SQMS와 MQMS (1) | 2024.04.06 |
[OS] System call 시스템 콜 (0) | 2024.03.25 |
[OS] main함수의 int argc와 char *argv[] (0) | 2024.03.13 |