다음과 같은 간단한 구조의 반복문이 2개 있다.

   

 

 

 

2개는 기능상 동일한 흐름을 가지고 동작하는 것을 확인할 수 있지만, 다음과 같은 반복문에는 5배의 반복 횟수 차이가 있다.

2개 프로그램에 대한 수행시간을 확인해보면 다음과 같은 결과를 얻는다.

 

 

 

 

 

조금 더 반복 횟수와 증가 크기를 확장하여 수행시간을 측정해보았다.

 

 

프로그램을 총 10번의 실행으로 평균치를 구한 결과이다.

시간 측정 결과 증가폭이 클수록 다음과 같이 수행시간이 줄어들었음을 확인할 수 있었다.

 

 

 

 

다음으로 처음 예제 반복문에 대한 Assembly 코드를 비교하였다.

 

 

 

라인수는 확실히 오른쪽이 늘어난 것을 확인할 수 있다.

하지만 오른쪽 반복문이 속도면에서는 우월함을 보이고 있다.

2개 반복문이 차이라고 한다면 반복문 안에서 수행하는 함수 콜 갯수의 문제 또는 반복 횟수에 대한 제어의 문제일 것이다.

 

반복문 루틴을 돌면서 반복할 것인지에 대한 것을 제어문을 통하여 체크를 하게 되는데,
문제는 여기서 생기는 파이프라이닝에서 제어 헤저드로 인한 붕괴 현상일 것으로 생각된다.

 

 

 

 

코드의 가독성이나 관리측면에서는 왼쪽의 반복문 코드가 확고하나 제약적인 상황(임베디드 관련)의 프로그램을 위해서라면,

오른쪽과 같이 제어문에 대한 횟수를 줄이는 것이 속도면에서 성능을 올리는데 더 효율적이지 않을까 생각한다.

뭐든 Trade-Off 이겠지만...

Posted by Programist
,

눅스 커널 컴파일 방법에 대한 메모

 

OS : CentOS 6.3

Kernel 버전 : 2.6.32-279.19.1.el6.i686 -> 2.9.39 로 업데이트

 

 

1. 일단 커널 컴파일시, 메뉴를 화면에 뿌려주기 위한 ncurses-devel를 설치한다.

 - yum install ncurses-devel

 

 

 

2. 컴파일 하고 싶은 커널 버전 다운로드 (http://www.kernel.org/pub/linux/kernel)

 - 경로 : /usr/src (경로는 자기가 원하는 곳으로 설정하면 된다)

 - wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz

 

 

 

 

3. 압축을 풀고, 링크 설정을 한다. (사실 안해도 상관은 없다.)

- tar xvfz linux-2.6.39.tar.gz

- ln -s linux-2.6.39 linux

 

 

 

 

4. 커널 컴파일 하기 전, 커널에 대한 설정을 한다.

 - cd /usr/src/linux

 - make mrproper
 - make clean
 - cp /boot/config-`uname -r` ./.config
 - make menuconfig

 

 

 

 

  - Load and Alternaate Configuration File로 들어가서 .config 입력 후 OK 버튼

 

 

 

 - General setup 선택

 - enable deprecated sysfs features to support old userspace tools (NEW) 에서 "y" 키로 선택

 

 

 

 - Local Version 선택

 - 커널 뒤에 붙을 이름 입력 (-release를 붙혔다면 2.6.36-release로 생성 됨)

 

 

 

  - Save and Alternaate Configuration File로 들어가서 .config 입력 후 OK 버튼

 

 

 

 

5. 커널을 빌드한다.

 - make all

 - make modules_install

 - make install

 

 

6. 부팅 시, Load할 커널을 설정한다.

 - vi /boot/grub/menu.lst

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sde
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.39release)
        root (hd0,0)
        kernel /vmlinuz-2.6.39release ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=ko_KR.eucKR rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto rd_LVM_LV=VolGroup/    lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.39release.img
