아두이노 기초 

교재 링크


1장 아두이노 개요

    1.1 아두이노 소개

    1.2 아두이노의 종류 및 특징


3장 시리얼(serial) 통신

    3.1 시리얼 통신 개요

    3.2 시리얼 통신 예제들

    3.2 시리얼 통신으로 (3핀)초음파 센서를 이용한 거리 측정값 표시하기
    3.3 4핀 초음파 센서와 NewPing 라이브러리로 거리 측정하기

    3.4 초음파 센서로 근접 장애물 경고하기


4장 인터럽트(interrupt)

    4.1 인터럽트의 개념

    4.2 터치센서를 이용한 인터럽트 실험

    4.3 택스위치와 디바운싱 (falling edge) (part 1/2)

    4.4 디바운싱 (rising edge, changing edge, low state) (part 2/2)

    4.5 volatile 지시자


5장 아날로그 입력

    5.1 날로그핀(AD변환기) 개요

    5.2 아날로그핀의 기준 전압 설정

    5.3 아날로그핀을 디지털 핀으로 사용하는 방법

    5.4 온도 센서를 이용한 아날로그 입력 실험

    5.5 광량 센서를 이용한 아날로그 입력 실험



아두이노 응용 





'주제별 글목록' 카테고리의 다른 글

심파이(sympy) 강좌 목록  (0) 2015.06.03
파이썬(python) 기초 강좌 목록  (1) 2015.05.23
ATmega8(A) 강좌 목록  (1) 2015.05.16
리눅스(Linux) 강좌 목차  (2) 2015.05.16
C++ 강의 글 목록 (목차)  (2) 2015.04.21
Posted by 살레시오
,

 여기에서는 Led 라는 클래스를 작성하는 예를 들어보도록 하겠다. 아두이노의 예제이지만 아두이노가 C++로 개발하므로 일반적인 클래스의 예제도 된다.


 아두이노의 디지털핀에는 LED를 연결할 수 있으므로 Led 클래스는 연결된 핀 번호를 갖는 멤버가 있어야 한다. 따라서 다음과 같이 작성할 수 있다.

class Led {
   public: byte pin;
};

그리고 인스턴스를 생성할 때 이 핀번호를 받도록 하려면 다음과 같이 생성자를 작성하면 될 것이다.

class Led {
   public:
       byte pin;
       Led(int);
};
Led::Led(int dp) {
       pin = dp;
       pinMode(pin, OUTPUT);
}

이렇게 작성하면 멤버 변수 pin을 외부에서 접근할 수 있다. 예를 들면

Led ledRed(12);
ledRed.pin = 11;

와 같이 인스턴스를 생성한 이후에 핀번호를 바꾸는 것이 가능하다.


 그렇지만 핀번호는 한 번 초기화되면 바꿀 필요가 없으므로 궂이 외부에 노출시킬 필요가 없다. 따라서 다음과 같이 private 멤버로 지정하는 것이 바람직하다. 또한 내부 멤버임을 표시하기 위하여 첫 문자를 underscore(_)로 했다.



class Led {
   public:
       Led(int);
   private:
       byte _pin;
};
Led::Led(int pin) {
   _pin = pin;
   pinMode(_pin, OUTPUT);
}

또는 기본 지정자가 private 이므로 아래와 같이 작성해도 된다.



class Led {
   byte _pin;

   public:
       Led(int);
};

Led::Led(int pin) {
   _pin = pin;
   pinMode(_pin, OUTPUT);
}

 

하지만 명시적으로 private 키워드를 이용하여 지정해 주는 것이 가독성 측면에서 더 바람직하다. 그리고 클래스 선언에서는 public 멤버들이 먼저 오는 것이 좋다. 왜냐면 작성자가 아닌 다른 사람이  (보통 라이브러리에 포함되어 배포되는) 이 클래스를 사용하고자 한다면 public 멤버들만 알면 되지 private 멤버들은 궂이 볼 필요가 없기 때문이다.

 이렇게 핀 번호를 private로 지정해 놓으면 외부에서 접근할 수 없으므로 LED를 켜고 끄는 것도 외부에서 수행할 수 없다. 하지만 멤버 함수는 내부 변수를 접근할 수 있으므로 LED를 켜고 끄는 public 멤버 함수를 다음과 같이 지정할 수 있다. 전체적인 클래스의 모양은 다음과 같을 것이다.

