Multiprocessor System은 세가지로 구분할 수 있다.
각각의 CPU 가 자기 메모리, 자기 I/O 채널을 가지고 있다.
consists of a collection of relatively autonomous systems, each processor having its own main memory and I/O channels
각자 자기 OS 를 실행한다.
⇒ 각자 하나의 독립적인 컴퓨터가 네트워크로 연결해서 사용하는 시스템이다.
CPU O, I/O, 서로 다른 기능을 하는 여러 Processor 들이 하나의 Computer 안에 있다.
there is a master, general-purpose processor; specialized processors are controlled by the master processor and provide services to it
CPU 가 여러개 있으며 메모리 하나를 공유하고 OS가 하나 존재한다.
⇒ 하나의 OS 가 여러 CPU 작업을 한번에 관리한다.
우리가 앞으로 multiprocessor 라고 말할 애이다.
consists of a set of processors that share a common main memory and are under the integrated control of an operating system
Schedululing 은 좋은 성능을 내는 것이 목적이다.
9장에서는 CPU 1개로 프로세스 실행시간이 중요했지만, 10장에서는 CPU가 여러개 이므로 프로세스의 실행시간 보다는 동기화 시간 간격 이 중요해졌다.
프로그램을 구성하는 스레드나 프로세스가 얼마나 빈번하게 동기화 하느냐에 따라 스케쥴링하는 방법이 달라진다.
한 시스템에 여러 프로그램이 동시에 실행이 되는데 독립적으로 실행된다.
개별적으로 동작하기 때문에 동기화하지 않는다.
Client 와 Server 사이에 networking 을 통해서 request 와 response 를 주고 받는 것이다.
2000 instructions 당 동기화 1번씩한다.
하나의 application 이 여러개의 프로세스로 만들어진 경우
200 instructions 당 동기화 1번씩한다.
하나의 application 이 여러개의 스레드로 만들어진 경우
20 instructions 당 동기화 1번씩한다.
Thread 의 경우 code, data 공간을 공유하기 때문에 data 를 주고 받으며 통신할 수 있다.
이때, Process 는 OS 를 거쳐 통신해야하는 반면, Thread 는 OS 를 거칠 필요가 없이 통신이 가능해 빈번하게 동기화가 이루어진다.
특수 목적으로 만들어진 Parallel Program 으로, 굉장히 많은 Data set에 대해여 굉장히 많은 computation 을 한다.
굉장히 많은 CPU에게 일을 나누어준다.
⇒ 굉장히 밀접하게 서로 동기화를 많이 해야한다.
20 미만의 instructions 당 동기화 1번씩한다. (빈번하게 동기화)
1, 2, 3 은 실행시간이 길고 짧은 건 중요하지 않다.
↔ 그러나 4, 5는 실행시간이 길고 짧은 것이 중요하다.
⇒ 스케쥴링을 어떻게 하면 좋을까? → 결국 어떤 프로그램이냐가 중요하다!
Scheduler 를 만들 때, 3가지 이슈가 존재한다.
각각의 프로세스에게 CPU 를 어떻게 할당할까? → Ready Queue 여러개 생성
원래 CPU 가 1개일때는 Ready Queue에 들어 있는 Process 가 CPU 를 가져갔는데 이제는 CPU가 여러개이기 때문에 Process 가 어느 CPU 로 가야할지 고민해야 한다.
multiprogramming 을 할지말지를 고민해야한다.
그래서 어떤 순서로 프로세스를 실행해야할까?
The approach taken will depend on the degree of granularity of applications and the number of processors available
CPU 마다 Ready Queue 를 따로둔다.
시스템 안에 CPU가 10개이면, Ready Queue도 10개가 있는 것이다.
→ 1번 CPU 를 위한 Ready Queue ~ 10번 CPU 를 위한 Ready Queue
프로세스가 시스템에 들어오게 되면 OS 가 10개 중 하나의 CPU Ready Queue 로 보내준다.
이때, 각각의 CPU 입장에서는 자기 Queue 에 있는 프로세스만 실행시키면 된다. (마치 9장의 uni-processor 처럼)
프로세스마다의 실행시간을 모르기 때문에 어떤 CPU 에는 실행시간이 긴 프로세스만 줄 서 있을 수 있고, 다른 CPU 에는 실행시간이 짧은 프로세스만 줄을 서 있을 수 있다. 따라서 어떤 CPU 는 계속 일하는 반면, 다른 CPU 는 계속 놀고 있을 수도 있다(Idle-while-Busy).
각각의 CPU가 작업을 마치면 OS 를 실행시켜서 다음에 실행시킬 프로세스를 찾아가는 방법이다. 실행을 마칠때마다 프로그램을 찾아서 실행시키기 때문에 모두가 일을 할 수 있게 된다.
Schedule to any available processor
multiprogramming 을 할지말지를 고민해야한다.
메모리 안에 여러 프로그램이 있는데 이 중, 하나의 프로그램이 I/O 작업으로 Block 이 되면 다른 프로세스를 실행하는 것이다.
프로그램을 실행한 뒤 I/O 가 발생하면 Blocked X, Switching X
만약 5가지 종류의 동기화 단계의 프로그램들 중 완전히 Independent 하거나Coarse-grained 단계의 애들은 당연히 Multiprogramming 이 필요하다. 동기화 작업을 하지 않기 때문에 Block 되면 무조건 I/O 작업 때문이다.
그러나, 나머지 3단계는 Multiprogramming 을 안하는게 좋을 수도 있다.
Block 이 되는 세가지 상황
프로세스간 동기화가 빈번하다고 가정하자.
CPU가 1개일 때는 내가 Message Recieve 를 받아야하는데 상대방이 send 할때까지 Wait 했어야 한다. 즉, CPU 를 양보해줬어야 한다.
CPU가 여러개일 때
얘네들은 동기화를 거의하지 않기 때문에 Block 을 해주어야 한다.
⇒ Multiprogramming 이 필요하다.
Each individual processor should be able to switch among a number of processes to achieve high utilization and better performance
동기화가 빈번하기 때문에 Block 을 안하고 잠깐 기다리게 한다.
⇒ 어떤 종류의 프로그램이냐에 따라 Multiprogramming 을 할지 안할지 선택한다.
⇒ Busy-Waiting
이 필요하다.
An application that consists of a number of threads may run poorly unless all of its thread are available to run simultaneously
어떤 순서로 Scheduling 할 것인가?
Specific scheduling disciplines is less important with more than one processor
실행시간이 짧은 것과 긴 것이 얼만큼 섞여있는가?
Througput을 의미한다.
Througput: 짧은 거 부터 하면 좋다. 값이 클수록 좋다.
y 값이 증가할 수록 FCFS 보다 다른 방식의 성능이 더 좋은 것이다.
FCFS: 최악의 스케쥴링 기법이다.
Single Processor 에 비해 Dual Processor 는 거의 성능 차이가 없다.
⇒ 프로세스 실행시간에 편차가 있어도 거의 차이가 없다.
CPU 의 개수에 따른 제일 Response time 이 짧은 애와 Response time 이 긴 애의 차이를 확인하기
↳ 계산대가 여러개 있을 때, service 시간이 하나가 길어도 다른 짧은 process 들은 다른곳에서 처리가 가능하기 때문에, Waiting Time 이 상관이 없다.
⇒ 따라서 전체적 Response time 은 그렇게 중요하지 않다.
모든 프로그램이 아니라 우리가 사용하는 프로그램이 얼만큼 동기화를 하는지가 주요하다.
⇒ Processor 의 개수가 중요하다.
FCFS 가 제일 좋지 않을까?
An application can be a set of threads that cooperate and execute concurrently in the same address space
Small differences in thread management and scheduling can have a significant performance impact
프로세스 처리순서는 더 이상 중요하지 않고, Multiprogramming 을 하냐 하지 않냐가 중요해졌다.
application 이 여러 스레드 집합으로 이루어져 있을 때 Multiprocessor System 에서는 한 application 의 스레드들을 동시 실행시키는게 굉장히 중요하다. Ready Queue 에 줄 설 때 스레드들이 각자 줄을 서 있는게 아니라, Process 가 줄을 서는 것이다. (프로세스 단위로) 프로세스 하나를 실행시키면, 이 프로세스의 스레드 개수를 파악하고, 스레드 다섯개 이면, CPU 다섯개를 확보해서 5개의 스레드를 동시에 실행시키는게 굉장히 중요하다.
⇒ Perfomance impact 가 크다.
4가지 스케쥴링 기법이 존재한다.
↳ 동시 스레드 실행 보장하지 못하는 방식이다.
↳ 항상 다른 프로세스 안에 속해 있는 애들을 동시 실행하는 것을 보장하는 방식이다.
단, 조건: 스레드의 개수 < CPU 의 개수
→ 보장이 안되는 경우 Global Queue 를 사용하고, Load Sharing 을 사용할 수 밖에 없다.
↳ 항상 다른 프로세스 안에 속해 있는 애들을 동시 실행하는 것을 보장하는 방식이다.
단, 조건: 스레드의 개수 < CPU 의 개수
→ 보장이 안되는 경우 Global Queue 를 사용하고, Load Sharing 을 사용할 수 밖에 없다.
↳ 가능한 최대한 동시 실행을 보장하지만, 안되면 어쩔 수 없이 넘어간다.
global queue 를 사용한다.
여러개의 CPU 가 존재한다. ← 2개, ..., 16, 32 개 정도
↳ 각각의 CPU 는 작업이 끝나면 다음 작업할 것을 가져온다.
⇒ Load 가 완벽히 분산 된다. ⇒ 모든 CPU 가 똑같은만큼 계속 일한다.
Global queue 자체가 Critical Section 이다.
실제 실행순서 (Dispatching)
queue 는 Critical Section 이어야 한다.
ex) A CPU 와 B CPU 가 하나의 Queue에 동시접근을 하면 안되기 때문에
⇒ 다른 CPU 는 하나의 큐에 동시에 접근할 수 없도록 한다.
⇒ Queue 는 Critical Section
may be a bottleneck when more than one processor looks for
work at the same time
제일 큰 문제점은 bottleneck 이다. 이것 때문에 실행 속도가 느려질 수 있다.
Performance Bottleneck 해결을 위해 Queue 를 별도로 두는 것이다. (하지만 이게 idle while busy 상황보다는 낫다고 판단함)
cache use is less efficient
CPU 를 계속 옮겨 다니면 Cache 는 쓸모가 없다.
If all threads are in the global queue, all threads of a program will not gain access to the processors at the same time
CPU 가 1개일때보단 2개일때 성능이 좋다. 하지만 그렇게 좋아지진 않는다. (2배, 4배 이렇게 증가하진 않는다.)
Despite the potential disadvantages, load sharing is one of the most commonly used schemes
여러가지 단점에도 불구하고 load sharing 은 가장 많이 사용되는 기법이다. 뒤에 나오는 기법들은 CPU 가 수십 ~ 수백개인 경우여야 한다.
But, 우리가 쓰는건 10개정도 뿐이기에 load sharing 이 최선이다!