멀티프로세서 스케줄링(Multiprocessor Scheduling)
멀티프로세서 스케줄링(Multiprocessor Scheduling)은 여러 개의 CPU가 동시에 있는 컴퓨터에서 CPU 시간을 어떻게 효율적으로 분배하는 것에 대한 문제다. 단일 CPU만 있던 시절에는 한 번에 하나의 프로그램만 CPU를 차지할 수 있었기 때문에, 프로그램들이 차례로 CPU를 쓰도록 스케줄링하는 것이 주된 고민이었다. 하지만 요즘은 컴퓨터 안에 여러 개의 CPU 코어가 들어 있기 때문에, 동시에 여러 프로그램을 처리할 수 있다. 이때, 어떤 CPU에 어떤 프로그램을 할당할지 결정하는 것이 바로 “멀티프로세서 스케줄링” 문제다.
과거에는 데스크톱이나 노트북 컴퓨터에 CPU가 1개뿐이었고, 멀티프로세서 시스템은 서버나 슈퍼컴퓨터처럼 특수한 곳에나 있었다. 하지만 이제는 우리가 쓰는 대부분의 PC에도 여러 코어가 들어 있다. “듀얼코어”, “쿼드코어”라는 단어를 들어본 적 있을 것이다. 이는 한 CPU 칩 안에 여러 개의 처리 장치가 있어서 동시에 여러 작업을 처리할 수 있다는 뜻이다.
싱글코어 CPU 속도를 높이는 데 한계가 오면서, CPU 제조사들은 한 칩에 코어를 여러 개 넣는 전략을 택했다. 그 결과, 프로그램을 더 빨리 실행하고 싶다면 이제는 단순히 CPU 클록 속도를 높이기보다, 여러 코어를 활용하도록 프로그램을 만들어야 한다. 즉, “동시에 여러 일을 할 수 있는 프로그램”을 작성하는 일이 중요해졌다.
멀티프로세서 시스템에서 발생하는 문제들
- 캐시 일관성 문제(Cache Coherence)
각 CPU는 빠른 처리를 위해 “캐시”라는 작은 저장소를 갖고 있다. 프로그램이 메모리 데이터를 자주 읽거나 쓸 때, 매번 느린 메모리에서 가져오지 않고 이 캐시에 올려두면 더 빠르게 처리할 수 있다.
하지만 CPU가 여러 개일 때 문제가 생긴다. 예를 들어, CPU1이 어떤 데이터(A)를 캐시에 올린 뒤 그 값을 변경했다고 해보자. 아직 메인 메모리는 업데이트되지 않았을 수 있다. 그 시점에서 CPU2가 같은 데이터(A)를 필요로 하여 메인 메모리에서 읽어오면, CPU2는 업데이트 전 옛날 값을 가져올 수 있다. 이 문제를 해결하기 위해 하드웨어 수준의 “캐시 일관성 프로토콜”이 동작한다. 모든 CPU의 캐시가 서로 모니터링해서, 한 CPU에서 데이터가 바뀌면 다른 CPU들도 그 사실을 알도록 하고, 낡은 데이터를 쓰지 않도록 한다. - 동기화(Synchronization)의 필요성
여러 CPU가 동시에 같은 자료구조에 접근한다면, 서로 충돌해서 데이터가 꼬일 수 있다. 이를 막기 위해 락(lock)이라는 장치를 사용한다. 한 CPU가 리스트를 수정할 때는 “잠금”을 걸어두고, 다른 CPU는 그 작업이 끝날 때까지 기다린다. 그래야 리스트가 꼬이거나 같은 데이터를 두 번 삭제하는 일이 없다. - 캐시 친화성(Cache Affinity)
각 프로그램(또는 스레드)이 실행되는 동안, 해당 CPU의 캐시에 데이터가 쌓인다. 프로그램이 매번 다른 CPU에서 실행되면 캐시를 매번 새로 채워야 하는데, 이것은 시간 낭비다. 하지만 다음에 이 프로그램을 다시 실행할 때 같은 CPU에서 실행하면 캐시를 재사용할 수 있어 속도가 빨라진다. 이를 “캐시 친화성”이라고 한다. 즉, 프로그램을 가능한 한 이전에 실행되던 CPU에 다시 올리는 것이 유리하다.
멀티프로세서 스케줄링 기법
- 단일 큐 멀티프로세서 스케줄링(SQMS)
: 모든 작업을 하나의 대기열(queue)에 넣어두고, 여러 CPU가 그 큐에서 작업을 하나씩 꺼내서 실행하는 방법
- 장점: 구현이 비교적 쉽다. 원래 단일 CPU용 스케줄러에서 거의 바꾸지 않고도 여러 CPU에 적용할 수 있다.
- 단점: 한 큐를 모든 CPU가 공유하기 때문에 “락” 경쟁이 심해진다. 프로그램이 어느 CPU에서 실행될지 매번 바뀌어 캐시 친화성도 떨어진다.
- 멀티 큐 멀티프로세서 스케줄링(MQMS)
: CPU마다 자신의 큐를 하나씩 두는 방법.(CPU0는 큐0, CPU1은 큐1) 작업이 들어오면 어떤 큐에 넣을지 정하고, 그 큐의 CPU에서만 작업을 처리한다.
- 장점: 각 CPU가 자신의 큐를 독립적으로 관리하므로 락 경쟁이 적어지고, 캐시 친화성도 좋아진다(같은 CPU에서 계속 실행)
- 단점: 워크로드(작업량) 균형 문제
→ 작업 이주(migration): 바쁜 CPU의 큐에서 일이 많은 작업을 하나 덜어내어 한가한 CPU 큐로 옮김.(작업 훔치기(work stealing))
'CS' 카테고리의 다른 글
[CS] 자바 실행 과정 및 JVM (0) | 2024.12.08 |
---|---|
[CS] 단일프로세서 시스템(Single Processor System) (0) | 2024.12.02 |
[CS] 프로세스 API(Process API) (0) | 2024.11.25 |
[CS] 자바의 메모리 구조, Static, 그리고 main() 메서드 (2) | 2024.11.03 |