티스토리 뷰

반응형

과도한 반복문에는 가능하면 Sleep()을 주자

과도한 반복문에는 꼭 Sleep()을 주자!

우리는 프로그래밍을 할 때 CPU를 점유하여 빠른 속도로 루틴을 탈출하기를 원한다.
그만큼 많은 자원을 소비하게 되며 빠른 속도를 보장한다.

하지만 이 방법은 내 자신만의 프로그램이 동작 중이거나 단일 Thread프로그램을 만들때만 가능한 이야기다.
Windows 프로그래밍을 할때 Command 프로그램이 아닌이상 UI Thread가 존재 할 것이고 기능을 구현하는 Thread가 존재 할 것이다. 

결국 시분할 방식의 Thread를 사용하면서 CPU의 점유 상태를 공유하면서 자원을 할당 받고 소비하게 된다. 
이러한 멀티 Thread 환경에서는 CPU의 과한 점유를 항상 생각해야 한다. 

"버튼"을 클릭 할때 Application은 Hang(프러그램이 멈추거나 느려지거나 응답없음 등)이 발생한다. 
이유는 UI Thread 내부에서 작업을 하는 다른 Thread가 동작 하고 다른 Thread가 CPU를 독점 하여 UI Thread가 LOCK이 걸리는 현상이다. 

코드로 간단하게 표현을 해보면 아래와 같은 간단한 코드로 CPU 100% 만들 수 있다. 

 

CPU 100% CODE

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
31
/******************************************************************************
* _    _                 _       _  __  _____               _           _     
*| |  | |               | |     | |/ / |  __ \             | |         | |    
*| |__| | __ _  ___     | |_   _| ' /  | |  | | _____   __ | |     __ _| |__  
*|  __  |/ _` |/ _ \_   | | | | |  <   | |  | |/ _ \ \ / / | |    / _` | '_ \ 
*| |  | | (_| |  __/ |__| | |_| | . \  | |__| |  __/\ V /  | |___| (_| | |_) |
*|_|  |_|\__,_|\___|\____/ \__,_|_|\_\ |_____/ \___| \_(_) |______\__,_|_.__/ 
*
* Copyright (c) HaeJuK Dev Lab All Rights Reserved.
*
*******************************************************************************/                                                                             
#include "stdafx.h"
#include <Windows.h>
#include <stdafx.h>
#include <stdio.h>
int main()
{
    unsigned int i = 0 ;  
    while( ture ) 
    {
        i++;
        if( i == 10000000)
        {
            i = 0 ;
        }
    }
    return 0
}
 
 
 
cs

간단한 무한 뻉뻉이 코드이다.  
main Thread가 이렇게 무한 뻉뻉이를 돌면서 CPU를 100% 독점 하고 있다면 이 프로그램에 다른 Thread는 어떠한 일도 못할 것이다. 

이를 해결 할 수 있는 방법은 참으로 간단 하지만 복잡한 방식이 있다.

바로 Sleep()이다. 
Sleep()은 해당 Thread를 잠시 멈추게 할 수 있다. 이 멈춤이 중요하다. 
Thread가 멈추게 되면 CPU는 해당 Thread의 독점을 해지하고 다른 Thread에 자원을 할당하게 된다. 
그럼 자연스럽게 다른 Thread 들이 동작하게 되고 CPU는 다른곳의 일을 시분할로 왕복하면서 처리하게 된다. 

내부 적으로 컨텍스트 스위칭이 복잡하게 이러나지만 그건 CPU가 알아서 해줄것이니 우선 신경 쓰지 말자. 

Sleep() 이용하기

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
/******************************************************************************
* _    _                 _       _  __  _____               _           _     
*| |  | |               | |     | |/ / |  __ \             | |         | |    
*| |__| | __ _  ___     | |_   _| ' /  | |  | | _____   __ | |     __ _| |__  
*|  __  |/ _` |/ _ \_   | | | | |  <   | |  | |/ _ \ \ / / | |    / _` | '_ \ 
*| |  | | (_| |  __/ |__| | |_| | . \  | |__| |  __/\ V /  | |___| (_| | |_) |
*|_|  |_|\__,_|\___|\____/ \__,_|_|\_\ |_____/ \___| \_(_) |______\__,_|_.__/ 
*
* Copyright (c) HaeJuK Dev Lab All Rights Reserved.
*
*******************************************************************************/                                                                             
#include "stdafx.h"
#include <Windows.h>
#include <stdafx.h>
#include <stdio.h>
int main()
{
    unsigned int i = 0 ;  
    while( ture ) 
    {
        i++;
        if( i == 10000000)
        {
            Sleep(3);
            i = 0 ;
        }
    }
    return 0
}
 
cs

 

 

총평

분명 좋은 방법은 아니다. CPU를 과점하여 무조건 실행 해야 되는 코드는 이러한 방식을 사용하면 로직이 꼬일 수 있다.다만 로직이 꼬일 수 있는 프로그래밍을 했다면 이것 자체가 문제이긴 하다( 이벤트 처리방식으로 해야됨) 

CPU의 사용률이나 과점을 간단하게 막을 수 있는 코드는 Sleep()!! 이보다 더 좋고 쉬운 코드는 없는 듯하다. 
100% 정답은 아니나 80%의 효율성이 있으니 꼭 과점을 생각하고 코딩하시길 기원 한다.        

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함