2012년 10월 1일 월요일

1.1-2 BIOS, EFI

BIOS : Basic Input Output System
EFI : Extensible Firmware Interface

이번에는 컴퓨터 중에서도 PC(Personal Computer)에 대해서 본격적으로 알아보기로 하자.

먼저, PC의 구조에 대해서 간단하게 알아보자.
PC는 다른 컴퓨터들과는 확연히 다른 무엇인가가 있다.

냉장고는 오로지 냉장고의 온도조절 만을 한다.
세탁기는 세탁조안에 있는 빨래감을 세탁하는 것 만을 한다.
청소기는 바닥에 떨어져 있는 먼지를 제거하는 것 만을 한다.

그렇다면, PC는 어떤 것을 할 수 있는지 딱부러지게 말 할 수 있는가?
아쉽게도 말할 수 없다.

어떤 사람에게는 표계산을 전문적으로 하는 계산기이다.
어떤 사람에게는 책을 쓸 수 있는 디지털 타자기이다.
어떤 사람에게는 음악을 만들 수 있는 디지털 컴포저이다.
어떤 사람에게는 그림을 그릴 수 있는 디지털 캔버스이다.
어떤 사람에게는 게임을 즐겁게 할 수 있는 디지털 게임기이다.

그렇다. PC는 어떤 한가지 일을 하기 위해 만들어진 컴퓨터가 아니라는 것이다.
다른 컴퓨터와의 차이점이랄 수 있다.

실제로 PC를 통해서 우리가 무슨 일을 한다는 것은 결국 그것을 할 수 있도록 도와주는 프로그램(앱, 애플리케이션)을 실행(연다)한다는 것과 같다. 
이것이 다른 컴퓨터와 확연히 다른 것이다.

세탁기는 전원이 들어오면, 바로 세탁을 하기위해 만들어진 세탁전용 프로그램이 실행된다. 
그리고, 그 프로그램은 해당 세탁기를 만든 업체의 전문가가 아니면 바꿀 수 없다.

하지만, PC는 원하는 작업을 위해 원하는 프로그램을 설치하고 원하는대로 바꾸어서 실행하는 것이 가능하다.

대체 어떻게 이런 것이 가능할까 생각해 본적이 있는가?

그것을 가능하게 하는 것으로 운영체제(Windows, OSX. Linux. UNIX)라는 것이 있기 때문이다.

그런데, 다시 한번 더 생각해보자 우리는 우리가 가지고 있는 PC에 운영체제 조차도 필요에 따라 설치할 수 있다. 그렇다면, 운영체제의 앞에 무엇인가가 더 있다는 것을 생각할 수 있지 않을까? 그것이 지금 설명하고자 하는 BIOS라는 것이다.


세탁기나 텔레비전, 냉장고에도 BIOS와 비슷하게 생긴 것이 있다. 
하지만, 그러한 것들은 그것이 전부라는 것에 차이가 있다.

세탁기나 텔레비전과 같은 컴퓨터에 들어있는 그러한 것들을 Firmware라고 부른다. 
지금 설명하는 BIOS도 일종의 Firmware이다. 
그러면, Firmware가 무엇인지 알아보자.

백과사전(두산,네이버백과사전 참고)에는 “펌웨어는 일반적으로 롬(ROM)에 저장된 하드웨어를 제어하는 마이크로 프로그램을 의미한다.”라고 기록되어 있다.

하드웨어를 제어하는 프로그램이다. 
세탁기라면 세탁기라는 하드웨어를 제어하는 프로그램이다. 
따라서, 세탁기가 세탁기로써 제구실을 할 수 있도록 하는데 필수불가결한 요소라는 것을 알 수 있다.

그리고, 일반적으로 롬(ROM)에 저장되어 있다고 한다.
롬(Rean Only Memory)은 이름 그대로 읽기만이 가능한 기억장치라는 뜻으로 지우거나 수정하는 것을 허락하지 않는다는 것을 말한다.

말 그대로 세탁기의 Firmware의 내용을 지운다거나 수정하면 그 세탁기가 본래의 의도대로 동작하리라고 장담할 수 없다는 것이다. 일반적인 컴퓨터들은 이러한 Firmware에 저장된 프로그램이 그 기기의 전부를 말한다고 볼 수 있다.

