라즈베리파이3을 구입하기 원했지만 해외배송이 너무 비싼지라

메카솔루션에서 제공하는 '라즈베리 종결키트'! 를 구입했다.

해당 사이트 : http://roboholic1.godo.co.kr/shop/goods/goods_view.php?goodsno=7748&inflow=naver&NaPm=ct%3Dimhbuo94%7Cci%3D9e15ad0ac38c6432801837d6e3b9bf4ec5bdd81c%7Ctr%3Dsls%7Csn%3D188145%7Chk%3D986871c786f96bbb1ef1cfcbb35468e1f036b90b

 

구성품으로는 아래와 같다. 

 옵션은 따로 추가할 시 추가 요금이 든다.

 

많은 센서를 사용해보고 싶다면 메카솔루션의 종결키트를 추천한다!

 

배송 물품을 개봉할 때 모습

 

학부생일 때도 자주 이용했지만 열심히 공부하는 고객을 위한 약과~ 정말 맛있다. 또 상품 손상을 고려해 틈틈히 감싼 뽁뽁이 안전하게 배달안오면 이상할 정도로 잘되있다.

고객을 향한 배려가 엿보이지 않는가 싶다. 

 

구성품은 하나도 빼먹지 않고 잘 도착했다.

 

드디어 라즈베리파이에 입문하게 되었다. 두근두근 설리설리~_~

 

메카솔루션 위에 url을 타고 들어가시면 해당 제품에 대한 자료들을 많이 제공한다.

제품에 대한 정보 뿐 아니라 사용법 등 2차 서비스까지 받을 수 있다.

 

이제 라즈베이파이를 만져보로 고고싱~

 

 

 

 

 

-여러 개의 태스크들 중에서 다음번 수행시킬 태스크를 선택하여 CPU라는 자원을 할당하는 과정을 스케줄링 이라고 함

-  리눅스의 태스크는 실시간 태스크와 일반 태스크로 나뉘며 각각 스케줄링 알고리즘이 구현

* 리눅스가 총 140단계의 우선순위 제공

실시간 태스크 (0~99)

일반 태스크 (100~139)

 

(1) 런 큐와 태스크

- 운영체제는 스케줄링 작업 수행을 위해, 수행 가능한 상태의 태스크를 자료구조를 통해 관리

- 이 자료구조를 런 큐(Runqueue)라 함

- 운영체제의 구현에 따라 런큐는 한개 혹은 여러개 존재 가능

- 자료구조의 모양이나 관리 방법도 달라짐

- ~/kernel/sched/sched.h 파일 내에 struct rq라는 이름으로 정의

- 부팅 이후 각 CPU별로 하나씩의 런큐를 유지

복수개의 CPU를 가진 시스템에서 리눅스의 런큐 자료구조와 태스크의 관계

 

- 새로 생성된 태스크는 부모 태스크가 존재하던 런 큐로 삽입 (더 높은 캐시 친화력 (cache affinity)를 얻을 수 있기 때문에)

- 대기 상태에서 깨어난 태스크는 대기전에 수행되던 CPU의 런 큐로 삽입

 

* 스케줄러가 수행되면 해당 CPU의 런큐에서 다음번 수행시킬 태스크를 고를 때 고려사항

1. 어떤 태스크를 선택할 것인가

   - 일반 태스크를 위해 CFS를 사용하며 실시간 태스크를 위해서 FIFO, RR, DEADLINE 정책을 제공

2. 런 큐간의 부하가 균등하지 않은 경우 어떻게 할 것인가

   - 부하 균등 (load balancing)기법을 제공

        # load_balance() 함수 : 특정 CPU가 많은 작업을 수행하고 있느라 매우 바빠 한가한 다른 CPU에 태스크를 이주(migration) 시켜서 성능 향상

 

 

