[2025~] Embedded/Free RTOS
[Free RTOS_014] 블로킹 IO
heylo
2025. 3. 7. 11:59
블로킹 I/O 동작을 태스크가 시스템콜을 호출 했으나
점유하고자 하는 데이터가 준비가 되지 않을 경우
그 동작이 완료 될 때까지
'suspending(blocked)' 상태로 유지되는 것을 말함
운영 프로그램이 키보드 HW에 대해 알고 싶은 것은
한 가지 밖에 없을 것입니다.
사용자가 키보드가 어떤 것을 눌렀나?
애플리케이션/태스크는 함수 getch() 함수를 호출합니다.
이 함수는 애플리케이션/태스크에게
키가 눌렸다/안눌렸다/어떤 키가 눌렸다 이러한
피드백을 줍니다.
사용자 키 처리 함수는 대개 두 가지 처리 방법이 존재합니다.
첫 번째 방법은, 사용자가 HW 버튼 키를 누를 때까지 대기한 후,
키가 눌리면 리턴하도록 구현하는 방법입니다.
두 번째 방법은, 사용자가 키를 누르든 안 누르든,
현재의 키 상태를 가지고 리턴하는 방법입니다.
전자의 경우는 블로킹 I/O 방식이라고 하며
해당 애플리케이션은 사용자가 키를 누를 때까지
휴면 상태에서 대기하게 됩니다.
이때 사용한 함수 getch()를 블로킹 함수라고 부릅니다.
후자의 경우는 논블로킹 I/O 방식이라고 하며
키가 눌리든 안눌리든 상관없이
getch() 함수가 즉각적으로 리턴되기 때문에
애플리캐이션이 이 때문에 휴면하는 일은 없습니다.
kbhit() 함수가 그 좋은 예입니다.
[참고자료] https://blog.naver.com/sharonichoya/220875372940
어떤 상황에서 블로킹 I/O 함수를 사용하고
언제 논블로킹 I/O 함수를 사용하는지를
잘 알아야 합니다.
시스템 호출 (system call)
일반적으로 운영체제의 커널은
HW를 제어하는 SW 장치, 즉 장치 드라이버를 갖추고 있습니다.
운영체제는 애플리케이션이나 태스크가
커널의 디바이스 드라이버를
직접 호출할 수 없도록 막고 있습니다.
직접 호출할 수는 없지만 대신
시스템 호출 함수를 실행하는 것으로
그 목적을 달성할 수는 있습니다.
시스템 호출이 있게 되면,
커널은 내부적으로 시스템 호출 함수에 대응하는
커널 내부의 디바이스 드라이버를 동작시켜서
응용 프로그램이나 태스크의 요청에 응답해줍니다.
리눅스 운영체제는
키보드의 어떤 키가 눌렸는지를 확인할 수 있도록 하기 위해서
이런 getch() 류의 함수들을 지원합니다.