크리에이티브 커먼즈 라이선스
Creative Commons License
출처 : http://jeminency.tistory.com/98

이전에 포스팅했듯이 여전히 직장을 찾는 상태입니다.
그 와중에 우연히 싱가폴 주재 회사와 컨택을 하게 되었는데 이력서를 보고는 프로그래밍 퀴즈를 보내 오더군요. ACM이나 구글 코드 잼 스타일의 '특수상황을 기발하게 수학적으로 해결'해야 하는 그런 문제는 아니었습니다.

첫번째 문제는 string rotation 함수를 짜는 거였죠. ("abcd", 1)로 호출하면 "dabc"로 리턴되는 뭐 그런 거요.
제약사항이 몇 가지 있었는데 인자로 넘겨주는 문자열에 직접 operation해야 하고, dynamic allocation을 쓰면 안되고, 표준 함수를 쓰면 안되고, 루프를 최대한 적게 써야 하는... 뭐 그런 조건들이었습니다. 좀 생각해보면 malloc 쓰지 않고 문자열 길이와 상관없이 O(n)으로 가능하죠.

그렇게 첫번째 문제를 풀어 보내고 며칠 있다가 두번째 퀴즈를 받았습니다 -_-;;;
첫번째는 소위 걸러내기용이고 두번째가 좀 더 진지한 테스트라고 하더군요.
그래서인지 두번째는 문제도 두 개였는데, 하나는 strtok와 비슷하면서도 좀 더 고차원적인 기능을 하는 str_split함수를 만드는 거였고,  다른 하나는 '범용성 있는' hash table 모듈을 만드는 거였습니다.

첫번째와 차이가 있다면 단순한 기능 구현 뿐만 아니라 여러 가지 feature를 생각해서 추가 구현해보라는 식의 멘트가 있었다는 건데요. 예를 들면 wchar_t에 대한 고려 같은 거죠.
근데 이번에는... 좀 상황이 달라졌습니다. 싱가폴 집값이 비싼 탓에 그 쪽의 대우가 나쁘지 않다 하더라도 갈 맘이 좀 줄어든 거지요 -_-;
게다가 마냥 저 문제 풀이에만 매달려 있는 것도 힘들었고요. 두번째 문제는 정말 제대로 짜려면 두 가지 모두 며칠씩은 매달려야 할 거 같아서 기능만 돌아갈 정도로, 하루이틀만에 상당히 rough하게 짜서 보냈습니다.

그런데 이번에는 답장이 영 다르게 왔더군요. 제 코드를 상당히 세세하게 지적하면서요 -_-;;
영어로 왔었는데 간단하게 요약하면,

  • 전역변수를 써서 thread unsafe하다
  • ~~ 이런 상황에 버그가 있다
  • (작동에는 문제가 없지만) 모 표준 함수에 대한 헤더파일이 없다.
  • 해시 테이블에 메모리 릭이 있다.
  • 해시 테이블에 공간이 모자라면 bucket을 2배수로 재할당 하도록 짰던데 다른 방법은 없을지?
  • add_key()에서 ~~ 상황이 고려되지 않았다.

뭐 이런 식이었습니다 -_-;
그리고 말미에는 '위의 사항들을 수정해서 다시 보내주었으면 한다. 그럴 경우 우리는 연봉 $xxx 정도를 제시하겠다. 우리는 작은 회사라 현재 니가 있는 회사만큼 좋은 대우는 해 주기는 힘들다' 뭐 이런 말들이 있더군요. 조건은 나쁘지 않았습니다, 어쨌든...
근데 사실 쇼킹했습니다. 저렇게까지 답변이 올 줄은 몰랐거든요 ㅡㅡ; 물론 의욕 상실해서 건성건성 코딩을 했다는 핑계는 있었지만 솔직히 아직 제가 한참 멀었다는 얘기죠.
메일에도 '이번 퀴즈는 단순히 요구사항을 만족하도록 기능을 구현했는가를 보려던게 아니다'라는 말이 있긴 합니다. 재사용성과 디자인 및 사용 편의성에 중점을 둔 것이었다더군요.