(2) 실시간 태스크 스케줄링 (FIFO, RR and DEADLINE)

  - 가장 급한 태스크를 한가한 태스크보다 먼저 수행될 수 있도록 해줌 -> 높은 반응성을 보임

  - 어떤 기준에 근거하여 태스크를 골라내는지?

         -> task_struct 구조체는 policy, prio, rt_priority 등의 필드가 존재

  - 실시간 태스크 ( SCHED_FIFO, SCHED_RR, SCHED_DEADLINE)

  - 일반 태스크 (SCHED_NORMAL) , 이와 더불어 중요하지 않은 일을 수행하는 태스크가 CPU 점유를 막기 위해 SCHED_IDLE 정책, SCHED_BATCH정책이 존재

     * 리눅스 실시간 태스크란?  sched_setscheduler()등의 함수를 통해 태스크의 스케줄링 정책을 위 세가지 중 하나로 바꾸게 되면 실시간 태스크가 되는 것

  - 우선순위 설정을 위해 task_struct 구조체의 rt_priority 필드를 사용

      -> 0~99까지의 우선순위를 가질 수 있으며 태스크가 수행을 종료하거나 스스로 중지하거나 혹은 자신의 타임 슬라이스를 다쓸때까지 CPU를 사용

           => 즉 RR인 경우 동일 우선순위를 가지는 태스크가 복수개인 경우 타임 슬라이스 기반으로 스케줄링

 

  -

(1) 상태 전이와 실행 수준 변화

태스크는 생성 뒤 자신에게 주어진 일을 수행하며, 이를 위해 디스크 I/O나 락 등 CPU이외의 자원을 요청

 

특정 태스크가 당장 제공해 줄 수 없는 자원을 요청한다면?

1. 커널은 이 task를 잠시 '대기' 하도록 만듬

2. 다른 태스크를 먼저 수행

3. 태스크가 요청한 자원이 사용 가능해 지면 대기상태의 태스크를 다시 '수행'

 

 

□ EXIT_ZOMBIE 상태

- 말 그대로 죽어있는 상태. Task에게 할당되어 있던 자원을 대부분 커널에게 반납한 상태.

- 자신이 종료된 이유를 부모 태스크에게 알려주기 위해 유지 되고 있는 상태

 

□ EXIT_DEAD 상태

- 부모 Task가 wait()을 호출하면 자식 태스크의 상태가 EXIT_DEAD로 바뀜

- 부모는 자식의 종료 정보를 넘겨받고 자식태스크는 자신이 유지하던 자원을 모두 반환하고 최종 종료됨

 * 부모 task의 wait()함수 호출 전 먼저 사라지게 되면 고아 태스크가 영원히 존재해 시스템의 오버헤드로 작용됨

     --> 이 문제를 해결하기 위해 커널은 고아 task의 부모를 init task로 바꾸어줌 (task_struct 구조체에 real_parent와 parent 2개의 필드가 존재하는 이유)

 

□  TASK_RUNNING 상태

- 실제 수행중인 task의 상태 (running)과 수행되던 task가 자신에게 할당된 CPU 시간을 모두 사용하여 다시 준비중인 상태 (ready)

 

□  TASK_INTERRUPTIBLE 상태

- 실행 상태에 있던 태스크가 특정한 사건을 기다려야 할 대기상태로 전환되어 기다리는 사건에 따라 특정 큐(queue)에 매달려 대기중인 상태

- 대기하는 동안 자신이 기다리는 그 사건 외에는 일체 방해받아선 안 되는 경우가 있을 수 있는데 이 경우가 TASK_UNINTERRUPTIBLE.

- 이후 기다리던 사건 발생 시 대기 상태에 있던 TASK가 다시 준비(ready)상태로 전이하게 되며 다시 다른 태스크들과 함께 스케줄링 되기 위해 경쟁함.

  * TASK_UNINTERRUPTIBLE 상태의 Task가 시그널에 반응하지 않기때문에 생기는 문제

     -> (예> 쉘에서 'kill -9 pid' 등의 명령을 수행해도 태스크가 종료되지 않음)

         => 이를 해결하기 위해 TASK_KILLABLE 상태가 도입

 

(2) TASK_RUNNING(running) 상태의 수준

- 실제로 실행중인 TASK_RUNNING(running) 상태는 다시 사용자 수준 실행 상태와 커널 수준 실행 상태로 구분할 수 있음

 

□ 사용자 수준 실행 (user level running)

- CPU에서 사용자 수준 프로그램의 제작자가 만든 프로그램이나 라이브러리 함수를 수행하고 있는 상태로 사용자 수준의 권한으로 동작

 

□ 커널 수준 실행 (kernel level running)