class Led {
   public:
       Led(int);
       void turnOn();
       void turnOff();
   private:
       byte _pin;
};
Led::Led(int pin) {
   _pin = pin;
   pinMode(_pin, OUTPUT);
}
Led::void turnOn() {
   digitalWrite(_pin, HIGH); // 멤버 함수는 _pin을 사용할 수 있다.
}
Led::void turnOff() {
   digitalWrite(_pin, LOW); // 멤버 함수는 _pin을 사용할 수 있다.
}

 멤버 변수나 함수는 관례적으로 그 이름이 소문자로 시작하며 클래스는 대문자로 시작한다는 점을 알아두자. 이것은 식별자(이름)만 보고 타잎을 유추하기 쉽게 하기 위한 C++ 프로그램의 관례이다.

 만약 12번 핀에 빨간색 LED가 연결되어 있다면 다음과 같이 Led 객체를 사용할 수 있다.

Led ledRed(12);
....
ledRed.turnOn();
delay(500);
ledRed.turnOff();
delay(500);
....


이와 같이 인스턴스의 이름도 그것으로 실제 의미를 유추할 수 있도록 작성하는 것이 프로그램의 가독성 측면에서 유리하다.


 만약 11번핀에 노란색, 10번핀에 파란색 LED가 추가로 달려있다면 아래와 같이 작성할 수 있을 것이다.


Led ledRed(12), ledYellow(11), ledBlue(10);

이후에 만약 파란색 LED를 켜고 싶다면 다음과 같이 멤버함수를 호출한다.


ledBlue.turnOn();

 이런 식으로 클래스를 이용하여 LED를 객체화 시키면 직관적으로 프로그램을 작성할 수 있다는 장점이 있다.

C++ 강좌 전체 목록 >>>


c{c++},n{c0023}

Posted by 살레시오
,

 일반 변수와 마찬가지로 어떤 함수 내에서 생성된 인스턴스는 지역 인스턴스, 함수 바깥에 선언된 인스턴스는 전역 인스턴스이다. 전역 인스턴스는 프로그램이 실행될 때 생성되고 프로그램이 종료될 때 소멸된다. 그리고 지역 인스턴스는 함수가 실행될 때 생성되고 함수가 종료될 때 소멸된다.


 다음 예를 가지고 생성자와 소멸자의 실행 순서를 설명하도록 하겠다. 여기에서 rect1 은 함수 바깥에서 생성된 전역 인스턴스이고 rect2, rect3 는 함수 func()의 지역 인스턴스이다.

class Rect {
   .....
};
Rect rect1;
void func() {
   Rect rect2;
   Rect rect3;
   .....
}
int main() {
   .....
   func();
   .....
}

위 예제와 같이 main()함수에서 func() 함수가 호출될 때 rect2, rect3 의 순으로 인스턴스가 생성되며 생성자도 같은 순서로 호출된다. 하지만 func() 함수가 종료될 때는 그 역순으로 소멸되며 소멸자도 역순으로 호출된다.


 전체적인 생성자와 소멸자의 호출순서를 좀 더 자세히 기술하면 다음과 같다.



프로그램 시작

   rect1 객체 생성 (생성자 호출)

   main()함수 실행
       .....

       func()함수 실행
       rect2 객체 생성 (생성자 호출)
       rect3 객체 생성 (생성자 호출)
       .....
       rect3 객체 소멸 (소멸자 호출)
       rect2 객체 소멸 (소멸자 호출)
       func()함수 종료

       .....
   main함수 종료

   rect1 객체 소멸 (소멸자 호출)

