임베디드 스터디 - 동기/비동기 드라이버
임베디드 스터디 - 동기/비동기 드라이버
Blocking I/O
- 데이터가 없으면 프로세스를 SLEEP 시키고 대기
wait_queue를 사용하여 데이터 도착 시 WAKE UP
1
2
3
fd = open("/dev/ttyS0", O_RDWR);
ret = read(fd, buf, size);
// 데이터 없으면 → SLEEP → 데이터 도착 시 WAKE UP → 반환
- 장점 : CPU를 낭비하지 않음
- 단점 : 한 번에 1개 장치만 처리 가능
Non-blocking I/O
- 데이터가 없으면 SLEEP 대신 즉시 -EAGAIN 반환
1
2
3
fd = open("/dev/ttyS0", O_RDWR | O_NONBLOCK);
ret = read(fd, buf, size);
// 데이터 없으면 → 즉시 -EAGAIN 반환 (SLEEP 안 함)
- 장점 : 다중 장치 처리 가능
- 단점 : 애플리케이션이 계속 폴링 → Busy Wait (CPU 낭비)
select / poll / epoll
- Blocking도 Non-blocking 폴링도 아닌 “준비된 것이 생기면 알려줘” 방식
1
2
3
select(nfds, &read_fds, ...);
// UART 또는 키보드 중 하나라도 데이터 오면 깨어남
// 둘 다 없으면 SLEEP
- 여러 fd를 동시에 감시하다가 하나라도 준비되면 WAKE UP
- CPU 낭비 없이 여러 장치를 효율적으로 처리
비교 요약
| 데이터 없을 때 | CPU 사용 | 다중 장치 처리 | |
|---|---|---|---|
| Blocking I/O | SLEEP | 적음 | ❌ 한 번에 1개 |
| Non-blocking I/O | -EAGAIN | 많음 (Busy wait) | ⚠️ 가능하나 비효율 |
| select/poll | SLEEP (fd 감시) | 적음 | ✅ 효율적 |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.