From 54f5c0e0ae75f7720b88daf46752bbc7ca4aee63 Mon Sep 17 00:00:00 2001 From: ky0422 Date: Thu, 7 Nov 2024 13:38:31 +0900 Subject: [PATCH] Update 2024-10-25-os.md --- _posts/fast/2024-10-25-os.md | 37 +++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/_posts/fast/2024-10-25-os.md b/_posts/fast/2024-10-25-os.md index ccae1eb..7b983bb 100644 --- a/_posts/fast/2024-10-25-os.md +++ b/_posts/fast/2024-10-25-os.md @@ -857,7 +857,42 @@ CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터 #### 2-1-7-3. 비순차적 실행 -TODO +앞서 **데이터 해저드**에 대해 설명했다. 이는 명령어끼리의 의존성 때문인데, 그럼 의존성이 없는 명령어의 순서를 바꾸면 되지 않을까? 라는 생각을 할 수 있다. +이 생각이 바로 **비순차적 실행(Out-of-Order Execution, OoOE)**이라고 한다. 아래의 예시 의사코드를 보자. + +``` +1 M1 = 1 + 2 +2 M2 = M1 + 3 +3 M3 = 3 + 4 +4 M4 = M3 + 5 +``` + +이는 아래와 같이 표현될 수 있다. + +| | t₁ | t₂ | t₃ | t₄ | t₅ | t₆ | t₇ | t₈ | t₉ | t₁₀ | +| ----- | ------- | ------- | ------- | ------- | ------- | ------ | ------- | ------ | ------- | ------ | +| I1 | Fetch | Decode | Execute | Store | | | | | | | +| I2 | | | | | Fetch | Decode | Execute | Store | | | +| I3 | | | | | | Fetch | Decode | Execute | Store | | +| I4 | | | | | | | Fetch | Decode | Execute | Store | + +`I2`는 `I1`이 처리된 후 실행될 수 있고, 그 이후 `I3`가 처리되기 때문에 그 중간은 비어있게 된다. 그럼 아래와 같이 바꾸면 어떨까? + +``` +1 M1 = 1 + 2 +3 M3 = 3 + 4 +4 M4 = M3 + 5 +2 M2 = M1 + 3 +``` + +| | t₁ | t₂ | t₃ | t₄ | t₅ | t₆ | t₇ | t₈ | t₉ | t₁₀ | +| ----- | ------- | ------- | ------- | ------- | ------- | ------ | ------- | ------ | ------- | ------ | +| I1 | Fetch | Decode | Execute | Store | | | | | | | +| I3 | | Fetch | Decode | Execute | Store | | | | | | +| I4 | | | Fetch | Decode | Execute | Store | | | | | +| I2 | | | | | Fetch | Decode | Execute | Store | | | + +이렇게 순서를 바꾸도 결과엔 문제가 없다. `I1 I2`와 `I3 I4`는 서로 의존성이 없고, `I1`과 `I2` 사이에 들어와도 작동엔 문제가 없기 때문에 순서를 바꾸는것이 더욱 효율적이다. ### 2-1-8. 명령어 집합 구조