CPU가 여러 개이지만, 결국 CPU는 메모리에 접근합니다. CPU가 다루는 메모리는 기판에 연결되어 있는 다른 부품에 있습니다. 기판 회로를 통해 데이터를 주고받는 과정은 CPU 입장에서는 매우 긴 시간입니다. CPU 안에 캐시 메모리(cache memory)가 있는 이유도 이 시간을 대폭 줄이기 위해서입니다. 하지만 CPU 안에 캐시된 메모리 또한 여러 CPU가 접근할 때는 CPU 안에서 블로킹이 약간 발생합니다. 즉, 멀티스레드로 작동한다 하더라도 메모리에 접근하는 시간 동안에는 CPU 개수보다 더 적은 수의 CPU를 처리하게 된다는 의미입니다. 이렇게 메모리에 접근하는 시간을 메모리 바운드 시간(memory bound time)이라고 합니다.
일반적으로 서버는 4코어가 기본이고, 보통 8코어 이상을 장착하기도 합니다. 그러다 보니 메모리 액세스의 양을 최대한 줄이는 것이 곧 서버 성능을 잘 사용하는 길이기도 합니다. 아무튼 CPU 개수가 많더라도 100% 성능을 다 사용하지는 못합니다.
“뮤텍스를 최대한 잘게 나누는 것이 이상적이지 않을까?” 하는 생각이 들 수도 있습니다. 하지만 뮤텍스를 너무 잘게 나누면 다음 문제가 생깁니다.
1. 오히려 프로그램 성능이 떨어집니다. 뮤텍스를 액세스하는 과정 자체가 무겁기 때문입니다.
2. 프로그램이 매우 복잡해집니다. 특히 뒤에서 설명할 교착 상태(dead lock) 문제가 쉽게 발생합니다.