title CentOS (2.6.32-279.19.1.el6.i686)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-279.19.1.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=ko_KR.eucKR rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto rd_LVM_L    V=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-279.19.1.el6.i686.img
title CentOS (2.6.32-279.el6.i686)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-279.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=ko_KR.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto rd_LVM_LV=Vol    Group/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-279.el6.i686.img

 

 

 

 


 

 

 

 

Posted by Programist
,

vi 편집기 설정 방법

Linux 2014. 11. 29. 19:02

Linux에서 가장 기본이 되는 편집기인 vi에 대한 설정 방법에 대하여 설명한다.

사실 vi 보다는 vim이 더 많은 기능과 설정을 제공하기 때문에

vim을 설정해주고 vi를 alias하는 방법을 사용한다.

vim에서의 옵션은 웹에 찾아보면 알겠지만 실제로 어마어마하다 ;;;

간단히 색상과 줄번호 정도의 설정을 통해서 설정 방법을 설명한다.

 

 

처음 만나는 vi 편집기는 이렇게 투박하다.

 

 

1. vi ~/.vimrc로 편집 (없으면 생성) 

 

 

 

2. vi ~/.bashrc (vi를 사용하면 vim이 열리도록 alias 설정함.) 

 

3. 변경된 bashrc를 적용하기 위하여 /bin/bash 실행

 

4. 적용 후 화면 

 

 

 

맨 처음에도 소개했다시피, vim의 설정 옵션은 엄청 많다.

vim에 대한 메뉴얼을 찾아보고 입맛에 맞는 편집기를 설정하여 사용하면 되겠다.

 

Posted by Programist
,

간혹 root 비밀번호를 잊어버렸을 때 고생하는 경우가 있다.

 

1. 부팅 화면이 뜰 때 Enter를 눌러 부팅 선택 메뉴로 들어간다.

 - 부팅하고자 하는 커널 버전을 선택하고 'e'키를 누른다.

 

 

 

2. 'e'키를 눌렀을때의 화변 전환

 - kernel이 있는 라인을 선택하여 'e'키를 눌러 Edit 모드로 들어간다.

 

 

 

3. Edit 모드에서 kernel의 가장 끝 quiet 뒤에 '1' 또는 'single'을 입력하고 Enter를 누른다.

 

 

 

4. Edit하기 전의 모드로 다시 돌아오게 되는데 'b'를 눌러 부팅을 한다.

 

 

 

 

5. passwd 명령어로 비밀번호를 다시 정정한다.

 

Posted by Programist
,

 



 

이름 하여 '상황인식 전자 의수'
처음은 터미네이터 손을 만들어 보려고 했으나... ㅠㅜ


 

 

 


그래도 나름 들어간 기술은

안드로이드 모바일 프로그래밍
안드로이드 폰 사진을 영상처리하는 영상처리 프로그래밍
영상을 처리해서 블루투스로 전송하는 네트워크 프로그래밍(?)
스테핑모터 제어와 초음파센서, 블루투스 모듈을 컨트롤하는 임베디드 프로그래밍... -_-;;

 

 

 

 


분명 들어간 기술은 대상감이였는데...

마무리가 미흡해서 오락가락...
프로그래밍보다 손을 만드는데 더 시간이 투자되었다는

 

 

 

우리 기계기술팀의 말씀...
(기계과도 전자과도 아닌, 그들도 컴공과이다... ㅠㅜ)

그래도 동상이 어디인고 ㅎㅎㅎ

 

 

 

 

Posted by Programist
,

4학년 1학기 중간무렵인가...? 수업시간에 갑자기 문득 생각이 들어 만들어 보게 된 프로그램...
USB 파일 복사로 몰래 빼오는, 한마디로 USB 파일을 훔치는 프로그램이다.



USB FileStealer v1.0

 

 

초창기 버전이다.
이 당시에만 해도 Hooking에 대한 방법이라는 것을 몰라서,
그냥 타이머 설정으로 주기마다 USB를 긁어오는 방식을 사용했다.