- CPU에서 커널 프로그램의 일부분을 수행하고 있는 상태로, 사용자 수준 권한보다는 더 강력한 커널 수준 권한으로 동작

 

* 사용자 수준에서 커널수준 실행상태로 전이하는 방법

  1. 시스템 호출

  2. 인터럽트 발생

 

(3) 커널 수준의 프로그램

- 커널 수준의 프로그램은 바로 리눅스 그 자체임

- 리눅스도 C와 어셈블리어로 작성된 S/W이기 때문에 수행되기 위해서는 스택을 필요로 함

 

 

- 리눅스 커널은 태스크가 생성될 때마다 태스크 별로 task_struct 구조체와 8KB의 스택을 할당해 줌

- 8KB의 스택은 thread_union이라 불림, thread_info(프로세스 디스크립터) 구조체도 포함 되어있음.

-Pt_regs는 수행을 마친 task가 사용자 수준 실행상태로 복귀하기 이전 수행 작업에 대한 정보 저장 

(root 계정에서 수행)

vim 설치

# yum install vim -y

 

gcc 설치

# yum install compat-gcc-34 -y

 

#vim a.c   ( a.c라는 파일을 생성하며 내용 작성 )

 

 

:wq로 저장 후 나옴

 

gcc [옵션] [바이너너리파일] [.c파일]

 

# gcc -o a a.c

a라고 초록색으로 바이너리 파일이 생성됨

 

#./a ( 바이너리파일 a를 실행 )

 

 

* vim 환경을 제작편하도록 변경

 

# vim ~/.vimrc (새파일 생성)

 

 "새로운 행의 인덴트를 현재행과 같게 한다
set autoindent
"백업파일을 만드는 디렉토리
set backupdir=$HOME/vimbackup
"파일 보존 다이얼로그의 초기 디렉토리를 버퍼 파일 위치로 설정
set browsedir=buffer
"클립보드를Windows(와)과 제휴
set clipboard=unnamed
"Vi호환을 오프
set nocompatible
"스ž
set directory=$HOME/vimbackup
"탭 대신에 공백 문자를 삽입한다
set expandtab
"변경중의 파일에서도, 보존하지 않고 다른 파일을 표시
set hidden
"인크리멘탈 서치를 실시한다
set incsearch
"탭 문자, 줄 끝 등 불가시 문자를 표시한다
set list
"list그리고 표시되는 문자의 포맷을 지정한다
set listchars=eol:$,tab:>\ ,extends:<
"행 번호를 표시한다
set number
"시프트 이동폭
"set shiftwidth=4
"닫아 괄호가 입력되었을 때, 대응하는 괄호를 표시한다
set showmatch
"검색시에 대문자를 포함하고 있으면 대/소를 구별
set smartcase
"새로운 행을 만들었을 때에 고도의 자동 인덴트를 실시한다
set smartindent
"줄머리의 여백내에서 Tab (을)를 박으면,'shiftwidth' 의 수만큼 인덴트 한다.
set smarttab
"파일내의 <Tab> 하지만 대응하는 공백의 수
"set tabstop=4
"커서를 줄머리, 줄 끝으로 멈추지 않게 한다
set whichwrap=b,s,h,l,<,>,[,]
"검색을 파일의 선두에 루프 하지 않는다
set nowrapscan

 

 

 

1. New Virtual Machine을 클릭 후

가상 디스크를 하나로 관리할지 여러개로 분할해서 관리할지 물어보는 창이다

Store virtual disk as a single file 로 설치 

 

Customize Hardware 클릭해서 기본적인 하드웨어 설정을 해줍니다

 

필요없는 device는 삭제해주고 Memory는 성능향상을 위해 2GB로 변경후 CD에 iso파일을 넣어주고 close

 

설치를 하기위해 Install to hard Drive 클릭

 

설치는 한국말로 ~

키보드 레이아웃으로 영어설정을해주고 한글은 따로 설치해서 사용 예정

 



 1. VM ware 가상공간 생성

 

 

 

 

 

 

불 필요한 장치 제거

 

 

 2. Ubuntu 설치

 

 

 

 

 

 

리눅스 운영체제에서 기본적으로 최고 관리 권한 계정인 root 계정을 보안상의 이유로 활성화 시켜놓지 않음.

