터보 버튼…

머나먼 옛날 옛적에 있던 버튼…

(사실 이런 거 쓸 생각 없었는데….)

나도 터보 버튼이 있던 컴퓨터를 어~~릴 적에 쓴 적이 있다. 근데 나야 뭐 그런 게 있어도 잘 몰랐으니 건드리진 않았고… 나중에 운영체제랑 시스템을 좀 제대로 공부할 때 “아 이런 게 있었구나”라고 하면서 대~충 넘어갔었다.

근데 오늘 트위터에 올라온 것 때문에 참…

 

내가 아는 거랑 뭐 더 다른 게 있나 해서 찾아보니 확실히 이상한 소리 있었다. 게다가 공감수가 장난이 아니다. 진짜로 이상한 글들 많아서…. 좀 정리해 보려고 한다.

터보 버튼은 말 그대로 성능을 올리는 버튼입니다. 근데 올리는 성능이 하드웨어만의 성능이 아닙니다. XT~486 시대까지 개발될 때에는, 프로세서 제조사들에 따라서 클럭 수가 다르게 나오는 프로세서들이 많았습니다. XT의 경우, IBM XT의 주력은 8MHz인데(8088), 이때에 같은 아키텍쳐의 다른 설계를 가진 프로세서들이 더 클럭수가 높은 프로세서들을 내놓기도 했습니다. 어디는 9, 12, 15, 16… 이런 식으로 클럭 수가 다른 프로세서들이 나와줬는데, 이걸 표준으로 맞춰서 처리해주도록 클럭을 제어해주던 녀석이 터보 버튼입니다. 이렇게 보면 클럭을 오히려 되려 낮춰주는 거 아니야? 하는데 초기에 저 정도의 클럭도 못따라가던 녀석들은 되려 클럭이 올라가기도 했습니다. 근데 대부분의 경우에는 클럭을 낮춰줬죠. 특히 기준이 되던 프로세서가 있으면 다른 고성능 프로세서 장착 컴퓨터들이 기준 프로세서에 맞추는 용도였습니다.

이 후에 나오는 프로세서들은 의미도 없지만 그냥 관행상 붙이고 다녔습니다. 그러다가 아예 없어졌죠.

근데 이 때에 컴퓨터를 이용하던 지금의 젊은(?) 사람들은 그 당시 게임 돌리기 바쁜 사람들이었기 때문에 이거 왜 있어 그러다가 터보 모드로 실행하면 되던 게임 안되고 해서 이거 뭐야 그러다보니 별 이상한 이야기들을 믿고 있는 경우가 있습니다. 그래서 좀 이해가 안되는 이상한 이야기들도 많고요…

그나마 좀 정상적인 이야기도 반 좀 넘게 있어서 다행입니다만….ㅠㅠ

근데 제조사들은 왜 이런 짓을 했을까요?

결론부터 말하면, 운영체제 및 프로그래밍 언어의 개발 부진이 당시의 원인입니다.

운영체제는 여러 하드웨어를 지원하지만, 초창기의 운영체제들은 기술들의 표준이 되는 시스템에 맞춰서 운영체제를 개발하였었습니다. 그래서 당시 주류였던 8MHz 시스템에 맞춰서 운영체제를 개발하였고, 해당 클럭 동작에 따라 시간을 재고 시간 처리를 하는 타이머 기능을 만들고 했던 여러 기능들이 그대로 C 언어의 라이브러리에 내장되어 있던 시절이 있었습니다. (지금은 안쓰입니다. 시스템의 시간에 관련된 기능은 이젠 표준화 되었기 때문에 쉽게 이용할 수 있습니다.)

이와 관련되어서는 다음과 같은 걸로 확인 가능합니다.