초보 개발자일 때는 사실 되냐 안되냐, 아냐 모르냐에만 치중합니다. 그럴 수 밖에 없기도 하구요 -_-;
중간단계에 접어들면서 아는 것을 활용해 '어떻게' 만드느냐에 눈을 뜨기 시작합니다. 그리고 시간이 지나면 자신이 만든 것에 대해 '보증'할 수 있는 능력을 키워나가는데 여기에는 버그라든가 메모리 릭을 최대한 적게 유지하는 방어적인 프로그래밍의 틀을 잡아나갑니다.
문제는 저 '방어적 프로그래밍'의 틀이 초보일 때부터 잡혀 가야 하는데 그게 안된다는 거죠. 저의 사례만 봐도 그렇지 않나요? -_-;;
방어적인 프로그래밍이란 것도 그 범위가 참 넓죠. 습관이 되어 늘 신경쓰면서 프로그래밍할 수 있을 정도로 훈련을 하는 것이 중요하지 않나 싶습니다. 특히 자신의 코드를 다양하게, 최대한 넓은 커버리지를 테스트할 수 있는 테스트 케이스가 일단은 중요한 듯 합니다. 그런 말도 있죠? 개발자가 자기 프로그램을 테스트하면 잘 돌아가는 방향으로만 테스트한다는...-_-

그 외에도 자료구조나 로직, 알고리즘, 아키텍처, API 디자인이나 UI 디자인도 고민해야 하고, 위에서처럼 thread-safe라든가 국제화에 대한(utf-8지원이라든가) 고려도 필요할 수 있고... 뭐 이리 많아 ㅡㅡ;
결국 따지고 보면 개발이 쉬운게 아니에요...;; 어떤 프레임워크나 툴이나 특이한 언어를 다룰 줄 안다거나 하는 걸로 뻐기기에는 프로그래밍의 세계는 너무나 깊은 거죠.

결론은... 프로그래밍은 대충 하면 안된다는 겁니다 -_-
그리고 덧붙여... 우리 나라에서 저렇게 사람을 뽑는 회사를 저는 아직 보지를 못했는데 우리 나라 회사들도 사람 좀 제대로 뽑았으면 하네요. 우리나라 대부분의 회사들은(제가 접해 본 많은 회사들은) 개발자를 뽑는 건지 필요한 장비를 구하는건지 헷갈릴 때가 많습니다. 실력 테스트는 거의 없고 스펙에 맞으면 대충 몇 가지 물어보고 뽑죠 -_-;
회사들이 좋은 개발자를 신경 써서 잘 뽑는 문화가 퍼진다면 개발자들도 자신을 갈고 닦는 것에 좀 더 신경을 쓰게 되지 않을까 하는 생각이 드네요.

저작자 표시 비영리 동일 조건 변경 허락
Posted by morgana
크리에이티브 커먼즈 라이선스
Creative Commons License

1. GetMessage()는 프로그램 종료 메시지(WM_QUIT)가 발생하면 0를 반환 한다.

2. DispatchMessage()함수는 내부적으로 메시지 프로시저 함수를 호출한다.

3. 핸들이란  단순하게 윈도우를 구별하는 식별 번호 일뿐이다.

4. hAccelTable은 액셀러레이터 키 테이블의 핸들이다.(전역 단축키 테이블)

저작자 표시 비영리 동일 조건 변경 허락
Posted by morgana

Qt Window CE(wince)

Study/QT 2009/02/13 01:00
크리에이티브 커먼즈 라이선스
Creative Commons License

Qt WinCE 설치하기(VS2005)

1. VS2005 + Service Pack 1 설치
(.Net Compact Framework 2.0도 있어야 한다는데 전 없이도 잘 설치 되더라고요.)

2. Windows Mobile 6 Standard SDK 또는 Windows Mobile 6 Professional SDK 설치
(
다운로드)
자신이 원하는 플랫폼에 알맞는걸 설치 하시기 바랍니다.
저는 SPH-4655이므로 Windows Mobile 6 Professional SDK를 설치 하였습니다.

3. Qt다운로드(링크)
저는 Qt for Open Source C++ development on Windows CE 버전을 설치 하였습니다.

4. 원하는 디렉토리에 압축 풀기
(공백이 들어가면 컴파일시 오류가 발생한다고 하니 주의 하시기 바랍니다.)

5. PATH에 압축을 푼 디렉토리의 bin 디렉토리를 추가합니다.
(저의 경우 E:\Qt\wince_4.4.3에 압축을 풀어서, E:\Qt\wince_4.4.3\bin를 PATH에 추가하였습니다.)
(PATH 설정: 내컴퓨터 - 마우스 오른쪽 클릭 - 속성 - 고급 - 환경변수 - 시스템변수 - Path 항목 - 편집 - 추가)