또한 USB장치 인식에 대한 Message를 받아오는 방법도 몰라서, 그냥 USB를 꽂으면 당연히 E드라이브 이겠거니,
예상을 하며 대상 위치 설정을 해줘야 했던 불편함과 무식함으로 일구어 낸 작품이다. ㅋㅋ

작업표시줄에도 프로그램 뜨는것을 숨기는 방법은 알았으나, 마찬가지로 Keyboard Hooking방법을 몰랐던 당시로서는 어쩔 수 없이, TrayIcon화를 해야 했었다.

하지만, TrayIcon화를 하면 티가 나지 않겠는가!?
그래서 그냥 더블클릭하면 Security창이 뜨게 만들었다. 비번은? 0000 ㅡ,.ㅡ;;;


 

USB File Transmission v2.0 for C#

 

 


4학년 1학기가 끝나갈 무렵, 다시 업데이트를 해보자는 마음으로 손을 대고, 인터페이스 간략화를 시도한
USB File Transmission v2.0 for C#.
사실 Stealer라는 이름이 너무 노골적이라서, 프로그램 이름을 변경;;

USB Device 장치 인식 시에 발생하는 Message를 보고, Copy Process를 실행하게 된다.

또한 KeyboardHooking을 지원하여, 작업표시줄의 내역과, TrayIcon을 제거하더라도, Alt+F12의 단축키로 프로그램을 올리고 숨길 수 있었다. (하지만 그냥 왠만한 컴퓨터 아는 사람들은 작업관리자에서 확인가능 ㅡ,.ㅡ)

Setting.ini파일에 설정에 대한 내역을 저장하여, 언제든지 프로그램을 실행시키면, 기존의 설정을 그대로 유지할 수 있도록 하였다.


USB File Transmission v2.1 for MFC

 

 


 

방학 후, 다시 한번 MFC로 컨버팅을 해보았다.
기능도 HardDisk와 FTP Server 2가지 방법으로 복사가 가능하도록 추가하였고, 파일 확장자에 복사를 1가지에서 여러가지로 목록을 추가, 삭제를 할 수 있도록, 인터페이스를 개선하였다.

나머지는 기존의 방식과 그대로~



이런 프로그램 한번쯤을 다들 생각해 볼 것이라 생각하고, 벤치마킹을 하기 위해, 다른 사람이 만든 여러 자료를 찾아봤지만 예상외로 이상하게 이런쪽의 프로그램이 엄청 드물었다.
다만, 검색해보니, 이런 어두운 쪽보다, USB File Backup같은 의미있는 프로그램들도 있는 것을 보고, 이걸 그런쪽으로 한번 바꿔보까 생각도 든다.
(물론 귀찮으면 안하겠지만...)

Posted by Programist
,

3학년 2학기 Database 프로그래밍 Term Project이다.
다행히 100점 맞은 열차 예약 관리 프로그램이다 ㅋㅋ
C#에 대해서 하나도 몰랐는데... 한학기 기간동안 잘 넘어간거 같다 ^^;;
여러므로 많은 경험이 된 Project였던것 같다.. 특히 DB설계 ㅠㅠ 
C#이라는 언어로 하기가 이렇게 편한지도 처음 알았고 ㅠ
깊이 들어가면 얘기는 다르겠지만 ㅡ,.ㅡ;; 아직까지 이정도는;;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by Programist
,

v응용 프로그램
ü시스템에 준비된 함수나 프로그램 자체적으로 선언된 함수를 이용해 특정 기능을 수행하도록
구현한 프로그램
.
ü리눅스에서 동작하는 응용프로그램은 하드웨어에 직접 접근 불가

-> 디바이스 파일이라는 특수 파일을 이용

v디바이스 파일
ü커널 내의 파일 시스템 구조에 의해 하드웨어를 제어하는 디바이스 드라이버 함수와 연결.

-> 따라서 응용프로그램은 하드웨어를 제어하기 위해, 저수준 파일 입출력함수를 사용하여,
디바이스 파일에 데이터를 쓰거나 읽고, 그 결과로 하드웨어를 제어하는 디바이스 드라이버 함수가 호출되어 동작.
 

 

 

 