프로그램 종료

전역 인스턴스는 전역 변수와 마찬가지로 그 밑에 위치한 모든 함수에서 접근할 수 있는 반변 지역 인스턴스는 포함된 함수 내부에서만 접근할 수 있고 함수의 실행이 끝나면 소멸된다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0022}

Posted by 살레시오
,

 소멸자(destructor)는 생성자와는 반대로 인스턴스가 소멸될 때 반드시 호출되는 멤버 함수이다. 소멸자는 객체가 삭제되는 시점에서 필요한 마무리 작업을 처리하기 위해서 있는 것이다. 예를 들어서 동적으로 할당받은 메모리를 반환하거나 열어 놓은 파일을 닫거나 시리얼 등의 통신 연결을 끊거나 하는 마무리 작업을 수행해야 하는 경우 소멸자를 구현해야 한다.


 소멸자의 이름은 클래스이름 앞에 틸다(~)를 붙인다. 예를 들어서 Rect 클래스의 소멸자 이름은 ~Rect() 이다.


class Rect { // 클래스 선언
   public:
       Rect(); // 생성자
       ~Rect(); // 소멸자
   .....
};

Rect::~Rect() { // 소멸자 구현
   .....
}

 생성자와 마찬가지로 소멸자도 반환값이 없으며 함수 내부에서 어떤 값을 반환해서도 안된다. 또한 생성자를 오버로딩할 수 있으나 (즉,  입력 인자가 다른 생성자가 여러 개 있을 수 있다) 소멸자는 입력 인수가 없는 기본형 하나밖에 없다.


 생성자와 마찬가지로 사용자가 소멸자를 선언하지 않은 경우에는 컴파일러가 자동으로 기본 소멸자(default destructor)를 생성하여 인스턴스 소멸시에 자동으로 호출되도록 한다. 이 기본 소멸자는 아무 일도 하지 않고 단순히 리턴하도록 만들어진다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0021}

Posted by 살레시오
,

 클래스에는 반드시 생성자가 있어야 하며 인스턴스를 생성할 때 반드시 하나의 생성자가 호출되도록 정해져 있다. 사용자가 생성자를 하나도 선언/구현하지 않은 경우에도 컴파일러가 기본 생성자(default constructor)를 만들어서 인스턴스 생성시에 이 기본 생성자를 호출하게 된다. 기본 생성자는 입력 인자가 없는 생성자이다.


 즉, 만약 다음과 같이 생성자가 없다면


class Rect{
   public:
      int width;
      int height;
};


컴파일러는 다음과 같이 입력 인자가 없는 기본 생성자를 자동으로 만들어 준다. 기본 생성자는 inline 멤버 함수로서 아무일도 하지 않는다.


class Rect{
   public:
       int width;
       int height;
       Rect() {}; // 자동으로 생성되는 기본 생성자
};


이와 같이 사용자가 생성자를 하나도 선언/정의하지 않았을 경우 C++ 컴파일러는 백그라운드에서 기본 생성자를 삽입하여 인스턴스 생성 시에 호출한다.


 한 가지 주의할 점은 생성자가 하나라도 선언된 클래스는 기본 생성자가 자동으로 생기지 않는다는 점이다. 이 말은 만약 매개변수가 있는 생성자들만 있는 경우 인스턴스 선언에서 입력 인수가 없이 선언한 경우는 오류를 발생하게 된다는 의미이다. 기본 생성자가 없기 때문이다. 예를 들어서


class Rect {

   public:

       Rect(int iw, int ih);
       int width;
       int height;
};
Rect::Rect(int iw, int ih) { // 입력 인수가 두 개인 생성자
   width = iw;
   height = ih;
}


와 같이 클래스가 정의된 경우에


Rect rect; //에러 발생


라고 인스턴스를 생성하려하면 에러를 발생시킨다. 왜나면 이 경우 기본 생성자를 호출해야 하는데 클래스 정의에서 입력 인수가 두 개인 생성자가 정의되어 있으므로 컴파일러는 자동으로 기본 생성자를 만들지 않기 때문이다. 따라서 없는 기본 생성자를 호출한 격이 되므로 에러를 발생한다.