지금부터의 커맨드 작업은 모두 Visual Studio 2005 Command Prompt 상에서 이루어 지는 명령입니다.
시작메뉴 - 프로그램 - Microsoft Visual Studio 2005 - Visual Stodio Tools - Visual Studio 2005 Command Prompt

6. vcvars32.bat 를 실행
Setting environment for using Microsoft Visual Studio 2005 x86 tools.라는 메시지를 보실 수 있습니다.

7. Qt configure
4번에서 압축을 푼 디렉토리에서 configure를 수행해줘야 합니다.(궁금하신분은 --help)

저의 경우
configure -platform wincewm60professional-msvc2005 -platform win32-msvc2005
로 하였습니다.

8. INCLUDE, PATH, LIB 설정
  set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\ce\include;C:\Program Files\Windows Mobile 6 SDK\PocketPC\Include\Armv4i

    set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\ce\lib\armv4i;C:\Program Files\Windows Mobile 6 SDK\PocketPC\Lib\Armv4i  

    set PATH=C:\Program Files\Microsoft Visual Studio 8\VC\ce\bin\x86_arm;%PATH%

  setcepaths wincewm60professional-msvc2005

위 명령어들은 자신이 설치한 VC2005, SDK종류 및 설치 디렉토리에 따라서 맞춰 주셔야 하는 부분입니다.

9. nmake
nmake를 수행
(시간이 상당히 걸립니다.  노트북으로 했더니 1시간 이상 걸리더군요;;)


10. nmake 문제 발생시 대처법.

10-1. INCLUDE, PATH, LIB 디렉토리가 올바른지 확인해 보시기 바랍니다.
10-2. configure시에 bin 디렉토리에 실행파일들이 정상적으로 생성 되는지 확인해 보시기 바랍니다.
(저의 경우 10-2번이 발생하는 경우가 있어서 SDK를 다시 설치해보고, 새로운 Qt파일을 받아서 다시 configure 해보니 정상적으로 생성이 되더라구요.)


출처: http://punbear.tistory.com/8#comment1527443



저작자 표시 비영리 동일 조건 변경 허락
Posted by morgana

Qt goes LGPL.

분류없음 2009/01/14 20:02
크리에이티브 커먼즈 라이선스
Creative Commons License
Qt 4.5부터 LGPL이 추가되고 나면 3가지 버전의 라이센스중에 택할 수 있다.

LGPL이란?

1. GPL(General Public License) 개요
- GNU의 두 가지 라이센스 중의 하나로 라이브러리, 프로그램에 모두 적용된다.
- GPL을 가진 프로그램(라이브러리 포함)을 포함해서 제작된 프로그램 역시 GPL을 준수해야 한다.
- GPL을 가진 원시 코드를 사용하는 것을 GPL에 동의한 것으로 간주한다.
- 프로그램(라이브러리 포함)의 원시 코드와 목적 코드가 같이 배포되어야 하며, 목적 코드만 배포될 경우, 원시 코드를 인터넷(FTP 포함)으로 다운로드 받을 수 있도록 조치해야 하며, 배포판에 원시 코드를 다운로드 받을 수 있는 주소를 명시해야 한다.
- GPL을 선언한 프로그램은 무료로 배포되어야 하며, 배포를 위한 비용(프로그램에 대한 비용이 아님)을 청구하는 것은 GPL에 위반되지 않는다.

2. LGPL(Lesser General Public License) 개요
- 라이브러리에만 적용되는 라이센스로 1992년 Library General Public License에서 Lesser General Public License로 명칭이 변경되었다.
- 라이브러리의 보다 범용적인 활용을 목적으로 만들어졌으며, GNU C 라이브러리도 LGPL을 따른다.
- 독점 프로그램에 사용할 수 있으며, 사용자는 라이브러리에 대한 의무만 준수하면 된다. 준수 항목은 GPL과 동일.
- 라이브러리를 개작한 저작물은 반드시 소프트웨어 라이브러리여야 하며, 저작물 역시 LGPL을 가지게 된다.
- 어떤 프로그램이 라이브러리와 함께 링크된다면, 라이브러리가 정적으로 링크되든지 공유 라이브러리로 사용되든지 간에 이 두 개의 조합은 법적으로 말할 때 결합 저작물, 즉 최초의 라이브러리로부터 파생된 2차적 저작물로 간주됩니다. GPL은 이러한 형태의 링크가 일어날 경우에 결합된 전체 저작물이 GPL을 만족할 때에 한해서만 링크를 허용합니다. 그러나 LGPL은 보다 유연한 링크 조건을 허용하고 있습니다. – ‘GNU LGPL’ 발췌 –