도스박스의 에뮬레이터에 보면 시스템 클락을 설정할 수 있는데, 이 부분 설정을 바꾸면 특정 프로그램 혹은 게임에서는 시간이 실제 시간과 다르게 동작하는 일부 프로그램을 볼 수 있는데, 이 프로그램들의 정체가 바로 특정 컴퓨터의 환경에서만 맞춰서 만들어진 프로그램들입니다. 그래서 타임 함수처리를 해도 클럭 차이가 나서 시간 차이가 생깁니다. 이때 당시의 프로그램들 중에는 이런 프로그램들이 상당히 많습니다. C 라이브러리를 어떤 걸 쓰느냐에 따라서도 여러 C가 존재했기 때문에, 그 언어들에 따라서도 라이브러리 내부 구현이 다른 것도 한 몫을 하죠.

요즘은 거의 신경 쓸 일도 아니기 때문에 그냥 넘어가는 경우가 많은데, 아직도 저사양 환경용 특수 목적 운영체제 개발하는 사람들은 클럭 컨트롤에 관해서 예전에 여러모로 있었던 일들이기 때문에 은근 민감하게 반응하는 편입니다. 그래서 터보모드라는 것이 은근 골때리게 알려진 것들도 많고, 이상하게 이해하는 것도 많죠.

오래전 컴퓨터들이 CPU 속도 조절과 관련되어 어떤 작업 형식을 이용하고 했는지는 오래된 운영체제 개발 문서들을 찾아보면 많이 나와있는 편입니다. The Linux Kernel의 맨 초창기 버전, 즉 리눅스 0.1 시절의 문서만 보더라도 이에 해당하는 이야기가 나와있는 편이므로 이해하는 데 있어서 어려움은 없을 것으로 보입니다. 근데 그정도 시절의 문서면 지금은 안쓰인다는 거죠.

게다가 이게 386, 486 때에는 그냥 관행적으로 넣은 기술이기 때문에 그닥 영향 자체가 있나를 물으면 미묘한 시기였고, 그 당시 업데이트 된 운영체제들은 클럭수가 무어의 법칙에 따라서 열심히 미친듯이 오르던 시기를 겪어야 했기 때문에 어느 정도의 대응을 하여 라이브러리들을 새로 짜서 썼기 때문에 “아, 이렇게 업데이트 되었구나” 까지만 알아도 좋을 꺼라고 생각됩니다.

다들 열공하죠. ㅇㅅㅇ/

Advertisements

결국은 대학 잘가기 위한 코딩과외인데…

코딩교육에 아무리 이런 말 저런 말 다 붙여도 사실 다 까놓고 보면 그냥

“교육과정에 코딩 교육이 들어간다” == “그러니 코딩을 가르쳐야 한다” == (“코딩과외” || “코딩학원”)

이다. 아무리 뭐라 해도 할 말이 없다…

대학 잘 가기 위해 푸는 문제들을 잘 봐보자. 진짜로 기초학력을 위한 건지, 탈락자 만들어서 줄세우기 하기 쉽게 만드는 건지….

코딩 그렇게 가르치는 거 아니다 진짜로…

ncurses 03 – Hello World!

어떠한 환경이던 일단 기본적으로 했던 것이 바로 Hello World입니다. ncurses에서도 마찬가지인데요, 어떻게 구성되어 있는지 우선 코드를 작성하여 보여드리겠습니다.

스크린샷 2017-10-06 오후 4.24.22.png

프로그램 구조는 C와 동일합니다. 아니, C 코드 그 자체입니다. 근데 보면 뭔가 다른 코드들이 막 있습니다. 이게 어떤 함수들을 이용한 것인지 설명하겠습니다.

우선 stdio를 삽입 안하고 바로 ncurses를 삽입하였습니다. 그렇습니다. 화면에만 뿌리는 작업, 기본적인 ncurses 작업에는 stdio는 필요하지 않습니다. printf 함수는 stdio에 정의되어 있던 함수이기 때문에 우리는 첨에 hello world를 C에서 출력할 때에는 그걸 그대로 이용했습니다만, ncurses에서는 ncurses용 함수를 이용했기 때문에 안쓴 것이죠.