C++ 강좌 전체 목록 >>>


c{c++},n{c000x}

Posted by 살레시오
,

 생성자(constuctor)란 클래스의 인스턴스가 생성되는 시점에서 자동으로 호출되는 특수한 멤버 함수이다. 생성자 내에서 일반적으로 멤버 변수들을 초기화 시키거나 기타 객체 인스턴스를 생성하는데 필요한 작업들을 수행하게 된다.


class Rect {
   public:
       Rect(); // 생성자1 선언
       int width;
       int height;        
       ....

};
// 생성자 구현
Rect::Rect() { // 입력 인수 없는 생성자
   width = 0;
   height = 0;
}


생성자의 이름은 클래스의 이름과 같다. 생성자는 특별한 경우가 아니면 보통 public 멤버 함수이다. 또한 반환값이 없으며 그럼에도 불구하고 void 를 붙이지 않는다는 점에 주의해야 한다. 이렇게 생성자 있다면 다음과 같이 객체를 생성하는 시점에서


Rect rect1;


입력 인자가 없는 생성자가 호출되어 객체 생성에 필요한 작업을 수행하게 된다.


 생성자는 여러 개를 정의할 수 있으나 (constructor overloading) 이들 중 하나만 실행된다. 아래는 생성자가 두 개인 경우의 예이다.


class Rect {
   public:
       Rect(); // 생성자1 선언
       Rect(int iw, int ih); //생성자2 선언
       int width;
       int height;        
       ....

};
// 생성자 구현
Rect::Rect() { // 입력 인수 없는 생성자
   width = 0;
   height = 0;
}

Rect::Rect(int iw, int ih) { // 입력 인수가 두 개인 생성자
   width = iw;
   height = ih;
}


 

 생성자는 반환값이 없기 때문에 어떤 값도 return해서는 안되지만 중간에 실행을 멈추기 위해서 반환값이 없는 단순 return문은 사용할 수 있다. 만약 다음과 같이 생성자를 입력한다면 오류를 발생시킬 것이다.


Rect::Rect() {
   width = 0;
   height = 0;
   return 0; // 오류 발생

}


그리고 생성자는 여러 개를 중복하여 선언하고 구현할 수 있으나 각각의 입력 인수의 개수나 타입이 서로 달라서 구별되어야 한다. 즉, 이 경우 C++의 일반적인 함수 중복의 규칙에 따른다. 따라서 예를 들어 다음과 같이 여러 개의 생성자를 선언할 수 있다.


Rect();
Rect(int x);
Rect(double y);
Rect(int x, int y);


위에서 든 네 개의 생성자는 서로 입력 인수가 다르므로 다른 생성자이다. 단, 인스턴스 생성시에는 이 중 단 하나만 실행된다.


 생성자에게 입력 인자를 넘기려면 인스턴스 바로 뒤에 괄호로 묶어서 넘기면 된다.


Rect rect1; // 입력 인수가 없는 생성자 호출
Rect rect2(10,20); // 입력 인수가 두 개인 생성자 호출


이렇게 마치 함수를 호출하듯 객체명 뒤에 인자를 주면 입력 인자가 매치가 되는 생성자가 호출되게 된다. 즉, rect1이 생성될 때 Rect() 생성자가 호출되고 rect2가 생성될 경우에는 Rect(int iw, int ih) 생성자가 호출된다. 따라서 rect1의 내부 변수들은 모두 0으로 초기화 되어 있게 되고 rect2의 내부변수는 각각 10과 20으로 초기화가 되었다.


rect1.getArea(); // 0을 반환
rect2.getArea(); // 20을 반환


C++ 강좌 전체 목록 >>>


c{c++},n{c0019}


Posted by 살레시오
,