이에 반해 PC는 그렇지 않다. 
PC도 컴퓨터이기에 반드시 이 Firmware가 필요하다. 
하지만, PC에 들어있는 Firmware가 PC의 본질을 정의하고 있지 않다는 것이 차이점이다. 

PC안에 내장된 Firmware가 하는 작업은 PC를 구성하고 있는 각종 하드웨어중에서 기본적으로 반드시 필요한 부품들의 상태를 검사한다. 

예를 든다면, CPU가 있는지, 메모리가 정상인지, 그래픽카드가 정상인지, 키보드가 연결되어 있는지 이러한 것들이 여기에 해당된다. 이러한 기본적인 하드웨어의 검사가 끝나면 운영체제를 찾아 그것을 실행함으로 자신의 일을 끝낸다.

간단히 설명하자면, PC에 내장된 Firmware는 그 PC전체를 제어하는데 목적이 있는 것이 아니라 운영체제를 실행하는데 그 목적이 있다는 것이다. 
운영체제의 실행이 성공하면 그것으로 PC의 Firmware의 주요 업무는 끝나는 것이다. 
PC의 Firmware를 BIOS라고 부르는 이유가 여기에 있다. 
이름 그대로 기본적인 입력과 출력을 관리하는 시스템이라는 의미이다.

좀 더 자세히 설명하자면, PC는 입력장치와 출력장치로 대부분의 하드웨어를 양분할 수 있다. 
이 두가지를 통해서 사용자인 사람과 혹은 다른 컴퓨터와 통신을 할 수 있게 되는 것이다.
바로 이 중간에서 입력장치와 출력장치의 중간에서 서로간의 연결만을 책임지는 시스템이 바로 BIOS라는 것이다.

최근에는 PC의 하드웨어가 점점 복잡해지고 다양해짐에 따라서 기존의 BIOS만으로는 해결하기 어렵거나 복잡해지는 상황들이 발생하기 시작했다. 
이를 대체하기 위해 개발되어지고 있는 것이 EFI라는 규격이다.

EFI(확장 펌웨어 인터페이스)는 1990년 인텔과 HP의 주도로 서버용 플랫폼을 위해 개발되기 시작했지만, 2002년 12월 인텔에의해 공개되면서 지금은 PC의 BIOS를 대체하는 규격으로 개발되고 있다.

1981년 IBM PC가 출시된 이후 2012년 현재까지 대부분 PC의 Firmware는 BIOS였다. 
하지만, 애플에서 출시되는 맥킨토시는 Firmware로 EFI를 사용하고 있고, PC에서도 고급형 모델에서부터 시작하여 EFI를 채택하고 있다.

윈도우즈 8 (2012년말에 출시)은 EFI를 메인보드의 Firmware로 사용하여 시스템 및 운영체제의 성능을 향상시키는 기능이 포함되어 있어 본격적으로 EFI가 BIOS를 대치하게 될 것이다.

2012년 9월 30일 일요일

1.1-1 마이크로 프로세서

2012년 현재, 우리 주위에 너무나도 다양한 형태로 컴퓨터라는 것들이 만들어지고 사용되어지는 시대에 살고 있다. 

오늘날 대부분의 가정(한국)에 컴퓨터 한 대 정도는 좋은 책상에 놓여져 있다. 
그뿐인가? 우리의 거실의 한쪽벽을 차지하고 있는 텔레비전도 스마트TV라는 이름으로 인터넷에 연결되어지고 있지 않은가? 스마트TV가 각광받기 전에는 각 통신사에서 가입해서 사용하는 셋톱박스 형태의 IPTV(VoIP TV)가 있었다. 
그것들도 컴퓨터이다. 

그러면, 컴퓨터에 대해서 좀더 정확히 집어보기로 하자.

컴퓨터에 대해서 얘기를 시작하는데, 뜬금없이 마이크로 프로세서를 첫번째 장의 천번째 단원의 첫 소제목으로 시작하고 있다. 

