일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- golang
- 우분투
- 자바 디자인 패턴
- 백준 12761번
- 자바
- 파이썬
- 고 배열
- 정렬
- 백준 사이트
- 트리 순회
- flask
- 12761 돌다리
- 백준
- 12761번 돌다리
- String 함수
- 도메인 주도 개발 시작하기
- 몽고디비 렘
- http 완벽가이드
- domain driven develop
- ddd
- http 개념
- 백준 파이썬
- 자바 디자인패턴
- 하둡
- golang struct
- 백준 12761
- go
- 도메인 주도 개발
- hadoop
- MongoDB Realm
- Today
- Total
개발바닥
[ 기술면접 / 컴퓨터구조] 파이프 라이닝 본문
파이프라이닝이란?
명령어를 순차적으로 실행하는 프로세서에 적용되는 기술로, 한 번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어를 실행을 시작하는 식으로 동시에 여러 개의 명령어를 실행하는 기법이다.
이렇게 동시에 여러 개의 명령어를 처리하므로써 처리량을 올리는 것이 파이프라이닝의 핵심이다.
모든 단계는 원래의 동작 속도대로 일을 하면서 처리량을 늘리는 것이지 원래의 동작 속도를 단축시키는 것은 아니다.
아래 그림을 통해서 확인해보겠습니다.
세탁소에서 다음과 같은 순서로 일을 한다고 가정해 보겠습니다.
과정 1: 빨래를 세탁기에 넣는다.
과정 2: 세탁기를 동작시킨다.
과정 3: 건조기를 동작시킨다.
과정 4: 빨래를 갠다.
순차적 처리
세탁물 1,2,3에 대해서 동시에 처리 할 수 없으므로 모든 작업을 마치는데 클럭이 12가 필요하지만
파이프라이닝 유사한 기법을 적용하면 아래와 같이 처리가 가능하다.
그림과 같이 세탁물을 동시에 처리가 가능하므로 총 클럭이 6개만 필요하다.
매 클럭마다 여러 명령어를 중복된 단계 없이 처리한다.
그림 (2)에서 처럼 각 처리부는 독립적으로 동작하므로 클럭 주기 4에서 과정 4, 과정 3, 과정 2, 과정 1을 실행할 수 있다. 즉, 최대 4개의 명령어를 동시에 실행할 수 있다.
명령어를 세분화 할수록 처리 속도 향상을 기대 할 수 있다. (하지만, 실행할 명령어가 하나밖에 없거나 실행할 명령어 수에 비해 지나치게 단계를 세분화하게 되면 효율성을 기대하기 힘들 것이다. 하지만 일반적으로 CPU는 한 개의 명령어가 아닌 수십 개의 명령어를 함께 실행하기 때문에 효과적인 기술이 되고 있다.)
파이프라이닝을 이용하여 명령어들을 실행하는데 걸리는 전체 시간
T = k + (N - 1)
k는 첫 번째 명령어를 실행하는 데 걸리는 주기고, 나머지 (N - 1)개의 명령어들은 각각 한주기씩만 소요된다.
ex) 4 + (4 - 1) = 7
파이프라이닝을 이용함으로써 얻을 수 있는 속도 향상(Sp)
Sp = (k * N) / { k + (N - 1) }
ex) (4*4) / { 4 + (4 - 1) } = 2.2857 향상
가장 효율인 파이프라인 조건
- 각 단계별 처리 시간이 일정 해야한다.
- 각 명령의 처리 단계는 균일 해야한다.
처리 시간이 일정하지도 않고 처리 단계가 균등하지 않아서 문제가 발생하는데 이를 해저드(Hazard)라고 한다.
해저드의 종류
1) 구조적 해저드
- 프로세서의 자원이 부족해서 발생한다.
- 아래와 같이 명령어 2에서 [실행하기]가 1클럭에 안끝날 경우 , 명령어 3에서 [결과쓰기] 수행할 때 멈춤(stall)이 발생한다.
- 또한 명령어 4에서는 [해석하기] 단계가 필요없는 명령어이므로 [실행하기]를 수행하려고할시 명령어 3에서 [실행하기]가 수행되고 있어 이때 또한 stall 이 발생한다.
2) 데이터 해저드
- 이전 명령어의 결과를 기반으로 다음 명령이 수행될 때 파이프라인이 지연되는 경우 생기는 것으로, 컴퓨터 파이프라인에서는 앞선 명령어에 종속성을 가질 때 데이터 해저드가 일어난다.
- 이를 해결하기 위한 방법 중 하나는 바로 전방전달(forwarding) 혹은 우회전달(bypassing) 이다. 이것은 별도의 하드웨어를 추가하여 정상적으로는 얻을 수 없는 값을 내부 자원으로부터 일찍 받아오는 것을 의미하는데, 레지스터나 메모리에 아직 나타나지 않은 데이터를 기다리지 않고 데이터패스를 추가로 하드웨어에 연결하여 내부 버퍼로 부터 가져오는 것이다.
3) 제어 해저드
- 명령어의 실행 순서를 변경하는 Branch , Jump 등 분기 명령어들로 인해 다른 명령어들이 실행 중에 한 명령어의 결과 값에 기반을 둔 결정을 할 필요가 있을 때 일어난다.
- 분기 분의 경우 해당 명령어의 결과값이 나와야 다음 명령어가 수행되는데, 이때 해당 명령어가 끝날때까지 다음 명령어가 멈춤이 발생한다. 이것을 제어 해저드라고 한다.
'개인 공부 > 기술 면접' 카테고리의 다른 글
[ 기술면접 ] C & C++ 차이점 정리 (0) | 2020.04.09 |
---|---|
[ 기술면접 / 운영체제] 세마포어(Semaphore) & 뮤텍스(Mutex) (0) | 2020.03.27 |
[ 기술면접 / 데이터베이스 ] 동시성 제어( Concurrency Control ) (1) | 2020.03.18 |
[ 기술면접 / 데이터베이스 ] 트랜잭션 ( Transaction ) (0) | 2020.03.18 |
[ 기술면접 / 운영체제 ] OS 용어 정리 & 프로세스 (0) | 2020.03.05 |