1.3 C++ 언어 소개    [DOC]    [SMTS]

 컴퓨터의 속도가 빨라짐에 따라 소프트웨어의 덩치도 커지게 되었고, C 언어로는 규모가 큰 프로그램을 개발할 때 프로그램의 코드를 관리하는데 어려움을 겪게 되었다. 이러한 점을 개선하기 위해서 C 언어와의 하위 호환성을 유지하면서 객체 지향 특성 (object oriented programming) 및 편의 기능들을 추가하여 1983년 즈음에 Bell 연구소의 Bjarne Stroustrup 이 C++ 언어를 개발하였다.


Bjarne Stroustrup, Creator and Developer of C++ programming language

[그림 1.3.1] C++ 언어를 개발한 Bjarne Stroustrup


C++에서는 C 언어의 struct 자료 구조를 확장한 class라는 새로운 자료 구조를 이용하여 객체 지향 프로그래밍 방법론을 구축하였으며 이는 다른 현대적인 프로그래밍 언어들에 지대한 기여를 하였다. 이것에 영향을 받아 1991년에는 Guido B.A.가 python의 초기 버전을 발표하였으며, 1995년도에는 C++의 영향을 받은 JAVA라는 언어가 Sum Microsystem 사의 James Gosling 에 의해서 만들어졌다. 또한 2000년에는 Microsoft 가 C++과 JAVA의 장점을 취한 C#이라는 언어를 만들어 ,NET framework의 핵심 언어가 되었다. 이외에도 Javascript, PHP 등 웹프로그래밍 언어들도 C/C++의 영향을 받아서 개발되어 널리 사용되고 있다. 파이썬과 자바 그리고 자바스크립트는 현대의 컴퓨팅환경에서 가장 널리 쓰이는 프로그래밍 언어들이다.


다른 언어들에 비해서 상대적으로 오래된 역사에도 불구하고 C++은 현재까지도 중요한 비중을 차지하고 있으며 속도나 성능이 매우 중요한 임베디드 시스템 개발이나 게임 프로그래밍에 많이 사용되고 있다.  또한 마이크로콘트롤러(microcontroller)나 DSP(digital signal processor)의 프로그래밍에서는 C/C++언어가 아직도 주력으로 사용되고 있으며 특히 아두이노(arduino)와 같은 인기있는 오픈 하드웨어 플랫폼도 C++언어를 사용한다.


 전술한 바와 같이 다른 주요한 언어들이 C/C++언어의 영향을 많이 받아 설계되었으므로 C/C++언어를 익히면 다른 언어로 건너갈 때 훨씬 용이하므로 전산 관련 학과에서 프로그래밍 입문 언어로 C/C++이 많이 사용된다.


Posted by 살레시오
,

 리눅스 시스템에 전원을 인가한 후 부팅이 끝나면 아이디와 비밀번호를 입력하여 로그인을 할 수 있다. 로그인한 후에는 사용자가 명령을 입력하여 수행할 수 있다. 또는 gui환경이 시작되었다면 터미널(terminal) 창을 열어서 명령어를 입력할 수 있다. 터미널을 실행했을 때 명령을 대기하는 프롬프트의 끝이 $ 라면 현재 사용자를, #로 끝나면 슈퍼 유저(super user, 시스템 관리자를 의미)를 나타낸다. 홈디렉토리는 ~ (틸드) 로 표시한다.


~$_ : 현재 사용자의 명령 대기

~#_ : 슈퍼 유저(시스템 관리자의) 명령 대기


예를 들어 터미널을 실행시켰을 때 다음과 같은 글이 처음에 뜨고 맨 우측에 캐롯(caret)이 깜빡이게 된다.


pi@raspberrypi:~$_


여기서 pi는 현재 사용자의 이름, reapberrypi는 컴퓨터의 이름, 콜론 다음에는 현재 디렉토리, 그리고 $는 쉘 프롬프트(shell prompt)로서 사용자의 명령을 대기하고 있다는 것을 의미한다.


 다음 그림은 데비안 리눅스의 X윈도 터미널을 실행시킨 모습이다.