3. 공통 사항
- GNU 라이센스로 원시 코드 공개 및 무료 배포(인터넷을 통한 배포가 아닌 경우, 피양도자가 배포 비용 부담)를 목적으로 하고 있다.
- 배포 시 피양도자에 코드에 대한 모든 권한이 양도된다.
- 배포판에 라이센스에 대한 명시를 해야 하며, 라이센스 허가서(영문판)를 포함해야 한다.
- 라이센스를 가지고 있는 원시 코드를 사용하는 것만으로도 라이센스에 동의한 것으로 간주한다.
- 원시 코드를 개작할 때도 라이센스는 유효하며, 개작된 저작물도 동일한 라이센스를 가진다.

4. 다른점
- GPL이 모든 프로그램(라이브러리 포함)에 적용되는 데 반해, LGPL은 라이브러리에 국한된다.
- LGPL은 GPL로 변경될 수 있지만, 한번 GPL로 선언된 원시 코드는 LGPL로 변경할 수 없다.
- LGPL을 가진 라이브러리는 독점 프로그램에 사용할 수 있으며, 라이브러리를 사용했다하더라도 프로그램에는 LGPL이 적용되지 않는다. 즉, 프로그램 자체의 코드를 공개할 의무는 없음.

출처: http://kkjiny12.tistory.com/26


참고:
http://aseigo.blogspot.com/2009/01/qt-goes-lgpl.html

http://kldp.org/node/101905

http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt
저작자 표시 비영리 동일 조건 변경 허락
Posted by morgana
크리에이티브 커먼즈 라이선스
Creative Commons License
파일의 정보중에는 파일의 생성시간, 수정시간, 엑세스 시간이 있는데

struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};



utime 함수: st_mtime과 st_atime을 수정 가능
touch 명령: 파일의 timestamp를 갱신
-t 옵션을 사용하여 원하는 시간으로 수정할 수도 있으나,
st_ctime은 불가능 하며, st_ctime은 파일의 퍼미션, 소유자, 그룹 등의 inode값이 바뀔때만 갱신된다.

FAT에서는 Local Time을 Timestamp로 찍으며,
NTFS나 기타 파일 시스템들은 UTC를 사용한다.

mount 옵션중에 tz=UTC를 사용할 경우 FAT에서도 UTC를 타임스탬프로 사용 할 수 있다고 한다.
(2008년 10월 18일경 패치 되었다고 함.)


저작자 표시 비영리 동일 조건 변경 허락
Posted by morgana

ctags 사용법

분류없음 2008/11/25 15:00
크리에이티브 커먼즈 라이선스
Creative Commons License

ctags

출처: joinc

http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/ctags


ctags를 이용하면, 사용자 정의 함수가 나왔을때, 함수가 정의되어 있는 쏘스파일로 바로 점프할수 있으며, 또한 바로 원래의 쏘스파일로 되돌아올수 있다. 이렇게 함으로써 쏘스분석에 드는 시간을 상당히 줄일수 있다.

이번 문서에는 사용자가 vi 를 사용하고 있다는 가정하에 ctags 의 사용법을 설명하도록 하겠다.

ctags는 공개 소프트웨어로 쉽게 얻을수 있을것이다. 리눅스의 경우 웬만한 배포판은 기본으로 포함되어 있으니, 바로 사용하면 된다. 만약 설치되어 있지 않다면 http://ctags.sourceforge.net 를 방문해보도록 한다.

사용방법은 간단하다. 분석하고자 하는 소스가 있는 디렉토리에서 ctags 명령을 실행시켜주면 된다.
# ctags * 
위에서 ctags 는 현재 디렉토리에 있는 모든 파일에 대해서 tags 정보를 작성하도록 했는데, 현재 디렉토리 뿐만 아니라 모든 하위디렉토리에 대해서 tags 정보를 작성하고자 한다면 "-R" 옵션을 사용하면 된다.
# ctags -R 
ctags 명령을 실행시키고 나면, ctags를 실행한 디렉토리에 tags 란 파일이 생길것이다. 여기에 각 함수가 어느파일에 설치되어 있는지에 대한 정보가 들어 있고, vi를 실행 시키면 tags 파일을 참조하여 해당 함수가 정의되어 있는 파일로 자동으로 이동하게 된다.