이제 함수들을 하나 하나 살펴보겠습니다. 단순한 설명을 우선적으로 진행합니다.

  • initscr: 화면을 초기화 하는 것입니다. 터미널의 쉘 환경 화면에서 새로 그리기 위해 화면을 초기화 합니다. 그리고 빈 화면을 출력합니다.
  • printw: print window. 화면에 프린트 하는 함수입니다. 사용법은 printf와 비슷합니다.
  • refresh: 화면을 리프래시 해준다. 이 때에 화면에 printw에 있는 문자열이 출력된다. (중요!)
  • getch: 사용자에게 문자 하나를 입력받을 준비를 한다.
  • endwin: ncurses 윈도우를 종료한다.

함수들이 어떤 기능을 하는지를 확인하니 윈도우를 그리는 과정을 알 수 있겠죠? 화면 초기화 -> 데이터 입력 -> 화면 그리기 -> 화면 종료 이런 식으로 간단하게 보여줬습니다. 단, getch로 사용자 입력을 기다리게 해서 화면이 지속적으로 떠 있도록 해줬던 것이 차이점입니다.

여기서 지금 중요한 이야기를 하나 진행합니다. 바로 refresh에 대한 내용인데, 이게 정말 중요합니다. 왜 refresh, 즉 새로 그리기를 해야지만 다시 보여줄 수 있는 것인지?

터미널에서 보여주는 화면은 우리가 메모리에서 저장된 내용을 보여주게 됩니다. 그런데, 메모리에 저장된 내용이 단순한 문자열 한 줄인 경우에는 그냥 기존처럼 출력하게 되지만, 윈도우 화면으로 만들려고 한다면 윈도우 화면을 수동적으로 만들어서 보여줄 수 있어야 합니다. 그런 윈도우 화면을 자료구조 형태로 만들어서 메모리에 적재하는 과정이 바로 initscr 함수에서 진행합니다. 그리고 해당되는 빈 자료구조 중에 기본적인 윈도우의 역할을 하는 자료구조는 stdscr이라는 내부 자료구조가 있어서, 이 자료구조가 초기화되고 뿌려진 상태가 바로 아무것도 없는 검은 화면이 되는 것입니다.

여기에 이제 printw로 문자열을 화면 출력용 자료구조에 삽입하여도 일단 출력된 자료구조와 현재 메모리에 저장되어 있는 자료구조와는 다른 데이터를 갖게 되는 것이죠. 이 것을 refresh 함수가 다시 읽어오게 됩니다. 다시 읽어온 메모리 덤프 데이터가 그대로 출력되어야지만 비로소 화면에 출력이 되는 것인데, 이 과정 때문에 refresh 함수가 반드시 필요합니다.

처음에 ncurses를 개발하다보면 자꾸 refresh를 까먹을 수 있는데, 화면이 변경되어 새로 그리게 되면 반드시 쓰게 되는 함수라고 생각하고 있어야 합니다.

실제로 실행을 하게 되면 어떻게 되는지 보여드리겠습니다. 저장하고 나서 컴파일을 진행합니다.

스크린샷 2017-10-06 오후 4.24.53

그리고 컴파일 결과물인 hello를 직접 실행해 보겠습니다.

스크린샷 2017-10-06 오후 4.25.04

빈 화면에 kyuling: hello world라고 떠 있습니다. 왼쪽 상단에 위치하는데, 왼쪽 상단 좌표를 0,0으로 설정하고 출력하기 때문에 그쪽부터 출력되는 것입니다. 그 뒤에 커서는 입력 대기를 하는 것이고요. 여기서 아무 키나 누르게 되면 다시 원래 화면으로 돌아갑니다.

스크린샷 2017-10-06 오후 4.25.11.png

다시 이전 화면으로 돌아갑니다. ncurses 내부를 파해치는 것이 아니라 더 이상의 자세한 설명은 생략하겠습니다만, 프로그래밍을 하다보면 “아, 이거 그거다.”라고 금방 이해하고 알 수 있는 날이 올 것입니다. 나중에 다세히 쓰기도 하겠지만요.

hello world를 출력해보면서 간단한 구조를 살펴봤습니다. 이제 조금씩 더 다뤄가면서 그래픽 프로그래밍 같아 보이는 작업들을 보여주도록 하겠습니다.