터미널을 종료하려면 exit 명령을 입력하거나 ctrl-D 키를 누르면 된다.


 캐럿(caret)을 이동시키는데 있어서 좌우 방향키는 한 칸씩 이동하고 [BACKSPACE]는 직전 문자를 하나씩 지우면서 이동, [DEL]키는 직후의 문자를 지움,   [HOME]은 행의 시작으로 , [END]는 행의 끝으로 이동시킨다. 이러한 키들은 문서를 편집하는 프로그램에서 보통 공통적으로 사용되므로 그리 혼동되지 않을 것이다. 다음 표는  터미널에서 사용할 수 있는 그 외의 키와 동작을 요약한 것이다.


키 혹은 키조합

기능

상하 방향키

Ctrl+R

과거에 입력했던 명령들을 입력 순으로 하나씩 불러온다.

과거 명령어 검색

[Shift]+[PageUp]

[Shift]+[PageDown]

터미널에서 화면 밖으로 넘어간 출력 내용을 다시 본다. ( shift 키와 같이 눌러야 한다는 점에 유의.)

Tab

명령어나 파일이름의 자동 완성.

Tab Tab

명령어나 파일이름의 자동 완성 후보 리스트를 표시

Ctrl+C

Ctrl+Z

프로그램 실행을 중단하고 프롬프트를 표시.

프로그램의 실행을 잠시 멈추고 빠져나감.

Ctrl+L

현재의 터미널 표시 내용을 초기화.

Ctrl+D, exit, logout

터미널 종료


 윈도우 OS의 조작에만 익숙해져 있다면 리눅스 터미널에서 명령을 입력하는 방식이 처음에는 조금 어려워 보일 수 있다. 리눅스에서도 GUI 환경을 이용하면 윈도우와 비슷하게 조작을 할 수는 있으나 리눅스 시스템을 다루는데 있어서 터미널 명령에 익숙해지는 과정은  거의 필수적이라고 할 수 있다. 그리고 조금만 익숙해 지면 이 방식이 더 효율적이라는 것을 알게 될 것이다.


리눅스 강좌 전체 목록 >>>


c{linux},n{ln0007}

'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 쉘 명령어 : cd 명령어  (0) 2015.06.02
리눅스 쉘 명령어 : pwd/ls  (0) 2015.06.02
리눅스의 파일 시스템  (0) 2015.05.16
리눅스의 커널(kernel)과 쉘(shell)  (0) 2015.05.16
리눅스(Linux) 소개  (0) 2015.05.16
Posted by 살레시오
,

 윈도우에서 폴더(folder)라고 부르는 파일의 저장 공간을 리눅스에서는 디렉토리(directory) 라고 하며 최상위 디렉토리를 루트(root) 라고 한다. 루트는 ‘/’ (forward slash) 기호로 표기되는데 이 기호는 하위 디렉토리를 나타내는 데에도 사용된다. (윈도우의 경우 폴더를 구분하는데 백워드 슬래쉬 ‘\’ 기호를 사용하므로 처음에는 혼동하기 쉽다.)


  • 디렉토리 (directory) - 파일 저장 공간

  • 루트(root) 디렉토리 - 리눅스 파일 시스템의 최상위 경로

루트 밑에 다양한 디렉토리들이 있는데 리눅스 OS라면 대체로 표준으로 정해진 것들이 있다. 몇 가지 예를 들면 다음 표와 같다.


표 1. 리눅스의 표준 디렉토리 예

/bin

모든 사용자가 실행할 수 있는 기본 명령어와 프로그램

/boot

리눅스 커널 이미지, 부트로더

/dev

시스템의 각종 물리적인 장치를 나타내는 특수 파일

/etc

시스템/x11의 구성 설정 파일 등

/home

사용자의 홈 디렉토리

/root

관리자 홈디렉토리

/lib

프로그램의 라이브러리

/proc

실행 중인 프로세스들과 OS에 대한 정보

