버스트는 '한 작업을 연속적으로 처리하는 것'으로, 보통 작업 처리에 필요한 시간을 의미한다.
따라서 CPU(I/O) 버스트는 각각 CPU 명령 수행과 I/O(입출력 요청) 처리까지 걸리는 시간이라고 이해하면 된다.
프로그램은 CPU 버스트와 I/O 버스트가 번갈아가며 반복되는 방식으로 실행된다.
I/O 버스트의 특징
I/O 버스트의 경우, 기본적으로 장치의 속도가 느리고, 추가로 커널 요청 작업까지 필요하기 때문에, CPU 버스트에 비해 상대적으로 긴 시간이 소요 된다는 특징이 있다.
실제로 I/O는 아래와 같은 복잡한 Cycle로 처리된다.
CPU 버스트의 양상
CPU 버스트는 주로 CPU가 실행이 많이 필요한 작업을 수행할 때나, I/O 처리를 요청할 때 수행된다.
I/O 요청 과정에선 CPU 버스트가 작고, CPU 연산이 많이 요구되는 작업에선 CPU 크다. 전반적인 CPU 버스트의 양상을 확인해보면, 아래의 그래프처럼 대다수의 짧은 버스트와 소수의 긴 버스트로 구성된다.
Bound(바운드)
프로그램의 역할이 다른 만큼, CPU 버스트와 I/O 버스트의 실행 비율 또한 다르다.
상대적으로 CPU 버스트가 많은 프로그램을 CPU Bound(바운드)라고 하고, I/O 버스트가 많은 프로그램을 I/O Bound(바운드)라고 한다.
위 그림은 CPU Bound와 I/O Bound 프로그램의 대략적인 버스트 양상을 나타낸 것이다.
CPU Bound Job
프로그램의 실행 속도가 CPU 속도에 의해 제한되는 경우를 의미한다.
CPU 버스트가 많은, 복잡한 수학적 연산이 필요할 경우 발생한다.
아래의 코드처럼 반복적인 연산이 요구될 경우 CPU 바운드가 발생할 것이다.
# 연산량이 커지면, 프로그램 실행 속도가 영향
# CPU - 바운드
def cpu_bound_func(number: int):
total = 1
arange = range(1, number + 1)
for i in arange:
for j in arange:
for k in arange:
total += i * j * k
return total
if __name__ == "__main__":
result = cpu_bound_func(200)
print(result)
I/O Bound Job
I(input), O(ouput)에 의해 프로그램 실행 속도가 제한되는 경우를 의미한다.
일반적으로 사람에 의한 입, 출력에 의해서 발생한다.
사용자의 입력 전까진 프로그램이 실행되지 않음
# i : input, o : ouput
# 입-출력에 의해 프로그램 실행 속도가 제한되는 경우
def io_bound_func():
print("값을 입력해주세요.")
input_value = input()
return int(input_value) + 100
if __name__ == "__main__":
result = io_bound_func()
print(result)
서버 사이 네트워크 통신에 의해서도 발생 가능
GET 요청이 실패할 경우 프로그램이 실행되지 않음
import requests
def io_bound_func():
result = requests.get("<https://google.com>")
return result
if __name__ == "__main__":
# 네트워크에 의한 io-bound 발생
for i in range(10):
result = io_bound_func()
print(result)