tags 파일은 아래와 같이 구성되어 있다.
hello  hello.c   /^void hello(void)$/;"    f 
각필드는 "tab" 으로 구분된다.
  1. 첫번째 필드는 함수이름
  2. 두번째 필드는 함수가 정의된 파일의 이름
  3. 세번째 필드는 해당 파일에서 vi가 함수명을 찾아가도록 하기위한 정규표현식 이다.
  4. 네번째 필드는 해당 함수의 타입이다. "f" 라면 일반 C 함수라는 뜻이며, "c" 는 클래스에 선언된 멤버함수, "d" 는 define 된 값이란 뜻이다.

이제 vi 로 분석하고자 하는 쏘스파일을 열어보자. 분석하는 중에 hello() 라는 알수없는 함수가 나와서 이 함수의 원형이 있는곳으로 이동하고 싶을 때는 hello() 함수에 커서를 위치시키고 Ctrl + ] 를 누르면 된다. 그러면 곧바로 hello() 함수의 원형으로 이동하게 된다. hello() 함수에 대한 분석이 끝나서, 원래 분석하던 쏘스 파일로 돌아오고 싶다면 Ctrl + t키를 누르면 된다.

vi에서 사용되는 ctags 관련 커맨드를 정리해 보았다.
Tag Command 설명
Ctrl+] 함수가 정의된 파일로 이동
Ctrl+t 이동하기 전 단계의 위치로 이동
:tselect <function-name> 같은 이름의 function-name이 여러개 일때, 목록을 보여준다. 번호를 이용해서 선택할 수 있다
:tnext 여러개의 함수이름이 존재할 때, 다음 함수를 선택한다.
:tprevious 이전 함수를 선택한다.
:tfirst 가장 처음에 찾았던 함수를 선택한다.
:tlast 가장 마지막 함수를 선택한다.
저작자 표시 비영리 동일 조건 변경 허락
Posted by morgana
크리에이티브 커먼즈 라이선스
Creative Commons License
1. set fencs=ucs-bom,utf-8,cp949

2. e ++enc=euc-kr 또는 w ++enc=utf-8



출처: http://kldp.org/node/32987
Posted by morgana

SVN 정리.

Study/Linux 2008/11/21 14:58
크리에이티브 커먼즈 라이선스
Creative Commons License

[ Subversion 정리 ]

 

1. Subversion 을 사용하는 3가지 방식

   1) 탐색기 방식
      Subversion을 윈도우즈 탐색기처럼 사용하도록 해주는 TortoiseSVN이 있다. 아래 링크를 통해 TortoiseSVN을 설치하여 사용한다.
      http://tortoisesvn.tigris.org
 
   2) 웹 방식
      Apache 서버를 구축하고 Subversion과 ViewVC를 설치하면 익스플로러를 통해 웹처럼 접근할수 있다.
      http://httpd.apache.org : Apache (apache_2.0.59-win32-x86.msi)
      http://subversion.tigris.org : Subversion (svn-1.4.3-setup.exe)
      http://www.viewvc.org : ViewVC (viewvc-1.0.3.zip)
      ViewVC를 사용하지 않을 경우에는 "지정 도메인"/"해당 저장소" 로 접근
    예) sample.com/repository
     

      ViewVC를 사용할 경우에는 "지정 도메인"/viewvc 로 접근
    예) sample.com/viewvc
   
   3) svn+ssh 방식
       ssh클라이언트 툴인 putty를 이용하여 ssh로 암호화 된 상태로 Subversion을 사용한다.

       개인마다 키를 생성하여 이용하는데........


 