계정이 보안상의 이유로 잠겨 있기 때문입니다.

 

참고로, 일시적 최고 권한을 얻기 위해 터미널 명령에 접두사로 sudo라는 명령어를 씀.

sudo :

 -  Super User do 의 약자. 하나의 명령에 대해서 일시적으로 최고 관리 권한을 가짐

 - 현재 로그인된 계정의 암호를 물음

 

또는 일시적으로 최고 관리자 계정을 사용하기 위해 su 라는 명령어를 사용하기도 함.

su :

 - Super User의 약자

 - 최상의 권한을 갖는 유저

 - 해당 터미널 세션에 한해서 일시적으로 root 계정처럼 사용할 수 있도록 권한을 부여

 

Root 계정 암호 설정하기

초기 root을 사용하기 위해선 계정암호를 설정해야 함

 

passwd [계정명] 으로 passwd로 변경 할 수 있음.

최상위 권한을 얻어 비번을 바꾸기 위해

# sudo passswd root

후 비밀번호 설정하면됨 

 

 

 

'Study Note > OS' 카테고리의 다른 글

[Linux] Vmware 설정 및 fedora 23 설치  (0) 2016.03.23
[Linux] VMware workstation 에 Ubuntu 설치  (0) 2016.03.10
[Linux] Task 관리  (0) 2016.03.07
[Linux] 리눅스 커널 컴파일 (fedora)  (0) 2016.03.07
[Linux] 리눅스 커널 구조  (0) 2016.03.07

OS  Log성 파일 관리 Shell

OS Log성 파일 관리 Shell



개발목적 : Log File은 어떤 System을 가더라도 존재하기 마련이다. 이러한 Log File들을 관리 없이 그대로 방치하게 된다면 System 성능에 무리를 주게 된다. 이러한 이슈를 해결하고자 자동으로 생성되는 Log들을 대상으로 통합적으로 관리할 수 있도록 Shell을 작성한다. 리눅스 명령어에 대한 전반적인 이해와 DB운영에 있어 이슈가 될 만한 부분들을 자동적으로 관리하기 위한 목적으로 작성한다.

개발환경 : Ubuntu, Bourne Shell

구현내용 :

관리의 용이함을 위한 Split, Compress, Delete 수행 주기를 일 단위로 입력받는다.

사용자는 파일 리스트만을 관리하므로 수정 혹은 삭제가 가능하도록 제작한다.

crontab을 이용해 일 단위로 서비스 점검 시간에 맞춰 수행하도록 설정한다.

file list 등록 화면

전체적인 흐름도

구성

구분

구현내용

파일 리스트

log file들의 filepattern, 삭제, 스플릿의 주기와 수행 여부를 입력 받아 list형식으로 받게 제작하였다.

스플릿

쌓이는 log 파일을 출력 리다이렉션을 이용해 새로운 파일로 작성하고 그 파일들을 파일 리스트의 정보에 따라 스플릿 하게 제작하였다.

압축

저장되고 있는 log 파일들을 더욱 효율적인 메모리 공간 사용을 위해 파일 리스트의 정보에 따라 압축하도록 제작하였다.

삭제

저장되고 있는 log 파일들을 파일 리스트의 정보에 따라 삭제하도록

제작하였다.

나의 의견

처음 배우고 처음 다뤄본 Linux Shell이었지만, 처음이라는 만큼 많이 시간과 애착을 들여 작성한 Shell입니다.

테스트 환경이기 때문에 log file을 테스트하기에 직접 Shell에서 발생하는 에러를 경험하기가 어려웠습니다.

또 처음 알고리즘을 만들고 제작하였지만, 추가되는 부분에 있어 엉키는 부분이 생겨 다시 알고리즘을 그리고

제작한 고난도 있었습니다. 덕분에 알고리즘의 중요성도 재차 느끼게 되었습니다. Shell을 다른 환경으로

들고 갔을 때, 작동이 되지 않았고 이식성에 대해 고려도 해봐야 한다고 생각하여 작성하였습니다.


'Study Note > My work' 카테고리의 다른 글

Rand() 함수를 이용하여 C언어 게임 만들기  (0) 2016.03.07
Motion Controller  (0) 2016.01.25
주차 예약 시스템  (0) 2016.01.25
Android Application을 이용한 LED 제어  (0) 2016.01.25
라인트레이서  (3) 2016.01.25

