SMP는 똑같은 일꾼(프로세서) 여러 명이 한 작업장(주기억장치와 입출력 장치)을 함께 쓰는 구조다. 누구나 어떤 일이든 할 수 있어서 “대칭”이라고 부른다. 일을 나눌 수 있으면 빨라지고, 한 명이 쓰러져도 나머지가 계속 일한다. 대신 운영체제는 두 일꾼이 같은 일을 집거나, 같은 데이터를 동시에 고치는 일을 막아야 한다.
예시로 보기
다중 프로그래밍과 다중 처리의 차이부터 보자.
| 시각 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 프로세서 하나 (다중 프로그래밍) | P1 | P2 | P1 | P3 |
| 프로세서 둘 (다중 처리) — 프로세서 A | P1 | P1 | P3 | P3 |
| 프로세서 둘 (다중 처리) — 프로세서 B | P2 | P3 | P2 | P1 |
프로세서 하나에서는 프로세스들이 번갈아 실행된다(interleaving). 어느 순간이든 실행 중인 것은 하나다. 프로세서가 둘이면 번갈아 실행되면서 겹쳐서도 실행된다(overlapping). 같은 순간에 두 프로세스가 각각 다른 프로세서에서 돈다1.
정확히 말하면
컴퓨터를 나누는 네 가지 (플린의 분류)
전통적으로 컴퓨터는 명령어를 하나씩 차례로 실행하는 기계로 여겨졌다. 하지만 성능과 신뢰성을 높이려고 설계자들은 병렬성을 계속 찾았다. 프로세서를 여러 개 두는 대표적인 두 방법이 SMP와 클러스터다. 명령어 흐름과 데이터 흐름이 몇 개인지로 컴퓨터를 나누면 다음과 같다.
| 분류 | 뜻 |
|---|---|
| SISD (단일 명령어, 단일 데이터) | 프로세서 하나가 명령어 흐름 하나로 메모리 하나의 데이터를 처리한다 |
| SIMD (단일 명령어, 다중 데이터) | 같은 명령어를 여러 처리 장치가 각자 다른 데이터에 실행한다 |
| MISD (다중 명령어, 단일 데이터) | 데이터 흐름 하나를 여러 프로세서가 각자 다른 명령어로 처리한다. 실제로 만들어진 적이 없다 |
| MIMD (다중 명령어, 다중 데이터) | 여러 프로세서가 동시에 각자 다른 명령어를 각자 다른 데이터에 실행한다 |
MIMD는 프로세서끼리 통신하는 방법으로 다시 나뉜다. 프로세서마다 전용 메모리가 있으면 각각이 독립된 컴퓨터이고, 이것을 클러스터(멀티컴퓨터)라고 부른다. 메모리를 함께 쓰면 공유 메모리 다중 프로세서이고, 프로세서들은 그 메모리를 통해 통신한다. SMP는 공유 메모리 다중 프로세서의 한 종류다.
flowchart TD
P["컴퓨터, 명령어 흐름과 데이터 흐름의 수로 나눔"] --> SISD["SISD"]
P --> SIMD["SIMD"]
P --> MISD["MISD"]
P --> MIMD["MIMD"]
MIMD --> SH["공유 메모리 다중 프로세서"]
MIMD --> CL["클러스터, 프로세서마다 전용 메모리"]
SH --> SMP["SMP"]
플린의 네 칸 가운데 MIMD만 다시 둘로 갈린다. 가르는 기준은 프로세서들이 메모리를 함께 쓰느냐다. SMP는 함께 쓰는 쪽 가지 끝에 있다2.
SMP의 정의
대칭형 다중 프로세서는 다음을 모두 만족하는 독립된 컴퓨터 시스템이다.
- 프로세서가 여러 개다.
- 프로세서들이 같은 주기억장치와 입출력 장치를 버스 같은 연결 장치로 함께 쓴다.
- 모든 프로세서가 같은 기능을 할 수 있다. 그래서 “대칭”이다.
SMP의 운영체제는 프로세스나 스레드를 모든 프로세서에 걸쳐 스케줄링한다.
SMP에서는 커널이 어느 프로세서에서나 실행된다. 보통 프로세서마다 실행 가능한 프로세스·스레드 모음에서 스스로 다음 일을 고른다(자기 스케줄링). 커널을 여러 프로세스나 스레드로 짜서 커널의 여러 부분을 병렬로 실행할 수도 있다. 프로세서마다 제어 장치, 산술·논리 장치, 레지스터, 캐시를 가진다.
좋은 점
SMP가 프로세서 하나짜리 시스템보다 나은 점은 네 가지다.
| 좋은 점 | 내용 |
|---|---|
| 성능 | 일의 일부를 병렬로 할 수 있으면, 같은 종류의 프로세서 하나보다 빠르다 |
| 가용성 | 모든 프로세서가 같은 일을 하므로 프로세서 하나가 고장 나도 시스템이 멈추지 않는다. 성능만 줄어든다 |
| 점진적 확장 | 프로세서를 하나 더 꽂아 성능을 높인다 |
| 규모 조절 | 판매자가 프로세서 수로 값과 성능이 다른 제품군을 만든다 |
운영체제가 새로 신경 쓸 것
다중 프로세서 운영체제의 주요 설계 문제는 다섯 가지다.
| 문제 | 내용 |
|---|---|
| 동시에 실행되는 프로세스·스레드 | 여러 프로세서가 같은 커널 코드를 동시에 실행할 수 있어야 한다(재진입 가능). 커널 표와 관리 구조가 엉키거나 교착상태에 빠지지 않게 관리한다 |
| 스케줄링 | 어느 프로세서든 스케줄링을 할 수 있으므로 충돌을 피해야 한다. 두 프로세서가 같은 프로세스를 고르거나, 프로세스가 큐에서 사라지면 안 된다 |
| 동기화 | 공유 주소 공간과 입출력 자원에 여러 프로세스가 접근하므로 상호 배제와 사건 순서를 강제해야 한다. 흔히 잠금(lock)을 쓴다 |
| 메모리 관리 | 단일 프로세서의 모든 문제에 더해, 하드웨어의 병렬성(동시 접근 가능한 메모리 등)을 활용해야 한다 |
| 신뢰성과 장애 허용 | 프로세서 하나가 고장 나도 성능만 줄고 계속 돌아야 한다 |
활용
- 요즘 노트북과 스마트폰의 멀티코어 프로세서가 SMP 구조다. 운영체제는 스레드를 여러 코어에 나눠 준다.
- 프로세서 친화성. Windows는 준비된 스레드를 기본적으로 그 스레드가 마지막으로 돌았던 프로세서에 다시 배정하려 한다(약한 친화성, soft affinity). 그 프로세서의 캐시에 남은 데이터를 다시 쓰기 위해서다. 응용 프로그램이 특정 프로세서에만 돌도록 묶을 수도 있다(강한 친화성, hard affinity).
- 한 프로그램의 여러 스레드가 동시에 여러 프로세서를 쓰려면 커널이 스레드를 알아야 한다 → 사용자 수준 스레드와 커널 수준 스레드
연결
확인 문제
C1 “프로세스 세 개가 같은 순간에 실행 중이다”는 다중 프로그래밍(프로세서 하나)과 SMP(프로세서 넷) 중 어디서 가능한가? 다른 쪽에서는 왜 불가능한가?
답: SMP에서만 가능하다. 프로세서가 하나면 어느 순간이든 실행되는 것은 하나뿐이고, 나머지는 번갈아 기다린다.
C2 SMP의 세 가지 조건을 쓰라.
답: ① 프로세서가 여러 개다. ② 같은 주기억장치와 입출력 장치를 함께 쓴다. ③ 모든 프로세서가 같은 기능을 할 수 있다.
흔한 오답: “프로세서마다 자기 메모리가 있다”. 그것은 클러스터다.
C3 단일 프로세서 운영체제의 스케줄러를 그대로 SMP에 쓰면 어떤 문제가 생길 수 있는가? 구체적으로 하나 쓰라.
답: 두 프로세서가 동시에 준비 큐를 보고 같은 프로세스를 골라 둘 다 실행할 수 있다. 또는 동시에 큐를 고치다가 프로세스 하나가 큐에서 사라질 수 있다. 큐를 고치는 동안 다른 프로세서가 접근하지 못하게 막는 동기화가 필요하다.