Post

키보드를 'a' 키를 누르면 어떤일이 일어날까?

개요

컴퓨터 하면 무엇이 떠오르시나요?일반적으로 사람들이 생각할때 컴퓨터 하면 떠오르는것은 모니터, 키보드, 마우스, 스피커, 본체 정도가 아닐까 싶습니다.

컵퓨터가 무엇인지 조금더 구체적으로 생각해 보겠습니다. 컴퓨터의 가장 중요한 부품은CPU 입니다. 사람의 ‘뇌’ 에 해당하는 부품 입니다. 컴퓨터에서 일어나는 모든 연산을 바로 이 CPU가 처리합니다. 그런데 무엇으로 연산을 할까요? 아무것도 없는 상태에서는 어떠한 연산도 진행할 수 없습니다. 예를들어 1+2라는 연산을 진행하려면 1과 2를 어딘가에서 가져와야 합니다. 바로 이 1,2를 저장 있는 곳이 메모리 입니다.

컴퓨터란 CPU + 메모리 + 주변기기 로 간단하게 생각해 볼 수 있습니다. 물론 현실은 더 복잡하겠지만 일이죠.

본론

입력

그렇다면 사용자가 키보드를 누르면 어떤일이 발생 할까요? 키보드의 버튼을 클릭하면 쉽게 화면에 버튼의 내용이 출력되는것 같지만 여기엔 상당히 복잡한 과정이 있습니다. 간단히 설명해 보겠습니다. 키보드를 누르면 하드웨어레벨에서 인터럽트가 발생하여 운영체제에 입력이 발생했음을 알립니다. 운영체제는 해당 키 입력을 읽어와 메모리 어딘가에 공간을 할당하고 값을 저장합니다. 바로 이 공간이 입력버퍼 입니다. 사용자가 입력한 데이터는 입력 버퍼에 저장된 상태로 프로세스에 전달됩니다. 프로세스는 표준 입력 스트림(stdin)을 통해 입력 버퍼에서 데이터를 읽습니다.

연산

프로세스는 읽어온 값을 바탕으로 CPU를 활용하여 연산을 진행 하고 결과를 만들어 냅니다.

출력

연산을 통해 결과값을 만들어 냈다면 결과를 사용자에게 전달하기 위해 다시 버퍼를 사용합니다. 프로세스는 결과값을 출력버퍼(운영체제게 할당한 메모리 어느 공간)에 넣습니다. 그리고 출력 준비가 다 되었다면 인터럽트를 발생시켜 출력 하고자 하는 주변 장치에게 알려 줍니다. 주변장치는 출력 버퍼로부터 값을 읽어와서 출력 작업을 실행하게 됩니다. 출력은 스피커를 통한 소리정보일수도, 모니터를 통한 시각정보일 수 있겠지요 (매우 다양합니다.)

예제

input_output.jpg 아래의 코드는 위에서 설명한 입력, 연산, 출력의 과정을 아주 간단하게 코드로 구현해 본것입니다. 코드에 관해 간단히 설명하자면 사용자로부터 문자 하나를 입력받고 입력받은 문자에 3을 더한 결과를 출력하는 코드 입니다.

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void) 
{
    char ch = 0;
    ch = getchar();
    ch += 3;
    putchar(ch);

    return 0;
}
  • char ch = 0; 위의 코드는 메모리에 이름이 ch인 1byte 공간을 할당하고 그 공간을 0으로 초기화 하는 코드 입니다.
  • ch = getchar();
    • getchar() 함수는 사용자가 키보드로 입력한 문자를 읽어들이는데 사용됩니다. 프로세스는 사용자가 Enter 키를 누를 때까지 대기하고, 그 후에 Enter 키 이전에 입력된 문자 중 첫 번째 문자를 입력 버퍼로부터 읽어들입니다.
    • 읽어드린 1byte(8-bit) (이경우 ‘a’)문자는 할당해둔 메모리의 ch (OS에 의해 정해진 주소값 : 0x00007f76980b41b)에 저장 합니다.
    • ‘a’는 ASCII 코드 97, 16진수로 0x61 이다.
    • memory-view-1.jpg
  • ch += 3
    • ch에 저장된 값에 3을 더하고 다시 ch에 저장합니다.
    • 동일한 주소의 값이 ‘a’ 에서 ‘d’로 변경된것을 확인할 수 있습니다.
    • memory-view-1.jpg
  • putchar(ch);
    • ch에 저장된 값을 콘솔에 출력 합니다.

결론

오늘은 간단하게 키보드를 입력하였을때 컴퓨터에 어떤일이 일어나는지 알아 보았습니다. 다음번엔 인터럽트, 버퍼, CPU와 메모리의 관계에 대해 좀더 깊게 다루어 보겠습니다.

This post is licensed under CC BY 4.0 by the author.