CPU와 메모리는 버스로 연결.
a : 가장 기본적인 형태. CPU가 많아질수록 병목이 생김
b : 슈퍼컴퓨터 -> 컴퓨팅모드(메모리+CPU합체)가 따로 존재 -> 인터커넥트라는 빠른 버스로 서로 연결
c : 분산 시스템 -> 분리되어 인터넷으로 연결 : 클라우드 컴퓨팅 환경 -> 데이터 복사시 여러번 복사하니 오버헤드가 클 수 있음
우리는 a,b형태에 집중. a는 메모리 접근시간 거의 동일하지만 b는 로컬이냐 원격이냐에따라 차이. 어떻게 관리할 지, 스케쥴링 할 지 중요해짐
UMA : cpu에서 메모리 접근 속도가 동일
NUMA : 로컬메모리 접근 속도랑 원격지 메모리 접근 속도랑 다르다.
a : cpu가 많아질수록 하나의 메모리에 접근하니 병목 발생.
b : CPU에 캐시가 있음 : cash coherency(일관성) protocol 필요
-> 스누핑 회로를 만듦 : 자기 캐시에 어드레스를 알고 있으니까 버스 모니터링 하다가 동일한 캐시엔트리의 데이터가 메모리에 기록되면 내 캐시엔트리를 invalidate 후 업데이트 -> 일관성 유지
c : private 메모리를 둠. 많이쓰는 데이터를 여기 저장
-> 누마랑은 다름(프라이빗과 쉐어드가 속도는가 비슷해서 우마라고 해줌). 그저 버스로 연결되고 로컬메모리만 추가 된 것.
크로스바 스위치 : CPU가 많아질수록 병목이 생기는 bus 대신 제안된 것
-> 빠르지만 스위치가 비싸
멀티 스테이지 스위칭 : 패킷 스위칭 방식 사용.
CPU/메모리가 8개이므로 8=2^3, 3단계의 스위치 필요
메모리의 모듈 번호를 보고 1이면 아래로, 0이면 위로 가는 것. -> 결국엔 cpu가 많아지면 병목이 생김.
NUMA
1. 각 컴퓨팅노드가 인터커넥션 네트워크로 연결, 각 로컬메모리가 하나의 주소공간에 묶임 -> 하나의 큰 메모리가 됨
2. 시간이 걸리지면 직접 LOAD와 STORE로 메모리에 접근 가능
3. 리모트 메모리에도 같이 데이터에 접근 가능. 로컬 메모리보단 느림
---------------
(a)보면 총 256개 노드니까 4gb/256 = 16mb -> 로컬 메모리가 16mb. 이걸 64바이트 블록으로 쪼개서 각자의 메모리 블록이 어디에 있는지에 대한 정보를 각자의 디렉토리라는 하드웨어가 가지고 있음 : 디렉토리 베이스 멀티프로세스 시스템
if) 0에서 1의 메모리에 있는게 필요 -> 1의 디렉토리에 질의 -> 1의 CPU가 가져오고 -> 0의 CPU가 데이터 달라해서 작업 수행
--------------
(b)는 디렉토리 : 블록이 64바이트니까 옵셋 6, 256개 노드니까 노드 8, 나머지는 블록 번호
-> 노드번호보고 블럭번호 보고 노드의 블럭으로 접근
멀티코어 : 운영체제 코드를 여러 CPU에서 동시에 실행 -> 데이터 보호해야 하니 락을 사용
이후 마스터-슬레이브의 2번단계, 최종적으로 시메트릭 시스템 3번 단계 사용
-> 여전히 cpu가 늘면 lock contention(다툼)이 높아진다 : 애를 먹음. RCU가 최신의 한 방법
초창기 : 단일 프로세스에서 동작하는 CPU니까 메모리를 파티셔닝, 데이터가 각각 동작
-> 사실상 운영체제가 독립적으로 동작하는 시스템과 동일 : I/O 요청(+인터럽트)도 공유하기 힘듬
마스터-슬레이브 : 운영체제는 마스터 CPU에서만 동작, 나머지는 유저프로세스만 동작.
슬레이브의 프로세스가 시스템 콜 호출하거나, 인터럽트 같은걸 발생시키면 스케쥴링되어 마스터가 처리
-> 마스터가 병목이 생겨 성능이 안나옴
모든 CPU에서 같은 운영체제 동작. 락이 존재. 핵심이 락.
일관성 복습. 각 CPU 메모리에 똑같은 데이터. 버스 모니터링 하다가 바뀌면 이 프로토콜이 자기 캐시 라인을 invalidate시킴.
락 메커니즘(데커 피터슨 등) 구현 동작이 느려서 TSL(테스트 앤 락)명령어의 도움을 받음, 이는 atomic해야함.
CPU 1,2의 락 변수(메모리에 있는)가 초기에 0으로 세팅 -> 각 CPU에서 쓰려고 함 -> TSL명령어를 수행 전 버스에 락 명령어
-> 다른 CPU가 접근 못하게 막은 후 TSL 명령어 수행. 밀린 애는 spin하면서 대기 -> 버스락이 빈번해짐.
- 1이 유지되면 TSL을 하지 않는(busy waiting 막아주는) 리바이스드 TSL 알고리즘
- 실패할 때마다 대기시간 늘리는 exponential backoff 알고리즘 like tcp 컨제스천 컨트롤
private lock variable : 락 변수 역시 카피본이 있으면 카피본을 invalidate시켜야 함.
-> 락 변수 점유한 CPU가 나머지도 다 변경해줌 : 각 CPU가 자기 락 변수만 관찰하기 때문에 캐시 쓰래씽 일어나지 않음.
멀티 프로세서 스케쥴링
타임 쉐어링 : 글로벌 큐에서 순서대로 가져다가 실행
1. 모든 프로세서가 글로벌 큐를 공유
2. 락을 점유하는 스레드는 락을 릴리즈 할 수 있으니 타임슬라이스를 좀 더 할당하여줌(락 컨텐션 줄여주는 효과)
3. 캐시 어피니티 : 어떤 스레드가 특정 시피유에서 실행하면 스레드에 접근하는 데이터가 CPU캐시에 쌓임 -> 실행됐던 CPU(코어)에서 재실행 -> 각 CPU마다 로컬큐가 있어야 함.
스페이스 쉐어링 : 어플리케이션이 CPU어떻게 나눌건지 정해주면 그에 맞춰서 파티셔닝 해서 스케쥴링 되도록 함
갱 : 그룹 -> 같은 그룹의 스레드를 한번에 스케쥴링
기존 : 위처럼 동일 그룹간에 요청과 응답을 주고받는데, 동일한 시간에 스케쥴링 안되면 실행이 잘 안됨 -> 같은 그룹 애들 먼저 실행시키자!
1. 서로 연관된 스레드를 갱=그룹으로 만듦
2. 갱의 모든 멤버는 서로 다른 CPU에서 동시에 수행
3. 동일한 시간 간격에서 시작, 정지
ㅇ
이렇게 A0~5까지 한 타임슬롯에서 스케쥴링 해주는것.
'UOS@운영체제' 카테고리의 다른 글
[운영체제] 6. 데드락 (0) | 2023.06.14 |
---|---|
[운영체제] 5. I/O(입출력) - 2 (0) | 2023.06.14 |
[운영체제] 5. I/O(입출력) - 1 (0) | 2023.06.14 |
[운영체제] 4. 파일시스템 2 (0) | 2023.06.10 |
[운영체제] 4. 파일시스템 (0) | 2023.06.10 |