티스토리 뷰

Study/OS

[OS] Mint64OS 14절 Queue를 이용한 키보드 입력

생각많은 소심남 2013. 1. 24. 16:31

전전 포스트에서도 이야기 했다시피 키보드 입력을 받을 때 인터럽트 방식을 적용하면 일일이 프로세서가 감시할 필요가 없기 때문에 효율성 측면에서  더 좋다고 했었다. 지난 포스트에서 다룬 인터럽트 핸들러를 이제 키보드 입력에 집어넣는 부분이다.

 사실 인터럽트 방식에서도 생길 수 있는 문제 중 하나는 키보드 입력이 "언제" 들어왔는지를 알 수 없다는 것이다. 매번 말했다시피 키보드 입력이 들어올 때만 인터럽트가 걸리기 때문에 전체적인 테스크 상에서 입력이 들어온 시점은 인터럽트 발생 시점과 동일하고, 따라서 주기도 불규칙하다. 이와중에 입력받은 스캔코드 값을 알아야 전달할 수 있기 때문에 문제가 발생하는데 이 책에서 언급하는 방법은 바로 버퍼를 활용해서 값을 전달받는 방식이다. 

 키보드 핸들러를 통해서 키가 입력되면 버퍼에 저장되고, 화면 출력시에는 버퍼에 들어있는 값을 읽어와서 뿌려주게 된다. 하지만 한번 출력된 값은 또 출력할 필요가 없으니까 그대로 빠지게 되는데 바로 여기서 Queue라는 개념이 들어간다. 즉, 넣어준 키의 순서만큼 먼저 빠져나와 화면상에 보여주는 것이다. 당연한 이야기겠지만 큐에서 적용되는 개념은 Put 과 Get 딱 두개이고, 이에 따른 문제점은 일반 자료구조 시간에 배운 내용과 동일한 듯 하다.

 화면의 이미지는 IDT 중 33번에 정의되어 있는 Keyboard ISR이 실행되고 있음을 보여준다. 물론 키보드의 입력이 진행되면 이 ISR이 수행되기 때문에 그 수행 횟수를 화면상에 출력되게끔 되어있다. 생각해볼 점은 key의 입력시 줄 수 있는 state가 눌렀을 때 1번, 뗐을 때 1번, 총 2번 걸린다는 것이다. 그래서 우리가 키를 한번 입력한 순간에 ISR은 2번 수행되게 된다.



댓글