2. Subversion 주요 명령어
  
   1) svnadmin create : 지정한 위치에 새로운 저장소(repository)를 생성한다.
       형식 - svnadmin create "dest"
       # svnadmin create /home/heyduk/repos
  
   2) svn import : 생성된 저장소에 프로젝트 파일을 넣는다.
       형식 - svn import "option" "source" "dest"

       # svn import -m "import first project" . file:///home/heyduk/repos/project1/trunk
         -m 옵션을 통해 import 할때의 메세지를 남기고 현재 디렉토리의 내용을 project1라는 별도의 디렉토리에 넣는다.
  
   3) svn checkout(co) : 저장소에 보관된 프로젝트 소스를 로컬 시스템의 작업 디렉토리로 복사하여 가져온다.
       형식 - svn co "source" "dest"
       # svn co file:///home/heyduk/repos/project1/trunk my_work
  
   4) svn commit : 지역 작업본의 변경한 내용들을 저장소에 저장하며 프로젝트를 새로 리비젼시킨다.
       형식 - svn commit(ci) "option"
       # svn commit -m "main() modified"

  
   5) svn status : 작업 복사본에서 변경된 이후 아직 저장소로 commit 되지 않은 내용을 확인한다.
       형식 - svn st "path"

       # svn status(st) main.c
         출력 내용 중 첫번째 문자를 통해 상태를 확인할 수 있는데 그중 몇가지 주요 내용은 다음과 같다.
         A : 추가됨
         C : 충돌됨
         D : 삭제됨
         M : 수정됨
         G : 병합됨


   6) svn diff : 저장소의 내용과 현재 작업 내용을 비교하여 변경한 부분(차이점)을 자세히 확인한다.
                   저장소와의 네트워킹은 일어나지 않으므로 실시간 변경 내용은 반영되지 않는다.
      형식 - svn diff "path" , svn diff "option"

      # svn diff main.c
        저장소의 내용과 현재 작업내용 중 main.c 파일의 차이를 확인

      # svn diff -r 1:2
        리비전 1과 2의 차이를 확인

      # svn diff -r 1 main.c
        리비전 1과 현재 작업중인 main.c의 차이를 확인

      # svn diff -r 2
        리비전 2와 현재 작업중인 디렉토리의 파일내용 차이를 확인


   7) svn log : 특정 파일의 commit된 로그 메세지를 확인한다.
      형식 - svn log "path" , svn log "option"

      # svn log main.c
        main.c 파일이 commit 된 로그메세지를 출력

      # svn log -r 1:2
        리비젼1부터 2까지의 로그메세지를 출력
     
   8) svn update : 현재 작업디렉토리의 내용을 저장소의 최신 리비전으로, 또는 지정한 리비전으로 갱신한다.
      형식 - svn update(up) "option"

      # svn up
        현재 작업 내용을 최신내용으로 갱신

      # svn up -r 1
        현재 작업 내용을 리비전 1로 갱신(최신 리비전보다 이전으로 되돌리는 것도 가능하다.)

  
   9) svn add : 프로젝트에 파일이나 디렉토리를 추가한다.
      형식 - svn add "path"

      # svn add Makefile
        add로 추가한 경우 저장소에는 바로 반영되지 않기 때문에 commit 을 수행하여 새로운 리비전으로 갱신할 필요가 있다.
       
   10) svn revert : 지역 작업 복사본에서 수행한 변경들을 이전 상태로 복원(실행 취소)한다.
        형식 - svn revert "path"

        # svn revert main.c
           지역 복사본의 main.c 파일에 가했던 변경들을 모두 복원(취소)함

 
   11) svn merge : 저장소끼리, 또는 저장소와 지역 작업본간의 변경 내역을 작업본에 병합한다.
        형식 - svn merge "source1" "source2" "dest" : 다른 저장소끼리의 변경 사항을 지정한 작업 복사본으로 병합함
                  svn merge -r rev_num1:rev_num2 "dest" : 기본 저장소에 있는 두 리비전의 변경사항을 지정한 작업 복사본으로 병합함
 

       # svn merge file:///home/heyduk/repos/project1/trunk file:///home/heyduk/repos/project2/trunk my_work
           저장소의 project1과 project2간의 차이를 지역 작업본인 my_work에 병합함

        # svn merge -r 6:7 file;///home/heyduk/repos/trunk my_work
           저장소의 리비전 6~7의 변경내용을 지역 작업본인 my_work 에 병합함



출처 : http://blog.naver.com/heyduk?Redirect=Log&logNo=41990064

Posted by morgana

패딩.

Study/C 2008/10/30 14:07
크리에이티브 커먼즈 라이선스
Creative Commons License
#include <stdio.h>
#include <stdlib.h>
struct temp
{
    char a;
    int b;
    char c;
    double d;
    char e;
};
struct temp1
{
    char a;
    char c;
    char e;
    int b;
    double d;
};
struct temp2
{
    int b;
    double d;
    char a;
    char c;
    char e;
};
int main(void)
{
    struct temp str1;
    struct temp1 str2;
    struct temp2 str3;
    printf("%d\n", sizeof(str1));
    printf("%d\n", sizeof(str2));
    printf("%d\n", sizeof(str3));
    return 0;
}
결과:
32
16
24
환경 cygwin

