출처: https://devraphy.tistory.com/339 [개발자를 향하여:티스토리]
(출처는 위 링크! 형광펜은 개인적으로 공부하면서 체크한 부분입니다)
1개의 작업을 처리하는데 5개의 마이크로 연산을 수행해야 된다고 해보자.
ex) 작업 = 덧셈 (A, B)
ex) 마이크로연산 = 명령어 로드, 명령어 해석, 오퍼랜드 검색, 연산, 인터럽트 발생유무 등
1개의 작업을 마치는데 5초의 시간이 걸린다고 할 때,
이처럼 순차적으로 작업을 처리할 때, 5개의 작업을 처리하려면 총 25초의 시간이 걸린다. (아래 그림참고)
그러나 병렬처리의 경우, 이야기가 다르다.
병렬처리는 단일 CPU가 아니라 다수의 CPU를 가지고 있기 때문에, 동시연산이 가능하다. (아래 그림참고)
동시 처리가 가능하기에 작업 5개를 완료하는데 5초가 걸린다.
파이프 라인은 병렬처리 시스템과 유사한 연산속도를 만들기 위해, 다음과 같은 방식을 사용한다.
위의 그림처럼, 중첩을 이용하여 25초 보다 적은 시간안에 동일한 작업량을 처리할 수 있게 하는 것이다.
작업 1의 1번 연산이 끝나면 해당 연산에 필요한 자원을 놀게 놔두는 것이 아니라, 다음 작업2의 1번 연산을 할당하는 것이다.
당연히 병렬 처리시스템 만큼의 연산 수행속도를 뽑아낼 수는 없다.
다만, 기존의 순차적 실행보다 훨씬 시간을 단축 시킬 수 있다.
클럭펄스 - 다음 단계의 마이크로 연산으로 넘어갈 때 발생하는 전기신호
세그먼트 - 단계와 시점을 의미
파이프라인은 1개의 CPU를 병렬처리시스템 처럼 사용하기 위해 만들어진 기법이다.
즉, 코드를 처리 및 수행하는 방법론으로, 가성비를 극대화 시키기 위한 방법이라고 이해하면 좋을 것 같다.
파이프라인은 순차적으로 데이터를 처리하지만 병렬적으로 처리할 수 있도록 하는 기법이다.
하나의 프로세스를 여러개의 서브 프로세스로 나누어, 동시에 서로 다른 데이터를 처리하도록 하는 기법이다.
서브 프로세스가 갖는 각각의 작업을 Segment(세그먼트)라고 부르며
하나의 서브 프로세스는 여러개의 segment를 갖을 수 있다.
어떤 세그먼트에서 수행된 연산의 결과가 순차적으로 다음 세그먼트에게 넘어가는 방식으로 동작한다.
/+
이전 명령어가 다른 세그먼트에서 실행되고 있는 동안, 메모리에 연속적으로 저장되어 있는 다음 명령어를 읽어 옴으로 fetch와 실행이 중첩되어 동시에 수행되는 구조이다.
분기가 발생 할 경우(가장 큰 취약점) 현재 파이프라인은 모두 비워져야 하고 분기 명령 이후 메모리에서 있어온 명령어는 모두 무시되어야 한다.