Rand() 함수를 이용하여 C언어 게임 만들기

Rand() 함수를 이용하여 C언어 게임 만들기



개발목적 : 절차적 프로그래밍을 이해하면서 동시에 조건문, 반복 문과 배열을 사용하여 주어진 조건(Rand() 함수 사용)에 따라 게임을 완성하고 C언어에 대한 완벽한 이해를 위하여 제작하였다.

개발환경 : Visualstudio2010, C언어

구현내용 :

Rand() 함수를 이용하여 제공되는 특수문자들을 Random으로 나열하도록 제작하였다.

짝을 맞출 시 그 자리에 그대로 남아있고, 틀리면 다시 “?”로 돌아오게끔 제작하였다.

Hint를 사용할 시 아직 공개되지 않은 부분만 보이도록 제작하였다.

게임 설명

진행 화면

 

나의 의견

C언어를 공부에 있어 따분한 예시들을 사용하는 것이 아니라 게임을 제작함으로써 흥미도가 굉장히 높았던 것 같습니다. 게임을 제작하게 되면 프로그램이 커지게 되고 소스 코드 안에 사용되는 구문들이 자연스레 많아지고 이중, 삼중으로 사용하여 단순히 이해하는 게 아니라 직접 사용해보고 원리도 쉽게 파악했던 것 같습니다.

프로그램을 제작하면서 처음 써보는 함수들도 있었고, 사용자 정의 함수를 만들어 사용하다 보니 많은 버그도 생겼었습니다. 버그 수정 과정이 대부분 많은 시간을 차지하였고 그 시간이 길었지만, 무언가 하나하나 완성되는 과정을 보고 지루하지 않았습니다. 프로그램을 제작할 때 성능을 고려하여 자료형 변수까지 고민해가며 제작하였고, 다음 프로그램을 제작할 때도 충분히 많은 고려를 해가며 제작해야겠다고 느꼈습니다.


'Study Note > My work' 카테고리의 다른 글

OS 내 Log성 파일 관리 Shell  (0) 2016.03.07
Motion Controller  (0) 2016.01.25
주차 예약 시스템  (0) 2016.01.25
Android Application을 이용한 LED 제어  (0) 2016.01.25
라인트레이서  (3) 2016.01.25

Task 관리

정의

Task :  '자원소유권의 단위'

Thread : '수행의 단위'

Process : '동작중인 프로그램'


사용자 입장에서 프로세스 구조

텍스트 - CPU에서 직접 수행되는 명령어

데이터 - 전역변수 

스택 -  지역변수와 인자 그리고 함수의 리턴 주소  존재

힙 - 동적 할당받은 내용이 존재

 * 이 때 각 영역을 세그먼트 또는 가상 메모리 객체 라고 함


프로세스와 쓰레드의 생성과 수행

1. 새로운 프로세스를 생성하면, 생성된 프로세스(자식 프로세스)와 생성한 프로세스(부모 프로세스)는 서로 다른 주소공간을 갖는다

  반면, 새로운 쓰레드를 생성하면 생성된 쓰레드(자식 쓰레드)와 생성한 쓰레드(부모 쓰레드)는 서로 같은 주소공간을 공유한다.

2. - 같은 프로세스에서 새로운 쓰레드를 생성할 경우 기존 쓰레드와 생성된 다른 쓰레드가 함께 동작하고 있는 것으로 볼 수 있다.

  즉, 한 프로세스에 2개의 쓰레드가 동작하는 것. (한 프로세스에 여러 쓰레드가 동작하는 모델 = 다중 쓰레드 시스템)

   - 쓰레드 생성은 새로이 모든 자원을 생성해 주어야 했던 프로세스에 비해 생성에 드는 비용이 비교적 적다.

3. 자식 쓰레드에서 결함이 발생하면 그것은 부모 쓰레드로 전파된다.

  반면 자식 프로세스에서 발생한 결함은 부모 프로세스에게 전달되지 않음

  결국, 쓰레드 모델은 지원공유에 적합하며, 프로세스 모델은 결함 고립에 적합한 프로그래밍 모델이다.


리눅스의 태스크 모델



프로세스는 자신이 사용하는 자원과 그 자원에서 수행되는 수행 흐름으로 구성.

