포스트

임베디드 스터디 - 동기/비동기 드라이버

임베디드 스터디 - 동기/비동기 드라이버

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/OSLEEP적음❌ 한 번에 1개
Non-blocking I/O-EAGAIN많음 (Busy wait)⚠️ 가능하나 비효율
select/pollSLEEP (fd 감시)적음✅ 효율적
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.