대체 마이크로 프로세서가 무엇이길래 이렇게 시작하고 있을까?


백과사전(두산,네이버백과사전 참고)을 보면 “컴퓨터의 산술논리연산기, 레지스터, 프로그램 카운터, 명령디코더, 제어회로 등의 연산장치와 제어장치를 1개의 작은 실리콘 칩에 모아놓은 처리장치를 말한다. 
주기억장치에 저장되어 있는 명령을 해석하고 실행하는 기능을 한다.”라고 기록되어 있다. 

그렇다. 컴퓨터의 여러가지 기능들을 한 개의 작은 실리콘 칩에 모아놓은 것이다. 
위 그림의 사작형의 작은 칩안에 산술처리, 명령처리, 제어회로, 연산장치, 제어장치들이 모두 들어있다는 것이다. 

 

보통 사람들은 컴퓨터하면 가정이나 사무실의 책상에 놓여있는 데스크탑 컴퓨터나 랩탑(노트북)컴퓨터를 생각한다. 
하지만, 엄밀히 말하면 그것들은 개인용 컴퓨터(Personal Computer)라고 해야 정확한 표현이다.

그렇다면, PC라는 이 단어에는 Personal이 아닌 다른 Computer가 있다는 것을 말해주고 있는 것이다. 정확히 말하면 바로 전에 언급한 이 마이크로 프로세서가 들어가 있는 모든 기기들이 바로 컴퓨터들이라는 것이다.
사실, 우리가 사용하는 PC에도 똑같이 이 마이크로 프로세서가 들어있다. 
PC에는 대부분 Intel사에서 개발한 마이크로 프로세서(X86계열의 CPU라고 부르는)가 들어있다. 

결국, 모든 컴퓨터에는 이 마이크로 프로세서라는 것이 들어 있다는 것이다. 

마이크로 프로세서는 다양한 종류가 있고 다양한 회사들에서 개발하고 제조하고 있다.

세탁기에도, 텔레비전에도 ,디지털 카메라에도, 프린터에도, 복사기에도, 냉장고에도, 에어콘에도, 청소기에도 하다못해 리모컨에도 들어있다. 그리고, 우리가 매일 수없이 타고 다니는 자동차에도 들어있다.
지금 우리는 마이크로 프로세서 속에서 살고 있는 것이나 다름없다.

21세기가 되면서 새롭게 다시 떠오르고 있는 유비쿼터스 네트워크라는 개념이 있다.
백과사전 (두산,네이버백과사전 참고) 에는 “사용자가 네트워크나 컴퓨터를 의식하지 않고 장소에 상관없이 자유롭게 네트워크에 접속할 수 있는 정보통신 환경”이라고 요약되어 있다.

방금 설명한 바로 이 마이크로 프로세서가 탑재된 장치들 하나하나가 모두 컴퓨터라면 거의 비슷한 환경이라고 볼 수도 있다. 
이제는 이러한 마이크로 프로세서를 탑재한 컴퓨터들이 모두 네트워크에 연결되면 비로서 유비쿼터스 네트워크 환경이라고 할 수 있게 되는 것이다.

그리고, 실제로 조금씩이지만 인터넷에 연결되는 냉장고, 보일러, 경보장치, 보안 카메라 등이 개발되고 출시되고 있다.



다음은 PC의 Firmware라고 할 수 있는 BIOS에 대해서 다룹니다.
컴퓨터 시스템, 특히 PC(Personal Computer)에 대한 모든 것을 다루고자 합니다.
나중에 강의 및 교육을 위한 자료로써 정리하고 있습니다.

2011년 8월 3일 수요일

WPF에서 타이머개체 사용하기

1. WPF자체의 타이머가 이닌 Windows.Form의 타이머를 사용하는 방법
using System.Windows.Forms;


// Timer개체를 생성, 속성, 이벤트 정의
timer = new Timer();
timer.Interval = 200;
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;


// 타이머의 Tick 이벤트
private void timer_Tick(object sender, EventArgs e)
{
            DrawClock();
}
/// 이코드는 Shape로 만들어진 시계의 시, 분, 초 침을 현재 시간에 맞추어
/// 각도를 조정하는 코드이다.
///   첨부한 샘플을 참고하라.