alignment도 참조해볼것.

http://kldp.org/node/19

#ifdef  WIN32
#pragma pack(1)
#endif

typedef struct tRequest{
char req;
short sup;
char data[REQ_LEN-1];
#ifdef WIN32
} RequestStruct;
#else
} __attribute__((packed)) RequestStruct;
#endif


저작자 표시 비영리 변경 금지
Posted by morgana

Threads

Study 2008/10/18 17:37
크리에이티브 커먼즈 라이선스
Creative Commons License

스레드(Threads)

5.1 개요

5.2 장점

5.3 사용자 및 커널 스레드(User and Kernel Threads)

5.4 다중 스레드 모델(Multithreading Models)

5.5 솔라리스(Solaris)2 스레드(threads)

5.6 Java 스레드(threads)

5.7 요약


5.1 개요

- 스레드(threads) : LWP( Light Weight Process)

- 전통적인 프로세스 : heavy Weight Process

- CPU이용의 기본 단위이다.

- 스레드는 스레드ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성됨

- 같은 프로세스에 속한 다른 스레드와 코드, 데이터, 파일, 신호 등등의 운영체제 자원을 공유한다.

- 필요성 : 하나의 프로그램이 다양한 작업 실행을 요구 할때

       ex) word processor, web browser,      -> 다른 일

           web server,                      -> 같은 일

           RPC server, RMI server, kernel threads

           -> 해결책 : multiple process       -> 오버헤드가 크다

                       하나의 프로세스에 여러개 스레드 -> 효과적


5.2 장점(Benefits)

- 응답성(Responsiveness)

- 자원 공유(Resource Sharing)

- 경제성(Economy) - 스레드를 생성, Context Switching에서 Process복제보다 경제적

- 다중 처리기 구조의 활용(Utilization of multiprocessor architecture)

       # 다중 처리기 구조에서는 각각의 스레드가 병렬로 처리될수 있다.

       # 단일 처리기 구조에서는 병렬인것 같지만 실제로 한번에 하나의 스레드만 수행됨


5.3 사용자 및 커널 스레드(User and Kernel Thread)

- 스레드를 위한 지원은 사용자 스레드(user threads)를 위해서는 사용자 수준에서,

                   커널 스레드(kernel threads)를 위해서는 커널 수준에서 제공된다.


5.3.1 사용자 스레드(User Threads)

- 스레드 라이브러리에 의해 구현된다.

- 라이브러리는 커널의 지원 없이 유저 공간에서 스레드의 생성과, 스케줄링, 관리를 지원한다.

- 장점 : 생성과 관리가 빠르다.

- 단점 : 커널이 단일 스레드형 이라면 blocking system call을 수행하는 사용자 수준의 스레드는 다른 스레드가 있어도 프로세스 전체가 block된다.

- POSIX Pthreads, Java threads, Win32 threads


5.3.2 커널 스레드(Kernel Threads)

- 운영체제에 의해 직접 지원된다. (kernel이 지원해준다)

- 커널이 커널공간에서 스레드의 생성과, 스케줄링, 관리를 한다.

- 단점 : 생성과 관리가 느리다.

- 장점 : 스레드가 blocking system call을 수행하면 커널은 다른 스레드의 수행을 스케줄링 한다.

        다중처리기환경에서는 스레드를 서로 다른 처리기에서 스케줄 할 수 있다.

- Windows XP/2000, Solaris, Linux, Tru64 UNIX(formerly digital UNIX), Mac OS X


5.4 다중 스레드 모델(Multithreading Models)

- 많은 시스템은 사용자스레드(User Threads)와 커널스레드(Kernel Threads)를 모두 지원한다.

- 다중 스레드 모델의 종료 -> (user threads)-to-(kernel threads)

       # Many-to-One
     
# One-to-One

       
# Many-to-Many


5.4.1 Many-to-One 모델

- 많은 사용자 수준의 스레드를 하나의 커널 스레드로 맵한다.

- 장점 : 스레드관리는 사용자공간에서 행해진다. -> 효율적

- 단점 : 스레드가 blocking system call을 할 경우 전체가 block됨.

한번에 하나의 스레드만이 커널에 접근 -> 다중 스레드가 다중 처리기에서 작동 안됨.

- 커널스레드를 지원하지 않는 운영체제에서 사용된다.

