본문 바로가기

computer science

CPU 바운드, I/O bound, 블로킹

코드 실행 시 실행이 지연되는 현상이 발생하고는 합니다. 이런 현상을 "블로킹"이라고 부릅니다. 프로그램을 최적화하거나 성능을 개선하려면 블로킹의 원인이 CPU 바운드인지 I/O 바운드인지 파악하여 적합한 방법으로 개선 작업을 진행하는 것이 중요합니다. 

 

CPU 바운드

 

CPU 바운드 상태에서는 프로그램이 다른 자원들보다 CPU 연산에 더 많은 시간을 소비합니다. 이는 프로그램이 수행해야 할 연산이 많고 복잡하거나, 데이터 처리가 많이 필요한 경우에 발생할 수 있습니다. 이러한 경우에는 CPU가 연산을 처리하기 위해 많은 시간과 노력을 필요로 하기 때문에 전체적인 성능이 저하될 수 있습니다.

 

아래 코드를 실행하면, CPU 바운드가 발생하여 실행 이후에도 지연이 생깁니다. 

def cpu_bound_func(number: int):
    total = 1
    arrange = range(1, number + 1)
    for i in arrange:
        for j in arrange:
            for k in arrange:
                total *= i * j * k
    return total


if __name__ == "__main__":
    result = cpu_bound_func(100)
    print(result)

 

 

 

 

I/O 바운드

 

I는 Input을 의미하고, O는 Output을 의미하는데, I/O 바운드는 CPU 성능보다는 입출력(예: 디스크 또는 네트워크) 작업이 제한적인 상황을 말합니다. 이러한 경우에는 프로그램이 데이터를 읽고 쓰는 데 시간이 더 많이 소요되며, CPU는 상대적으로 덜 사용됩니다.

 

아래는 코드 실행 시에, 사용자가 값을 입력할 때까지 지연됩니다. 이럴 때 I/O 바운드가 발생하는데, 상황에 따라서 사용자가 아니라 네트워크로 인한 지연이 될 수도 있습니다.

def io_bound_func():
    print("값을 입력해주세요")
    input_value = input()
    return int(input_value) + 100


if __name__ == "__main__":
    result = io_bound_func()
    print(result)

 

 

네트워크 지연 예시 

import requests
import time

def io_bound_func():
    result = requests.get("https://google.com")
    return result


if __name__ == "__main__":
    start_time = time.time()
    result = io_bound_func()
    result = io_bound_func()
    result = io_bound_func()
    result = io_bound_func()
    result = io_bound_func()
    result = io_bound_func()
    result = io_bound_func()
    result = io_bound_func()
    print(time.time() - start_time)
    pass

 

결과 > 3.0890870094299316초