스레드 05. 비동기 프로그래밍과 컨텍스트 스위칭
1. 동기식 vs 비동기식
- 동기식 프로그래밍에서는 하나의 작업이 완료될 때까지 CPU는 그 작업을 기다려야 합니다. 예를 들어, 네트워크 요청을 보내고 응답을 기다릴 때, 해당 스레드는 다른 일을 할 수 없고, I/O 작업이 끝날 때까지 대기해야 합니다. 이때 스레드가 차단(blocked)되어 있으므로, 운영체제는 다른 스레드로 컨텍스트 스위칭을 하여 CPU 자원을 할당하려고 합니다.
- 비동기식 프로그래밍에서는 작업이 끝날 때까지 스레드가 대기할 필요 없이, 작업이 완료되면 이를 처리할 콜백 함수나 프라미스(약속)로 이어집니다. 즉, 스레드가 차단되지 않으며 다른 작업을 계속 처리할 수 있습니다. 이 방식은 I/O 작업이 끝날 때까지 CPU가 대기하지 않고, 효율적으로 다른 작업을 처리할 수 있게 해줍니다.
2. 비동기 방식의 작동 원리
비동기 프로그래밍에서는 스레드가 실제 I/O 작업을 직접 처리하지 않고 작업이 완료되었을 때 알림을 받습니다. 이때 중요한 점은 I/O 작업이 비동기적으로 진행되는 동안 스레드는 자유롭게 다른 작업을 처리할 수 있다는 것입니다.
예를 들어:
- 파일을 비동기로 읽는 작업을 요청하면, 스레드는 이 작업이 끝날 때까지 기다리지 않고 바로 다른 작업을 처리합니다.
- 파일 읽기 작업이 완료되면, 콜백 함수나 프라미스(Promise)를 통해 완료된 작업을 처리할 수 있습니다.
이 방식은 하나의 스레드가 여러 작업을 동시에 관리할 수 있도록 해주며, 스레드가 불필요하게 차단되어 컨텍스트 스위칭을 유발하는 일을 줄입니다.
3. 컨텍스트 스위칭 줄어드는 이유
컨텍스트 스위칭은 스레드가 차단(blocked)되어 다른 작업을 처리할 수 없을 때 발생합니다. 동기식 프로그래밍에서는 I/O 작업을 처리하는 동안 스레드가 차단되기 때문에 운영체제는 그 스레드가 대기하는 동안 다른 스레드로 전환하여 작업을 계속 처리하게 됩니다. 이때 컨텍스트 스위칭이 일어납니다.
하지만, 비동기 프로그래밍에서는 스레드가 차단되지 않으므로, I/O 작업을 기다리지 않고 바로 다른 작업을 처리할 수 있습니다. 즉, 스레드가 차단되지 않으므로 컨텍스트 스위칭이 불필요해지는 것입니다. 이는 전체 시스템에서 스레드 전환 비용을 크게 줄이고, 스레드를 더 효율적으로 사용할 수 있게 해줍니다.
4. 비동기 프로그래밍의 장점
비동기 프로그래밍은 스레드 수를 최소화하고도 많은 작업을 효율적으로 처리할 수 있기 때문에, 컨텍스트 스위칭 비용을 줄이는 데 유리합니다.
- 동기식 프로그래밍에서는 많은 스레드가 필요할 수 있습니다. 예를 들어, 각각의 I/O 작업마다 하나의 스레드가 필요하며, 이 스레드들이 I/O 작업을 대기하는 동안 다른 스레드로 계속 스위칭이 발생하게 됩니다.
- 비동기식 프로그래밍에서는 하나의 스레드로도 여러 I/O 작업을 동시에 관리할 수 있습니다. 이 스레드는 작업이 완료되면 이벤트 루프에서 처리하거나 콜백을 실행하여 작업을 이어갈 수 있습니다. 결과적으로 더 적은 스레드로 더 많은 작업을 처리할 수 있으며, 스레드가 차단되어 컨텍스트 스위칭이 일어날 필요가 없어집니다.
5. 예시로 보는 비동기 방식의 이점
동기식 예시
// 동기식으로 네트워크 요청을 처리하는 경우
public void makeRequest() {
String result = networkRequest(); // 이 요청이 끝날 때까지 스레드는 대기
processResult(result); // 결과를 처리
}
위 코드에서는 네트워크 요청을 보내고 응답이 올 때까지 스레드는 차단됩니다. 이때 컨텍스트 스위칭이 일어나 다른 스레드가 실행될 수 있으며, 이는 CPU 오버헤드가 발생할 수 있습니다.
비동기식 예시
// 비동기식으로 네트워크 요청을 처리하는 경우
public void makeRequest() {
networkRequestAsync(result -> {
processResult(result); // 요청이 끝난 후에 콜백 함수로 처리
});
}
비동기식 코드에서는 네트워크 요청을 보내는 순간 스레드는 대기하지 않고 바로 다른 작업을 처리할 수 있습니다. I/O 작업이 완료되면 결과를 처리하는 콜백이 호출됩니다. 이 방식은 스레드 차단 없이 작업이 이루어지므로 컨텍스트 스위칭이 발생하지 않습니다.
요약
- 비동기 프로그래밍에서는 스레드가 차단되지 않고 다른 작업을 처리할 수 있으므로, 불필요한 컨텍스트 스위칭을 줄일 수 있습니다.
- 동기식 프로그래밍에서 I/O 바운드 작업을 처리할 때는 스레드가 작업이 끝날 때까지 차단되므로, 이 대기 시간 동안 CPU 자원을 효율적으로 사용하기 위해 컨텍스트 스위칭이 발생합니다.
- 비동기 방식은 작업이 끝날 때 스레드가 차단되지 않고 계속 다른 작업을 수행하게 하므로, 스레드가 대기 상태에 빠지지 않아 컨텍스트 스위칭이 발생할 필요가 없습니다.
- 비동기 프로그래밍은 스레드 자원을 더 효율적으로 사용하고, 컨텍스트 스위칭 오버헤드를 줄이는 데 매우 유리한 방식입니다.