- 커널은 스레드가 한 개인것 처럼 보임

- Solaris Green Threads, GNU Portable Thread


5.4.2 One-to-One 모델

- 사용자스레드를 각각 하나의 커널스레드에 맵한다.

- 장점 : 하나의 스레드가 blocking system call을 하더라도 다른 스레드가 작업 할 수 있다.

        다중 처리기에서 다중 스레드가 병렬로 수행되는 것을 허용함.

- 단점 : 사용자스레드를 생성할 때 마다 커널스레드를 생성해야한다. ->성능저하 => 스레드 수 제한시킴

- Windows NT/XP/2000, Linux, Solaris 9 and later



5.4.3 Many-to-Many 모델

- 여러 개의 사용자 수준 스레드를 그보다 작거나 같은 수의 커널 스레드로 다중화(multiplex)한다.

- 개발자는 플요한 만큼 많은 사용자스레드를 생성하면 상응하는 커널스레드가 다중 처리기에서 병렬로 수행.

- 스레드가 blocking system call을 해도 다른 스레드로 스케줄 함.

- Window NT/2000, Solaris, IRIX, Digital UNIX


5.4.4. Two-Level 모델

- Many-to-Many의 변형이다.

- 사용자스레드가 커널스레드에 바인드 되는 것을 허용한다.

- 바인드된 스레드 : 사용자수준 스레드와 커널 스레드가 붙어서 스케줄링 되지 않고 계속 연결되어 있는 것


5.4.5 Threading Issues

- multithreaded 프로그램에서 fork()와 exec()시스템콜의 의미?

- fork()2가지 버전

       # 모든 스레드 복제            -> fork - no exec

       # 호출한 스레드만 복제 -> fork - exec

- exec()

       단일 스레드 프로그램처럼 동작. -> 모든 스레드를 포함하는 프로세스로 대체 됨


5.4.6 Thread cancellation (스레드 해제(취소))

- 해제의 일반적인 목적 2가지

       # 비동기 해제 : 타겟 스레드를 즉시 종료시킴

       # 연기된 해제 : 타겟 스레드가 취소 되었는지 주기적으로 체크함

               -> cancellation point는 안전한 해제를 위함이다.


5.4.7 Thread Pools -> 버퍼와 비슷??

- Muntithreaded server의 잠재적인 문제점

       # 완료되면 버려질지도 모른다.

       # 제한이 없는 스레드는 시스템자원을 다 써버릴 수도 있다.

- Thread Pool

       # 프로세스가 시작하면 몇 개의 스레드를 pool에 만들어 놓는다.

       # 서버가 요청을 받으면 스레드를 풀에서 깨운다

- 이점

       # 요청을 받으면 새로 스레드를 만들 때 보다 약간 빠른 서비스를 해준다.

       # 프로그램에서 허락한 스레드의 개수로 pool의 크기가 정해진다.


5.4.8 Thread Specific Data (??)

- 몇몇 상화에, 각 스레드가 자신의 많은 데이터의 복제를 할 지도 모를때-> thread specific data

- 프로세스에 스레드가 너무 많이 생기는 것을 조절하는 것이 없을 때 유용함.(thread pool사용시)


5.4.9 Scheduler Activations (스케줄러 활동시작)

- Many-to-Many모델에서 사용자스레드와 커널스레드 사이의 중간에 위치한다.

- user thread ---- LWP ---- kernel thread

      M      :      1    :      1

- CPU bound 프로그램은 1개의 LWP로도 충분함

- I/O bound 프로그램은 여러개의 LWP가 필요

- 커널이 스레드가 블록되는 등의 이벤트가 있을때 프로그램에게 알려준다. ->upcall

- upcall은 스레드 라이브러리가 처리함



- LWP는 정확히 하나의 커널 스레드와 연결되어 있다.

- 커널 스레드는 LWP를 가지지 않고 동작하는 커널 스레드도 있다.(디스크요구서비스를 위한 스레드)



5.4 Pthreads

- POSIX의 스레드를 생성하고 동기화 하는 표준 API이다.

- Pthread library functions

       # pthread_create()

       # pthread_join() //스레드의 wait()같은것

       # pthread_exit()

       # pthread_attr_init()


5.5 Java Threads

- 언어 레벨에서 지원한다.

- 적어도 하나의 단일제어 스레드를 포함함

- 스레드생성

       1. Thread class 상속

       2. Runnable Interface 구현

- Java Thread States



Posted by morgana