/usr

사용자 명령어, 시스템 프로그램, 라이브러리 루틴

/sbin

부팅 관련 명령어

/tmp

임시 파일을 저장하는 공간(시스템 시동시 내용이 모두 삭제됨)

/var

메일, 시스템 로그 및 스풀파일, 웹서비스 관련


이중에서 /home 디렉토리는 윈도우의 “c:\사용자”와 유사한 디렉토리로서 만약 어떤 이용자의 아이디가 pi 라면 /home/pi 디렉토리에 이 사용자가 생성하는 파일들이 저장되게 된다.


리눅스에서는 데이터를 읽을 수 있는 자원 또는 데이터를 쓸 수 있는 대상은 모두 파일로 간주된다. 따라서 디스크에 저장된 전자 정보인 파일뿐만 아니라 입출력 장치(device)들도 모두 파일처럼 사용될 수 있다. 장치를 나타내는 특수 파일은 물리적인 장치에 대한 내부적인 표현으로 키보드(입력 자원, stdin), 모니터(출력 자원, stdout), 프린터 등이 있으며 모두 파일처럼 사용할 수 있다. 디렉토리 자체도 일종의 파일이며 다른 파일들을 조직하고 사용하는데 필요한 정보를 디스크와 같은 저장장치에 저장한 것이다.


리눅스 강좌 전체 목록 >>>


c{linux},n{ln0006}

Posted by 살레시오
,

 리눅스는 커널(kernel)이라 불리는 하드웨어를 직접 제어하는 부분과 그 위에서 커널에 명령을 주는 하나 이상의 쉘(shell)로 구성되어 있다. 커널은 하드웨어를 직접 제어하는 리눅스의 핵심부로서 쉘에서 임무를 받아서 수행한다. 쉘은 명령어 기반 인터페이스인데 이것을 통해서 사용자는 리눅스 OS와 상호 작용을 하게 된다.


  • 커널(kernel) - 리눅스 운영체제의 핵심으로서 프로세스(process) 관리, 메모리 관리, I/O 시스템 관리, 파일 시스템 관리 등을 수행.

  • 쉘 (shell) - 사용자와 내부 커널 사이의 인터페이스 역할 (명령어 해석기)


[그림 1] 리눅스 OS의 구성 계층도


리눅스 커널은 1만 줄 이상의 C 프로그램과 1000여 줄의 어셈블리어로 구성되어 있어서 이식성이 좋다고 한다. 커널은 리눅스가 부팅할 때 메모리로 로딩된다.

[그림 2] 커널과 쉘, 유틸리티, 응용프로그램의 관계도


 그림 2에서 도시된 대로 사용자(user)는 (보통은 키보드로) 명령을 입력하면 쉘에서 그 명령을 해독하여 커널에 전달한 후 그 결과를 출력하게 된다. 쉘을 사용하면 커널단의 복잡한 동작 방식을 알 필요 없이 쉘 상의 인터페이스로 시스템 자원들을 쉽게 관리할 수 있다. 이것이 바로 쉘이 탄생한 이유이기도 하다.


 리눅스에서 쉘은 여러 종류가 있고 쉘마다 특징이 있다. 쉘은 본쉘(bourne shell, bash), C쉘(c shell, csh), 콘쉘(korn shell, ksh)이 있으며, 대부분의 리눅스 시스템에서 본쉘을 사용하고 있다. 본쉘은 쉘프로그래밍(도스로 치면 bat 파일로서 쉘명령어들의 모음)이 쉬운 반면 다른 쉘보다는 사용자와 상호 작용이 부족하다는 단점이 있다.

'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 터미널 기본 입력  (0) 2015.05.16
리눅스의 파일 시스템  (0) 2015.05.16
리눅스(Linux) 소개  (0) 2015.05.16
자유 소프트웨어 재단 (FSF)의 설립  (0) 2015.05.16
유닉스(unix) 소개  (1) 2015.05.16
Posted by 살레시오
,