※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
병렬 처리
동시에 여러 개의 명령을 처리하여 작업의 능률을 올리는 방식을 병렬 처리라고 합니다.
참고) Concurrency ( 동시성 ) 과 Parallelism ( 병렬성 )
- Concurrency : 실제로는 동시에 실행되는게 아닌데, 동시에 실행되는 것 처럼 보이는 것
- Parallelism : 실제로 동시에 여러 작업이 처리되는 것
파이프라이닝 ( Pipelining )
CPU 에서 명렁어가 실행되는 과정을 살펴보면… 공장의 컨베이어 벨트와 비슷하다고 볼 수 있습니다.
- 명령어 패치 ( IF ) : 다음에 실행할 명령어를 명령어 레지스터에 저장
- 명령어 해석 ( ID )
- 실행 ( EX ) : 해석한 결과를 토대로 명령어 실행
- 쓰기 ( WB ) : 실행된 결과를 메모리에 저장
이렇게 차례차례 실행되다보니, 시간이 너무 오래걸린다는 문제점이 존재했습니다.
그래서 명령어를 겹쳐서 실행하는 방법 ( 분업화 ) 으로, 하나의 코어에 여러 개의 스레드를 실행하는 방식인 파이프라인 이 도입되었습니다.
병렬 처리 시 고려 사항
- 상호 의존성이 없어야 함
- 각 명령이 독립적이고, 앞의 결과가 뒤의 명령에 영향을 미치지 않아야 함
- 각 단계별 처리 시간이 일정해야 함
- 만약 각 단계별 처리 시간이 다르다면 ( 앞 작업은 처리하는데 시간이 오래걸리고, 뒷 작업은 처리하는데 시간이 빨리 걸리는 경우 )
- 진행이 전반적으로 밀려서 전체 작업 시간이 늘어나게 되고
- 이는 즉, 병목 현상이 발생하게 됨
- 전체 작업 시간을 몇 단계로 나눌지 잘 따져봐야 함
- 일반적으로 작업을 많이 나누면 성능이 올라가지만, 너무 많이 나누면 다음 작업으로 이동하는데 시간이 오래걸려 오히려 성능이 떨어질 수 있음
Pipeline hazard
하지만, 현실에선 처리 시간이 일정하지도 않고, 처리 단계 또한 균등하지 않습니다.
이로 인해 여러가지 문제들이 발생하게 되는데, 이 발생하는 문제들을 해저드 ( hazard ) 라고 부릅니다.
해저드의 종류를 살펴보면 다음과 같습니다.
- Structrual hazard ( 구조 해저드 )
- 자원이 부족할 때 발생
- 해결책 : 자원 확보 ( 메모리 ↑ ), 자원이 나올 때 까지 기다리기
- Control hazard ( 제어 해저드 )
- 프로그렘의 의존성에 의해 발생
- 분기에 의해 프로그램 제어 순서가 바뀌면, 명령어를 교체해야 함 ( 파이프라인 내 명령어들이 쓸모가 없어짐 )
- 해결방안 : 기다리기, 예측 ( Predict branches ), 우선 실행 ( Fast branches )
- Data hazard ( 데이터 해저드 )
- 이전 명령어의 결과를 기반으로 다음 명령이 수행될 때 발생 ( 의존성 문제 )
- 해결방안 : 대기, 전방전달, 비순차실행, 리펙토링 등등
다양한 병렬처리
- Super Scalar ( 슈퍼스칼라 )
- 파이프라인 안에 코어를 여러개 구성
- 여러개의 명령어가 동시에 실행되도록 하는 방식
- Super-Pipeline ( 슈퍼파이프라인 기법 )
- 파이프라인의 각 단계를 세분하여 한 클록 내에 여러 명령어를 처리
- 병렬 처리 능력이 높아짐
- Super-Pipelined Super-Scalar ( 슈퍼파이프라인 슈퍼스칼라 기법 )
- 슈퍼파이프라인 기법을 여러 개의 코어에서 동시에 수행
- VLIW ( Very Long Instruction Word )
- CPU 가 병렬 처리를 지원하지 않을 경우, 소프트웨어적으로 병렬 처리 진행
- 하지만, 만들기가 어려움
- 속도 향상도 딱히..
- SIMD ( Single Instruction Multiple Data )
- 하나의 명령어로 여러개의 데이터를 한번에 처리하는 기법
- 현재도 많이 쓰이는 기법