이를 관리하기 위해 각 프로세스마다 task_struct라는 자료 구조를 생성

리눅스 커널은 프로세스 또는 쓰레드 중에서 어떤 것이 요청될 지라도, 모두 task_struct 자료 구조로 동일하게 관리

즉, 사용자 수준에서 쓰레드를 생성하면 그 쓰레드의 존재를 커널도 안다


태스크 문맥

태스크와 관련된 이러한 '모든' 정보를 문맥이라고 부름.

- 시스템 문맥 : 태스크의 정보를 유지하기 위해 커널이 할당한 자료구조들

  (task_struct, 파일 디스크립터, 파일 테이블, 세그먼트 테이블, 페이지 테이블 등) 

- 메모리 문맥 : 텍스트, 데이터, 스택, heap 영역, 스왑 공간 등이 여기에 포함

- 하드웨어 문맥 : 문맥 교환 할 때 태스크의 현재 실행 위치에 대한 정보를 유지하며, 쓰레드 구조 또는 하드웨어 레지스터 문맥 이라 불림


각 변수를 관련 있는 것 끼리 구분

가. task identification

- 태스크 ID를 나타내는 pid, 태스크가 속해있는 쓰레드 그룹 ID를 나타내는 tgid,

  pid를 통해 해당 태스크의 task_struct를 빠르게 찾기 위해 커널이 유지하고 있는 해쉬 관련 필드 등의 변수가 있음

 (uid[사용자 ID], euid[유효 사용자ID], suid[저장된 사용자 ID], fsuid[파일시스템 사용자 ID], gid, egid, sgid, fsgid)


나. state

- 생성에서 소멸까지 많은 상태를 거치며, 이를 관리하기 위한 state변수가 존재

(TASK_RUNNING(0), TASK_INTERRUPTIBLE(1), TASK_UNINTERRUPTIBLE(2), TASK_STOPPED(4), TASK_TRACED(8), EXIT_DEAD(16), EXIT_ZOMBIE(32))


다. task realationship

- 태스크는 생성되면서 가족 관계를 갖음

- 현재 테스크를 생성한 부모 태스크의 task_struct 구조체를 가리키는 real_parent와 현재 부모 태스크의 task_struct 구조체를 가르키는 parent 필드가 존재


라. scheduling information

- task_struct에서 스케줄링과 관련된 변수 : prio, policy, cpus_allowed


마. signal information

- 시그널은 태스크에게 비동기적인 사건의 발생을 알리는 매커니즘

- 관련 변수 : signal, sighand, blocked, pending


바. memory information

- 태스크는 자신의 명령어와 데이터를 텍스트, 데이터, 스택 그리고 힙 공간 등에 저장

- task_struct엔 이 공간에 대한 위치와 크기, 접근 제어 정보 등을 관리하는 변수 존재


사. file information

- 태스크가 오픈한 파일들은 task_struct에서 files_struc구조체 형태인 files라는 이름의 변수로 접근 가능

- 루트 디렉터리의 inode와 현재 디렉터리의 inode는 fs_struct 구조체 형태인 fs라는 변수로 접근 가능


아. thread structure

- 문맥 교환을 수행할 때 태스크가 현재 어디까지 실행되었는지 기억해놓는 공간


자. time information

- 태스크 시간 정보를 위한 변수로는 태스크가 시작된 시간을 가리키는 start_time, real_start_time 이 있음

- 사용한 CPU 시간의 통계를 담는 필드도 있음


차. format

- 리눅스는 Linux exec 도메인뿐만 아니라 BSD나 SVR4 exec 도메인도 지원

  * BSD나 SVR4 커널에서 컴파일 된 프로그램도 리눅스에서 재 컴파일 없이 수행 될 수 있다는 의미

- personality 변수 사용

- 이진 포맷을 지원하기 위한 필드가 thread_info 내에 존재


카. resource limits

- 태스크가 사용할 수 있는 자원의 한계를 의미

- rlim_max : 최대 허용 자원의 수

  rlim_cur : 현재 설정된 허용 자원의 수

- 자원의 한계가 배열로 구현되어 있으며, 현재 리눅스 커널에는 최대 16개의 자원에 대한 한계를 설정

+ Recent posts