Burst(버스트)
버스트는 '한 작업을 연속적으로 처리하는 것'으로, 보통 작업 처리에 필요한 시간을 의미한다.
따라서 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)
참고
- 기본 개념과 그림들을 참고했다.
- 코드 예시를 참고했다.