/// <summary>
/// 시침, 분침, 초침 그리기
/// </summary>
private void DrawClock()
{
            DateTime now = DateTime.Now;
            txtTime.Text = now.ToLongTimeString();
            int hour = now.Hour;
            int minute = now.Minute;
            int second = now.Second;
            double hourAngle = hour * 30 + minute * 0.5;
            double minuteAngle = minute * 6 + second * 0.1;
            double secondAngle = second * 6;
            rotateHour.Angle = hourAngle;
            rtHour.RenderTransform = rotateHour;
            rotateMinute.Angle = minuteAngle;
            rtMinute.RenderTransform = rotateMinute;
            rotateSecond.Angle = secondAngle;
            rtSecond.RenderTransform = rotateSecond;
}

2. WPF자체의 타이머를 사용하는 방법
이것은 윈폼용과 동일하게 동작합니다.
이벤트도 같구요. 다만, Enabled가 이니라 Start(), Stop()이네요.

public DispatcherTimer Timer = new DispatcherTimer();
void Window1_Loaded(object sender, RoutedEventArgs e)
{
    Timer.Interval = TimeSpan.FromSeconds(3);
    Timer.Tick += new EventHandler(Timer_Tick);
    Timer.Start();
}


3. 별도의 쓰레드를 만들어 동작하는 타이머를 사용하는 방법
Thread로 동작하는 것 같더군요. 따라서, 폼 개체에 접근할 수 없습니다.
this 라던가.. 폼 개체에 접근하려면 에러가 발생합니다.


사용방법은 using System.Timers; 를 추가하고 그냥 사용하시면 됩니다.
다만, Tick 이벤트가 아니라
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
Elapsed 이벤트를 사용합니다. 이벤트 핸들러도 다릅니다.
참고하세요.

System.Timers.Timer Class는 TestWindow와 다른 새로운 Thread를 생성해서 동작을 합니다.
System.Windows.Threading.DispatcherTimer는 TestWindow와 같은 Thread에서 동작을 합니다.


WPF용으로는 두가지의 타이머가 있습니다.
이 두가지 타이머간에는 다음과 같은 차이점이 존재합니다..


Dispatcher Class
 - 같은 Thread에서 동작하기 때문에 동기화 작업이 필요없고, TestWindow의 멤버도
   자유롭게 접근 가능합니다.

Timer Class
 - 서로 다른 Thread에서 동작하기 때문에 TestWindow의 멤버변수에 직접 접근을 할수 없습니다.
    (직접 접근을 하기 위해서는 Invoke나 BeginInvoke를 사용하여야 합니다)
 - 서로 다른 Thread에서 동작하기 때문에 List를 추가/삭제 하기 위해서는 추가적으로 Thread간
   동기화 작업을 해줘야 합니다.

현재 작업경로 가져오기

현재 작업 디렉토리의 졍규화된 경로를 가져옵니다.

System.Environment.CurrentDirectory

결과값에는 "\"는 포함되지 않습니다.
따라서, System.Environment.CurrentDirectory + "\\" + txtFileName.Text; 와 같이 사용해야 합니다.

아무데나 눌러서 창을 이동할때

타이틀이 없는 창을 이동하는 방법

Win32나 MFC등에서는 보통 이러한 경우 창 이동과 관련된 부분을 직접 구현 해야 하지만 WPF에서는 이러한 상황 에서 개발자의 부담을 덜어드리고자 간단한 메서드 호출 한번으로 마우스를 사용한 창 이동 기능을 구현 할 수 있습니다. 

Window Class에서 DragMove 메서드를 제공하는데요, 이 는 마우스 왼쪽 단추를 누른 상태로 창 클라이언트 영역의 노출된 영역에서 창을 끌 수 있도록 돕습니다. 사용방법이 매우 간단합니다. 

마우스를 사용해서 창을 끌 수 있도록 하고 싶은 객체의 MouseLeftButtonDown이벤트에 DragMove()메서드를 호출해주기만 하면 됩니다. 

void Window1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)     this.DragMove();}