v
노드번호는 장치 종류, 주번호 (Major Number), 부번호(Minor Number)로 구성
ü장치 종류 : 장치의 종류를 표현
ü주번호 : 커널에서 디바이스 드라이버 선택시 사용
ü부번호 : 디바이스 드라이버가 디바이스 선택시 사용
 
v디바이스 파일 생성 : mknod 명령어
ümknod device_file [b|c] major_num minor_num

 



v문자 디바이스 드라이버

ü파일 오퍼레이션 : 문자 디바이스 드라이버와 응용 프로그램을 연결하는 고리.
ü응용 프로그램이 저수준 파일 입출력함수를 사용하여, 디바이스 파일에 접근하면,
커널은 등록된 fops 참고하여, 대응하는 커널 함수를 호출함.
ü문자 드라이버 등록 및 제거
§등록

               int XXX_init()

{

  fops.open = XXX_open;
  fops.release = XXX_release;
  fops.write = XXX_write;
  fops.read = XXX_read;
  regster_chrdev(unsigned int major, const char *name, struct file_operations *fops);

}

§제거

               int XXX_exit()

{

  unregister_chrdev(unsigned int major, const char *name);

}


 

 

 




 

Posted by Programist
,

v리눅스 커널 모듈

ü명령에 의하여 리눅스커널에 적재하거나 제거할 수 있는 실행가능한 프로그램
v모듈 프로그램
ü커널의 일부 기능을 커널에서 가져와서 모듈로 구현
ü기능이 필요할 때만 메모리에 적재

 

 

 



v
모듈 소스 형식 (Kernel Ver. 2.6)
=====================================================
#include <linux/init.h>
#include <linux/module.h>
#incldue <linux/kernel.h>
int xxx_init(){
...
printk("Hello World!\n");
...
}
void xxx_exit(){
...
printk("Good-Bye World!\n");
...
}

module_init( xxx_init );
module_exit( xxx_exit);

MODULE_LICENSE( "GPL" );
=====================================================
여기서 xxx는 모듈프로그램 이름(사용자가 임의로 지정가능)


v
모듈프로그래밍 Makefile 생성 방법
=====================================================
KERNELDIR = /lib/module/$(shell uname -r)/build

obj-m := 소스파일명.o

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR)  SUBDIRS=$(PWD) modules
clean:
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf *.o
=====================================================

처음에는 "
obj-m := 소스파일명.o" 이부분때문에 object파일을 만들어야 하는 줄 알고,
한참 해맸는데 알고보니 "
소스파일명.c" 소스파일을 가지고, 그냥 make 실행시키면 자동으로
"소스파일명.o" 파일과, "소스파일명.ko" 파일을 만들어준다.
 

v
커널용 출력함수 printk()
ü커널용 출력함수로써 printf()와 유사하다.
ü커널 프로그래밍 디버깅시 유용하게 쓰임.
ü단, printk()함수를 사용할 경우, 화면에 뿌려주는게 아니라 시스템로그에 남게 된다. (dmesg)


 

 

 

v모듈 유틸리티
üinsmod : 모듈을 커널에 적재한다. (insert module)
ürmmod : 커널에서 모듈을 제거한다. (remove module)
ülsmod : 커널에 적재된 모듈 목록을 보여준다 (list module)
üdepmod : 모듈간 의존성 정보를 생성한다. (depend module)
ümodprobe : depmod에 의해 갱신된 모듈을 찾아 적재한다. (module probe)

 

 



Posted by Programist
,

Linux USB 마운트 방법

Linux 2014. 11. 29. 18:34


1. 마운트할 USB장치 파일 확인
  - fdisk -l

 

 

 


2. 해당 USB장치 마운트
  - mount -t vfat /dev/sdb1 /mnt/마운트할 디렉토리명

3. 해당 USB장치 마운트 해제 
  - unmount /mnt/마운트할 디렉토리명

Posted by Programist
,