<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>aaa</title>
	<link>http://ods81.egloos.com</link>
	<description>aaa</description>
	<language>ko</language>
	<pubDate>Sat, 24 Nov 2007 08:54:29 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>aaa</title>
		<url>http://pds11.egloos.com/logo/200904/08/59/e0072859.gif</url>
		<link>http://ods81.egloos.com</link>
		<width>80</width>
		<height>30</height>
		<description>aaa</description>
	</image>
  	<item>
		<title><![CDATA[ 포털블로그 '지고' 전문블로그 '뜬다' ]]> </title>
		<link>http://ods81.egloos.com/1039651</link>
		<guid>http://ods81.egloos.com/1039651</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-FAMILY: Verdana">출처<span style="FONT-FAMILY: 굴림">: </span><a href="http://www.moneytoday.co.kr/view/mtview.php?type=1&amp;no=2007112216483986361"><span style="FONT-FAMILY: 굴림">http://www.moneytoday.co.kr/view/mtview.php?type=1&amp;no=2007112216483986361</span></a><br><br>티스토리닷컴, 이글루스 등 가입형 전문 블로그가 네이버 블로그, 다음 블로그 등 전통 포털 블로그에 이어 블로그 서비스의 핵심축으로 급부상하고 있다. <br><br>전통 포털 블로그의 경우, 성장성이 정체된 반면, 전문 블로그의 경우 폭발적인 성장세를 보이고 있는 것. <br><br>22일 웹사이트 분석평가업체인 랭키닷컴이 지난해 10월부터 1년간 주요 포털블로그와 전문 블로그 사이트의 월간 방문자수 및 페이지뷰를 분석해 발표한 보고서에 따르면, 티스토리닷컴과 이글루스로 대표되는 전문 블로그가 10월 월간 방문자수 860만명으로, 전년 동월 대비 400%나 증가한 것으로 나타났다. <br></span><table class="article-photo center"><tbody><tr><td><a href="javascript:image_open('http://image.moneytoday.co.kr/image_realdisp.php?ImageID=2007112216483986361_2.jpg&amp;Imf=1', 'IMAGE_VIEW', 300, 300, 'yes')" alt="원본 이미지 보기"><span style="FONT-FAMILY: Verdana"><img class="center" alt="image" src="http://image.moneytoday.co.kr/indexlink_image.php?no=2007112216483986361_2.jpg&amp;index=6"></span></a></td></tr><tr><td><p><span style="FONT-FAMILY: Verdana"></span></p></td></tr></tbody></table><br><span style="FONT-FAMILY: Verdana">이에 반해 작년 10월 2570만명의 방문자수를 보였던 포털 전통 블로그와 미니홈피그룹(네이버,다음 블로그와 싸이월드 등 16개 서비스)는 지난달 2670만명으로 약 4% 증가하는데 그쳤다. <br><br>전문 블로그 중 가장 큰 성장율을 보인 곳은 다음에서 운영하는 티스토리닷컴이다. <br><br>올해 2월 이후 388%의 월간 방문자수 증가를 보이며 10월 월간 방문자수 630만 명을 기록했다. 그동안 베타 형태로 운영돼왔던 티스토리닷컴은 다음커뮤니케이션이 인수한 뒤 이달부터 정식 오픈됐다. <br><br>이글루스의 경우에는 지난해 10월 122만 명에서 191% 증가한 355만명으로 조사됐다. <br><br>반면 대표적인 포털 전통 블로그인 네이버 블로그와 다음 블로그는 각각 14%, 80%의 방문자수 증가세를 보였다. 포털의 경우, 자체 방문자 수가 월등히 많아 절대값의 비교는 큰 의미가 없지만, 그 성장율에 있어서는 전문 블로그가 압도적으로 높게 나타났다. <br><br>랭키닷컴 김정미 웹애널리스트는 “전문 블로그의 눈부신 성장은 블로그가 처음 등장한 이후 시간이 흘러 이제는 어느 정도 블로깅에 익숙해진 네티즌들이 제공되는 템플릿을 이용할 수 밖에 없는 포털 블로그에 비해 약간의 웹에 대한 지식만 있다면 자신의 개성을 살려 블로그를 꾸밀 수 있어 각자의 개성을 표출하기 쉬운 전문 블로그를 많이 이용하고 있다"며 "또 단순한 개인의 취미 생활에서 더욱 영역을 확장해 생계수단으로 블로그를 운영하는, 일종의 기업형 파워블로거들도 생겨나는 등 다양한 사용자들의 요구가 대두되었기 때문이라고 볼 수 있다"고 분석했다. <br></span><table class="article-photo center"><tbody><tr><td><a href="javascript:image_open('http://image.moneytoday.co.kr/image_realdisp.php?ImageID=2007112216483986361_1.jpg&amp;Imf=1', 'IMAGE_VIEW', 300, 300, 'yes')" alt="원본 이미지 보기"><span style="FONT-FAMILY: Verdana"><img class="center" alt="image" src="http://image.moneytoday.co.kr/indexlink_image.php?no=2007112216483986361_1.jpg&amp;index=6"></span></a></td></tr><tr><td><p><span style="FONT-FAMILY: Verdana"></span></p></td></tr></tbody></table><br><span style="FONT-FAMILY: Verdana">한편, 전문 블로그 대표 사이트인 티스토리닷컴과 이글루스의 월간 방문자수 변화를 비교해 본 결과, 최근 다음에 완전 인수된 티스토리닷컴이 6월 이후 월간 방문자수에서 SK커뮤니케이션즈의 이글루스를 넘어선 것으로 조사됐다. <br><br></span><br/><br/>tag : <a href="/tag/블로그" rel="tag">블로그</a>			 ]]> 
		</description>
		<category>블로그</category>

		<comments>http://ods81.egloos.com/1039651#comments</comments>
		<pubDate>Sat, 24 Nov 2007 08:54:29 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 공유메모리 ]]> </title>
		<link>http://ods81.egloos.com/975933</link>
		<guid>http://ods81.egloos.com/975933</guid>
		<description>
			<![CDATA[ 
  <p><strong><span style="FONT-SIZE: 100%; COLOR: #d41a01; FONT-FAMILY: Verdana">공유 메모리(shared memory) 란?</span></strong></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">공유메모리(shared memory) 보통 프로세스에서 사용되는 메모리영역은 해당 프로세스만이 사용할수 있다. 하지만 때때로 여러개의 프로세스가 특정 메모리영역을 사용했으면 하는때가 있을것이다. System V IPC 설비중의 하나인 "공유메모리"를 통해서 이러한일을 할수있다. </span></p><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">개 요</span></h4><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">모든 프로세스는 자신의 업무를 수행하기 위해서 필요한 자료를 저장하기 위한 메모리 공간을 가지게 된다. 이러한 메모리공간에는 CPU에 의해 수행되는 명령어들, 프로그램 시작시 정의되고 초기화된 데이타, 프로그램 시작시 정의되었지만 초기화 되지 않은 데이타, 함수호출에 필요한 정보, 동적할당이 이루어지는 데이타등 이 들어가게 된다.</span></p><p><br><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">프로세스는 시작시 혹은 실행중에 이러한 데이타를 저장하고 사용하기 위한 메모리 공간을 커널에 요구하여서 할당받아 사용하게 되는데, 이러한 메모리공간은 기본적으로 메모리를 요청한 프로세스만이 접근가능하도록 되어있다. 하지만 가끔은 여러개의 프로세스가 특정 메모리 공간을 동시에 접근해야할 필요성을 가질때가 있을것이다. 공유메모리는 이러한 작업을 위한 효율적인 방법을 제공한다. <br><br>공유메모리는 여러 IPC 중에서 가장 빠른 수행속도를 보여준다. 그이유는 하나의 메모리를 공유해서 접근하게 되므로, 데이타 복사와 같은 불필요한 오버헤드가 발생하지 않기 때문으로, 빠른 데이타의 이용이 가능하다.<br>&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">그러나 하나의 프로세스가 메모리에 접근중에 있을때, 또다른 프로세스가 메모리에 접근하는 일이 발생하면 자칫 데이타가 홰손될수 있을것이므로, 한번에 하나의 프로세스가 메모리에 접근하고 있다는걸 보증해줄수 있어야 할것이다. <br><br>다음은 공유메모리에 관련된 함수들의 모음이다. </span></p><table width="100%"><tbody><tr><td bgcolor="#e0e0e0"><p><!-- % wrong tag % --><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">#include &lt;sys/types.h&gt; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">#include &lt;sys/shm.h&gt; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">int </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_shmget(key_t%20key,%20int%20size,%20int%20shmflg)" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">shmget</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">(key_t key, int size, int shmflg) </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">void *</span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_shmat(%20int%20shmid,%20const%20void%20*shmaddr,%20int%20shmflg%20)" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">shmat</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">( int shmid, const void *shmaddr, int shmflg ) </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">int </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_shmdt(%20const%20void%20*shmaddr)" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">shmdt</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">( const void *shmaddr) </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">int </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_shmctl(int%20shmid,%20int%20cmd,%20struct%20shmid_ds%20*buf)" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">shmctl</span></a><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana">(int shmid, int cmd, struct shmid_ds *buf) <!-- % wrong tag % --></span></span></p></td></tr></tbody></table><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">공유메모리는 어떻게 할당되는가</span></h4><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">위의 함수들을 설명하기 전에 우선 공유메모리가 어떻게 할당되고, 어떤 과정을 통해서 접근가능한지에 대해서 우선 알아보도록 하겠다.<br><br>공유메모리의 생성요청은 최초 공유메모리 영역을 만드는 프로세스가 커널에 공유메모리 공간의 할당을 요청함으로써 이루어지며, 만들어진 공유메모리는 커널에 의해서 관리 되게 된다. <br><br>이런 이유로 한번만들어진 공유메모리는 운영체제를 리부팅하거나, 직접 공유메모리 공간을 삭제시켜주지 않은한, 공유메모리를 사용하는 모든 프로세스가 없어졌다고 하더라도, 계속적으로 유지되게 된다. <br><br>프로세스가 커널에게 공유메모리 공간을 요청하게 되면, 커널은 공유메모리 공간을 할당시켜주고 이들 공유메모리공간을 관리하기 위한 내부자료구조를 통하여, 이들 공유메모리를 관리하게 된다. 이 자료는 shmid_ds 라는 구조체에 의해서 관리되며 &lt;shm.h&gt; 에 정의되어 있다.<br></span><table width="100%"><tbody><tr><td bgcolor="#e0e0e0"><p><!-- % wrong tag % --><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">struct shmid_ds { </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">struct ipc_perm shm_perm; // 퍼미션 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">int shm_segsz; // 메모리 공간의 크기 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">time_t shm_dtime; // 마지막 attach 시간 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">time_t shm_dtime; // 마지막 detach 시간 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">time_t shm_ctime; // 마지막 변경 시간 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">unsigned short shm_cpid; // 생성프로세스의 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">pid unsigned short shm_lpid; // 마지막으로 작동한 프로세스의 </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">pid short shm_nattch; // 현재 접근한 프로세스의 수 </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana">}; <!-- % wrong tag % --></span></span></p></td></tr></tbody></table><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">Unix 버젼에 따라서 멤버변수들이 약간씩 차이를 보일수 있다. </span></p><dl><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_perm</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">공유메모리는 여러개의 프로세스가 동시에 접근 가능하므로, 파일과 같이 그 접근권한을 분명히 명시해줘야 한다. </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_segsz</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">할당된 메모리의 byte 크기이다 </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_atime</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">가장최근의 프로세스가 세그먼트를 attach한 시간 </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_dtime</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">가장최근의 프로세스가 세그먼트를 detach한 시간 </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_ctime</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">마지막으로 이 구조체가 변경된 시간 </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_cpid</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">이 구조체를 생성한 프로세스의 pid </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_lpid</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">마지막으로 작동을 수행한 프로세스의 pid </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>shm_nattch</b> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">현재 접근중인 프로세스의 수 </span><p></p></dd></dl><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">이러한 공유메모리에 접근을 하기 위해서는 고유의 공유메모리 key 를 통해서 접근가능해지며, 이 key값을 통해서 다른 여러개의 공유메모리들과 구분되어 질수 있다. </span><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">shmget</span></h4><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">shmget 은 커널에 공유메모리 공간을 요청하기 위해 호출하는 시스템 호출 함수이다. key 는 바로 위에서 설명했듯이 고유의 공유메모리임을 알려주기 위해서 사용된다. shmget 을 이용해서 새로운 공유메모리 영역을 생성하거나 기존에 만들어져있던 공유메모리 영역을 참조할수 있다. <br><br>첫번째 아규먼트는 여러개의 공유메모리중 원하는 공유메모리에 접근하기 위한 Key 값이다. 이 Key 값은 커널에 의해서 관리되며, Key 값을 통해서 선택적인 공유메모리에의 접근이 가능하다. 두번째 아규먼트는 공유메모리 의 최소크기 이다. 새로운 공유메모리를 생성하고자 한다면 크기를 명시해주어야 한다. 존재하는 메모리를 참조한다면 크기는 0으로 명시한다.<br><br>3번째 아규먼트는 공유메모리의 접근권한과, 생성방식을 명시하기 위해서 사용한다. <br>아규먼트의 생성방식을 지정하기 위해서 IPC_CREAT 와 IPC_EXCL 을 사용할수 있다. </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">아래 이들에 대해서 설명을 해두었다. </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dl><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><strong>IPC_CREAT</strong> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">key 를 이용 새로운 공유메모리 공간을 만든다. </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><strong>IPC_CREAT</strong> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">IPC_CREAT와 같이 사용되며, 공유메모리 공간이 이미 존재할경우 error 를 되돌려준다. </span></dd></dl><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">만약 IPC_CREAT 만 사용된다면 </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_shmget()" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">shmget</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">()은 새로 생성되는 공유메모리공간을 지시하는 공유메모리공간 "식별자" 되돌려준다. 만약 입력된 key 값이 지시하는 공유메모리 공간이 이미 존재하고 있다면 존재하는 공유메모리 공간의 "식별자"를 되돌려준다. IPC_EXCL 과 IPC_CREAT 를 같이 사용할경우, 공유메모리 공간이 존재하지 않으면 새로 생성시켜주며, 존재할경우에 error 를 되돌려준다. <br><br>3번째 아규먼트는 이외에도 권한을 지정해줄수도 있다. 권한은 파일권한과 동일하게, 유저, 그룹, Other 에 대한 읽기/쓰기 권한을 지정할수 있다. 단 실행권한은 줄수 없도록 되어 있다.<br>아래와 같이 사용가능하다. </span><table width="100%"><tbody><tr><td bgcolor="#e0e0e0"><p><!-- % wrong tag % --><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">int shmid; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">key_t keyval; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">keyval = 1234; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">shmid = shmget(keyval, </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_sizeof(keyval)" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">sizeof</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">(keyval), IPC_CREAT | 0666)); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">if (shmid == -1) { </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp; return -1; </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana">} <!-- % wrong tag % --></span></span></p></td></tr></tbody></table><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">shmat</span></h4><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">일단 공유메모리 공간을 생성했으면, 우리는 공유메모리에 접근할수 있는 int 형의 "식별자" 를 얻게 된다. 우리는 이 식별자를 shmat 를 이용해서 지금의 프로세스가 공유메모리를 사용가능하도록 "덧붙임" 작업을 해주어야 한다.<br><br>첫번째 아규먼트는 shmget을 이용해서 얻어낸 식별자 번호이며, 2번째 아규먼트는 메모리가 붙을 주소를 명시하기 위해 사용하는데, 0을 사용할경우 커널이 메모리가 붙을 주소를 명시하게 된다. 특별한 사항이 없다면 0을 사용하도록 한다.</span></p><p><br><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">3번째 아규먼트를 이용해서, 우리는 해당 공유메모리에 대한 "읽기전용", "읽기/쓰기가능" 모드로 열수 있는데, SHM_RDONLY를 지정할경우 읽기 전용으로, 아무값도 지정하지 않을경우 "읽기/쓰기 가능" 모드로 열리게 된다. </span></p><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">shmdt</span></h4><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">프로세스가 더이상 공유메모리를 사용할필요가 없을경우 프로세스와 공유메모리를 분리 하기 위해서 사용한다. 이 함수를 호출할 경우 단지 현재 프로세스와 공유메모리를 분리시킬뿐이지, 공유메모리 내용을 삭제하지는 않는다는 점을 기억해야 한다. <br>공유메모리를 커널상에서 삭제 시키길 원한다면 shmctl 같은 함수를 이용해야 한다.<br><br>shmdt 가 성공적으로 수행되면 커널은 shmid_ds 의 내용을 갱신한다. 즉 shm_dtime, shm_lpid, shm_nattch 등의 내용을 갱신하는데, shm_dtime 는 가장 최근에 dettach (즉 shmdt 를 사용한)된 시간, shm_lpid 는 호출한 프로세세의 PID, shm_nattch 는 현재 공유메모리를 사용하는 (shmat 를 이용해서 공유메모리에 붙어있는) 프로세스의 수를 돌려준다. </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">shmdt 를 사용하게 되면 shm_nattch 는 1 감소하게 될것이며, shm_nattch 가 0 즉 더이상 붙어있는 프로세스가 없다라는 뜻이 될것이다. shm_nattch 가 0이 되어있을때 만약 이 공유메모리가 shm_ctl 등에 의해 삭제표시 가 되어 있다면, 이 공유메모리는 삭제되게 된다. </span></p><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">shmctl</span></h4><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">이것은 공유메모리를 제어하기 위해서 사용한다. 즉 shmid_ds 를 직접 제어함으로써, 해당 공유메모리에 대한 소유자, 그룹 등의 허가권을 변경하거나, 공유메모리를 삭제혹은, 공유메모리의 잠금을 설정하거나 해제하는 등의 작업을 한다. <br><br>2번째 아규먼트를 이용해서 shmid 가 가르키는 공유메모리를 제어하며, cmd 를 이용해서 원하는 제어를 할수 있다. cmd 를 이용해 내릴수 있는 명령에는 다음과 같은 것들이 있다. </span><p><dl><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><strong>IPC_STAT</strong> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">공유메모리 공간에 관한 정보를 가져오기 위해서 사용된다. 정보는 buf 에 저장된다. </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><strong>IPC_SET</strong> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">공유메모리 공간에 대한 사용자권한 변경을 위해서 사용된다. 사용자 권한 변경을 위해서는 슈퍼유저 혹은 사용자권한을 가지고 있어야 한다. </span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span><dt><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><strong>IPC_RMID</strong> </span></span><dd><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">공유메모리 공간을 삭제하기 위해서 사용된다. 이 명령을 사용한다고 해서 곧바로 사용되는건 아니며, 더이상 공유메모리 공간을 사용하는 프로세스가 없을때, 즉 shm_nattch 가 0일때 까지 기다렸다가 삭제된다. 즉 해당 공유메모리 공간에 대해서 삭제표시를 하는거라고 생각하면 된다. </span></dd></dl><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana"></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">다음은 실제로 공유메모리를 사용하는 방법에 대한 가장간단한 예제이다. 자식과 부모프로세스간에 어떻게 메모리가 공유되는지 보여준다.</span></p><p><br><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b>예제 : shm.c</b> </span></span></p><table width="100%"><tbody><tr><td bgcolor="#e0e0e0"><p><!-- % wrong tag % --><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><span style="COLOR: #00b800">#include</span> &lt;sys/ipc.h&gt; </span></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><span style="COLOR: #00b800">#include</span> &lt;sys/shm.h&gt; </span></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><span style="COLOR: #00b800">#include</span> &lt;string.h&gt; </span></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><span style="COLOR: #00b800">#include</span> &lt;unistd.h&gt; </span></span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">int</span></b> </span></span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_main()" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">main</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">() { </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">int</span></b> shmid; </span></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">int</span></b> pid; </span></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">int</span></b> *cal_num; </span></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">void</span></b> *shared_memory = (<b><span style="COLOR: #0000ff">void</span></b> *)<span style="COLOR: #a900a9">0</span>; // 공유메모리 공간을 만든다. </span></span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">shmid = shmget((key_t)<span style="COLOR: #a900a9">1234</span>, <b><span style="COLOR: #0000ff">sizeof</span></b>(<b><span style="COLOR: #0000ff">int</span></b>), <span style="COLOR: #a900a9">0666</span>|IPC_CREAT); </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">if</span></b> (shmid == -<span style="COLOR: #a900a9">1</span>) { </span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; perror(<span style="COLOR: #ff0000">"shmget failed : "</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; exit(<span style="COLOR: #a900a9">0</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">} </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">// 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">shared_memory = shmat(shmid, (<b><span style="COLOR: #0000ff">void</span></b> *)<span style="COLOR: #a900a9">0</span>, <span style="COLOR: #a900a9">0</span>); </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">if</span></b> (shared_memory == (<b><span style="COLOR: #0000ff">void</span></b> *)-<span style="COLOR: #a900a9">1</span>) { </span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; perror(<span style="COLOR: #ff0000">"shmat failed : "</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; exit(<span style="COLOR: #a900a9">0</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">} </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">cal_num = (<b><span style="COLOR: #0000ff">int</span></b> *)shared_memory; </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">pid = </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_fork()" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">fork</span></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">(); </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">if</span></b> (pid == <span style="COLOR: #a900a9">0</span>) { </span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; shmid = shmget((key_t)<span style="COLOR: #a900a9">1234</span>, <b><span style="COLOR: #0000ff">sizeof</span></b>(<b><span style="COLOR: #0000ff">int</span></b>), <span style="COLOR: #a900a9">0</span>); </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">&nbsp; if</span></b> (shmid == -<span style="COLOR: #a900a9">1</span>) { </span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; perror(<span style="COLOR: #ff0000">"shmget failed : "</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; exit(<span style="COLOR: #a900a9">0</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; } </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; shared_memory = shmat(shmid, (<b><span style="COLOR: #0000ff">void</span></b> *)<span style="COLOR: #a900a9">0</span>, <span style="COLOR: #a900a9">0666</span>|IPC_CREAT); </span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">&nbsp; if</span></b> (shared_memory == (<b><span style="COLOR: #0000ff">void</span></b> *)-<span style="COLOR: #a900a9">1</span>) { </span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; perror(<span style="COLOR: #ff0000">"shmat failed : "</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; exit(<span style="COLOR: #a900a9">0</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; } </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; cal_num = (<b><span style="COLOR: #0000ff">int</span></b> *)shared_memory; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; *cal_num = <span style="COLOR: #a900a9">1</span>;</span></p><p><b><span style="FONT-SIZE: 100%; COLOR: #0000ff"></span></b><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">&nbsp; while</span></b>(<span style="COLOR: #a900a9">1</span>) { </span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; *cal_num = *cal_num + <span style="COLOR: #a900a9">1</span>; </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; printf(<span style="COLOR: #ff0000">"child %d\n"</span>, *cal_num); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; sleep(<span style="COLOR: #a900a9">1</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; } </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">} // 부모 프로세스로 공유메모리의 내용을 보여준다. </span></p><p><b><span style="FONT-SIZE: 100%; COLOR: #0000ff"></span></b><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana"><b><span style="COLOR: #0000ff">else</span></b> <b><span style="COLOR: #0000ff">if</span></b>(pid &gt; <span style="COLOR: #a900a9">0</span>) {</span></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; <b><span style="COLOR: #0000ff">while</span></b>(<span style="COLOR: #a900a9">1</span>) { </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; sleep(<span style="COLOR: #a900a9">1</span>); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; printf(<span style="COLOR: #ff0000">"%d\n"</span>, *cal_num); </span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">&nbsp; } </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">} //end of <strong><span style="COLOR: #0000ff">if</span></strong> (pid == <span style="COLOR: #a900a9">0</span>) { </span></p><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">} //END of <strong><span style="COLOR: #0000ff">int</span></strong> </span><a class="con_link" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/function_main()" target="_blank"><span style="FONT-SIZE: 100%; COLOR: #0033cc; FONT-FAMILY: Verdana">main</span></a><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: Verdana">() <!-- % wrong tag % --></span></span></p></td></tr></tbody></table><p><span style="FONT-SIZE: 100%"></span><span style="FONT-FAMILY: Verdana">&nbsp;</span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">예제가 하는 일은 간단하다. int 형의 공유메모리 공간을 할당한 다음. 자식프로세스에서 여기에 1씩을 더하고 부모프로세스에서는 공유메모리 내용을 출력하는 일을 한다. </span></p><h4><span style="FONT-SIZE: 100%; COLOR: #9b18c1; FONT-FAMILY: Verdana">쉘 코멘드로 공유메모리 제어하기</span></h4><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">쉘에서 공유메모리의 상황을 보여주기 위해서"ipcs"란 도구를 제공한다. ipcs 를 사용하면 공유메모리 뿐만 아닌, Semaphore, Message Queue 등 소위 sytem V IPC 설비에 대한 내용을 보여준다.<br></span></p><p><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">그리고 ipcrm 도구를 이용해서 필요없는 공유메모리, Message Queue, Semaphore 등을 지워줄수 있다. 위의 예제코드를 컴파일 시켜서 실행시킨다음 ipcs 를 이용해서 확인을 해보면 공유메모리 자원이 어떤식으로 관리되는지 좀더 이해를 쉽게 할수 있을것이다. </span></p><br/><br/>tag : <a href="/tag/공유메모리" rel="tag">공유메모리</a>			 ]]> 
		</description>
		<category>Unix/Linux</category>
		<category>공유메모리</category>

		<comments>http://ods81.egloos.com/975933#comments</comments>
		<pubDate>Fri, 09 Nov 2007 08:17:56 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ which ]]> </title>
		<link>http://ods81.egloos.com/970214</link>
		<guid>http://ods81.egloos.com/970214</guid>
		<description>
			<![CDATA[ 
  <p><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which - locate a command</span></p><p><span style="FONT-FAMILY: Verdana">SYNOPSIS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which [-a] filename ...</span></p><p><span style="FONT-FAMILY: Verdana">DESCRIPTION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which returns the pathnames of the files which would be executed in the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current environment, had its arguments been&nbsp; given&nbsp; as&nbsp; commands&nbsp; in&nbsp; a<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strictly&nbsp; POSIX-conformant&nbsp; shell.&nbsp;&nbsp; It does this by searching the PATH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for executable files matching the names of the arguments.</span></p><p><span style="FONT-FAMILY: Verdana">OPTIONS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -a&nbsp;&nbsp;&nbsp;&nbsp; print all matching pathnames of each argument</span></p><p><span style="FONT-FAMILY: Verdana">EXIT STATUS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if all specified commands are found and executable</span></p><p><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if one or more specified commands is&nbsp; nonexistent&nbsp; or&nbsp; not&nbsp; exe-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cutable</span></p><p><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if an invalid option is specified<br></span></p>			 ]]> 
		</description>

		<comments>http://ods81.egloos.com/970214#comments</comments>
		<pubDate>Thu, 08 Nov 2007 00:46:47 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Jakarta-tomcat/conf 디렉토리의 server.xml 보기 ]]> </title>
		<link>http://ods81.egloos.com/967472</link>
		<guid>http://ods81.egloos.com/967472</guid>
		<description>
			<![CDATA[ 
  <p><span class="b m-tcol-c"><a href="http://cafe.naver.com/ArticleRead.nhn?clubid=11362411&amp;menuid=12&amp;articleid=34">http://cafe.naver.com/ArticleRead.nhn?clubid=11362411&amp;menuid=12&amp;articleid=34</a></span></p>			 ]]> 
		</description>
		<category>기타</category>

		<comments>http://ods81.egloos.com/967472#comments</comments>
		<pubDate>Wed, 07 Nov 2007 08:28:45 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 프로그래머 십계명  ]]> </title>
		<link>http://ods81.egloos.com/950323</link>
		<guid>http://ods81.egloos.com/950323</guid>
		<description>
			<![CDATA[ 
  <p><span style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: 굴림">&nbsp;</span><p></p><p align="'" ?center??><strong style="FONT-WEIGHT: 400">1. 정보모음에 소홀히 하지 말고 설명서를 읽음에 게을리 하지 말지어다. 오늘 필요 없는 정보는 내일 필요하리라. 가장 가치 있고도 저렴한 지식은 책 속에 있느니라. 서점과 동료의 책꽂이에 무엇이 꽂혀 있는지 때때로 살피어라. 무심코 흘렸던 종이 한 장이 너의 근심을 풀어 주었으리라. 설명서는 충분히, 꼼꼼히 읽을지어다. 모든 의문은 설명서를 안 보는데서 생기니라. 그렇더라도 모두 다 읽을 필요는 없느니라. 많은 정보가 능사는 아니니라. 정보의 가치를 찾는 법부터 배우라. 세상엔 너무나 많은 자료와 정보가 넘쳐난다. </strong><strong style="FONT-WEIGHT: 400">알알이 모두 끌어 모을 생각을 하기 보단 정보를 하나로 꿰는 법부터 먼저 배우는것이 너의 근심에서 쉽게 벋어나게 하는 방법이 되리라. 일을 시작하기전에 필요한 정보를 꼼꼼히 먼저 챙기는 법부터 배워라. 너희는 먼저 개발 의뢰서를 꼼꼼히 읽을지어다. 만약 개발 의뢰서가 없다면 발주자에게 요구할 지어다. 개발 의뢰서 없는 프로그램은 존재하지 않으니라. <br><br>2. 너의 PC가 안전하다고 믿지 말지어다. 5분 후에 정전이 되고 내일 너의 하드가 맛이 가리라. 그러니 너의 소중한 소스코드는 정기적으로 여러 군데에 단계별로 백업해 두어라. PC는 평상시엔 안전하다. 그런 실수를 저지르는것은 네자신이거나 아니면 외부적인 요인에 기인한다. 항상 백업을 철저히 해두며 백업에 백업까지도 챙겨두라. 그리고 백업을 했다면 리스트를 작성하라. 쓸데없는 백업은 백해 무익하나니 리스트를 항상 유지할 지어다. 너희는 노트를 옆에 끼고 살 지어다. 노트는 너의 생명이며, 너희가 기억하지 못하는 모든것을 상기시켜 줄지어다.</strong><br><strong style="FONT-WEIGHT: 400"><br>3. 변하는 수를 다룰 때에는 늘 조심할지어다. 정수가 절대로 그 한계를 넘지 않으리라 가정하는 것은 어리석음이라. 127 ,-128 ,255 ,32767 ,-32768 ,65535, 이 숫자들을 너의 골수에 새기어라. 0.0은 0이 아니니 실수는 원래부터 결코 정밀하지 않느니라. 부호 없는 것과 있는 것을 어울리거나 정수끼리 나눌 때에는 늘 조심하여라. 변수는 프로그램의 근원, 프로그램을 작성할때 가장 유의 할것이 바로 변수의 이름 짓기니라. 이름보고도 성격을 알 수 있게 해두라. 그러나 변수는 성질이 드러우니 변수에 성격을 부여할때는 조심스럽게 할지어다. 너희는 코딩하기 이전에 계획을 할 지어다. 이는 프로그래머가 코더가 아닌 것이니라.</strong><br><strong style="FONT-WEIGHT: 400"><br>4. 무슨 일을 반복시킬 때에는 처음과 끝에 유의할지어다. 너의 컴퓨터는 1보다는 0을 좋아 하니라. 배열의 첨자가 그 범위를 넘지 않을지 손 댈 때마다 따져 보아라. 수식에 1을 더하거나 뺄 때에는 늘 긴장하라. 너의 프로그램은 단지 한 번 덜해서 틀리고 한 번 더해서 다운되느니라. 프로그램을 작성할땐 계산, 판단, 비교를 그 모든걸 컴에게 되도록 맡기지말라. 네손으로 미리 계산하고 그 결과를 사용하는 방법이 최선이니라. 컴퓨터는 의지가 없나니 네가 잘못하든 잘하든 아무런 상관이 없느라. 너희는 머리가 악세사리가 아님을 기억하고 항상 생각하고 항상 노트에 적을 지어다.</strong><br><br><strong style="FONT-WEIGHT: 400">5. 항상 모든 경우의 수를 고려하고 섣불리 생략하지 말지어다. 절대로 없어 나지 않을 일은 반드시 일어나고, 가장 드물게 일어날 일이 가장 너를 괴롭히리라. 그러하니 언제나 논리에 구멍이 없는지 꼼꼼히 따져 보고, if를 쓸때에는 else 부터 생각하라. 논리적인 오류는 성급함에서 생기나니 처음엔 항상 원리와 원칙을 지키라. 생각은 네가 하라 그리고 그 결과를 컴에게 시켜라. IF를 쓰기전에 규칙을 세우라. 먼저 IF의 결과에대한 규칙부터 세우고 따져라. 그리고 논리적인 계산을 IF문장안에서 하지 말라. 하나의 IF문장속에 수많은 논리연산은 버그의 원인이니라. 어느 정도의 프로그램에 대한 윤곽이 잡히면 프로토 타입을 만들지어다. 프로토타입은 프로그램에 대한 시뮬레이션이며 발주자의 요구를 빨리 수용 하는 방법이니라. </strong><br><br><strong style="FONT-WEIGHT: 400">6. 함수 안에서 매개 변수값은 결코 믿지 말지어다. 지금 그 매개 변수가 결코 가질 수 없다는 값을 내일부터는 가지리라. 그러하니 매개 변수 값이 올바름을 항상 검사할지어다. 그렇더라도 처리 속도가 문제가 되는 경우는 예외이니라. 함수도 하나의 독립적인 프로그램이란것을 잊지말며, 네가 프로그램을 작성할땐 모든 함수가 돼도록이면 독립적으로 돌아가도록 할지어다. 함수의 매계변수는 항상 그옆에 작은 컴맨트와 초기화를 잊지말라. 처음부터 속도문제를 생각하지 말라. 모든 루틴을 최적화 할순 없다. 전체 프로그램중에 단 20%가 전체 실행시간에 80%를 점유한다. 프로토 타입에대한 발주자의 의견을 꼼꼼히 들을 지어다. 이는 발주자에 대한 신뢰도의 척도니라. </strong><br><br><strong style="FONT-WEIGHT: 400">7. 오류를 알려 주는 기능은 있는 대로 모두 활용할지어다. 컴파일러의 경고는 모두 켜두어라. 경고는 곧 오류이니라. 오류를 알리는 함수의 결과를 확인하지 않는 우를 범하지 말지어다. 모든 파일 입출력과 모든 메모리 할당은 조만간 실패할 것이라. 컴파일러가 모든 경고기능을 동원해도 알려주지 않는 것은 많다. 중요한 건 오류가 생기기전에 규칙을 지켰는지 생각하라. 파일의 입출력과 메모리의 항당은 항상 쌍으로 생각해서 열었다면 닫아주고 활당받았다면 돌 려주라. 프로그램의 매인턴앤스를 게을리하지 말지어다. 이는 프로그램 만드는 일 보다 중요한 일이니라. </strong><br><strong style="FONT-WEIGHT: 400"><br>8. 한 번의 수정과 재컴파일만으로 연관된 모든 것이 저절로, 강제로 바뀌도록 할지어다. 어떠한 것을 수정했을 때에 연관된 것이 따라서 변하지 않는다면 그것이 곧 벌레이니라. 컴파일러로 하여금 매개 변수 리스트를 완전하게 검사하도록 하고 언젠가 손대야 하거나 따라서 변해야 하는 수치는 전부 매크로로 치환하며, 형 정의를 적극 활용하여라. 이미 완벽한 루틴을 손대지 말라. 프로그램이 무너지는 가장 첫번째이유는 도미노 현상 때문이나니 한번의 수정과 재컴파일로 쓸데없는것을 손대게 하지 말라. 컴파일러가 매개변수 리스트를 챙기지 말게 하라. 프로그램에 들어가기 전엔 미리 함수명과 매개변수 리스트를 만들어라. 너희는 프로그램의 도큐멘트를 만드는일에 게으르지말지어다. 이는 사용자가 너의 프로그램에 대해서는 바보이기 때문이니라. </strong><br><strong style="FONT-WEIGHT: 400"><br>9. 사용자가 알아서 잘 써 주리라고 희망하지 말지어다. 너의 프로그램은 항상 바보만이 쓰느니라. 사용 설명서를 쓸 때에는 결코 빠뜨리지 말아라. 빠뜨린 만큼 사용자는 너를 괴롭힐 것이니라. 사용자는 나쁜놈이다. 쓸데없는짓을 잘한다. 무식하다. 인간성도 더럽다. 대부분이 바보며 가끔 똑똑한 사람도 있는데 그 놈은 더 하다.모든것을 설명하지 말며 온갇기능을 가진 하나의 프로그램을 작성하려 들지 말라. 많은 기능이 필요한 프로그램은 나누어서 작게 따로 만들어주라. 너희는 공부하는데 게으르지 말지어다. 자고나면 새로운 하드웨어와 새로운 소프트 웨어가 나오기 때문이니라. </strong><br><br><strong style="FONT-WEIGHT: 400">10. 매사에 겸손하고 항상 남을 생각할지어다. 가장 완벽한 프로그램일수록 가장 완벽하게 숨은 벌레가 있느니라. 네가 이 세상 최고의 프로그래머라고 떠들며 자만할 때, 옆집 곳간에서는 훨씬 더 뛰어난 것을 묵묵히 만들고 있느니라. 아무렴 프로그래밍은 혼자 잘나서 할 게 아니니, 너로 인해 다른 사람들도 더불어 잘 되면 그 얼마나 좋은 것이냐. 프로그래머는 논리적으로 생각하여야 하지만 프로그램은 비논리적으로 작성하라. 프로그래머가 경지에 들면 누가 누가 잘하는지 알수가 없는 법, 또한 프로그래머로서의 '무지'에 대해서 잊지마라. 프로그래머의 '무지'는 생략하고, 선택하고, 단순화시키고, 명백하게하는 것이니라. 항상 새로운 아이디어와 새로운 생각으로 무장하라. 그리고 나누라 나누는곳에 기쁨있나니 너희는 모든 프로그램에 대해서 위의 프로시줘를 따를 지니라.</strong> </p></span><p></p><p></p>			 ]]> 
		</description>

		<comments>http://ods81.egloos.com/950323#comments</comments>
		<pubDate>Sat, 03 Nov 2007 08:39:53 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 배열 요소의 삽입, 삭제 ]]> </title>
		<link>http://ods81.egloos.com/924432</link>
		<guid>http://ods81.egloos.com/924432</guid>
		<description>
			<![CDATA[ 
  <p class="MsoNormal"><span style="FONT-FAMILY: Verdana">&nbsp; 배열은<span lang="EN-US"> C언어가 제공하는 가장 기본적인 자료 구조이며 워낙 단순하기 때문에 누구나 쉽게 익숙해질 수 있다. 배열의 장점은 크게 두 가지가 있는데 첫 째로 구조가 단순하기 때문에 정보 자체를 기억하는 메모리 외에 추가로 소모하는 메모리가 전혀 없어 공간 효율이 좋다. 정수형 변수 100개를 저장하는 int ar[100] 배열은 정확하게 정수 100개분만큼의 메모리만을 요구한다.</span></span></p><p class="MsoNormal"><span style="FONT-FAMILY: Verdana">&nbsp; 둘 째로 배열 크기가 아무리 커지더라도 검색 속도가 일정하다<span lang="EN-US">. 배열의 첨자 연산은 포인터를 통해 시작 번지에 첨자*요소크기를 더하는 간단한 동작이므로 임의의 한 요소를 참조하는 시간이 상수이다. int ar[10]에서 ar[9]를 참조하는 시간과 int ar[1000]에서 ar[999]를 참조하는 시간이 똑같다는 얘기이다. 이처럼 배열은 메모리 요구량이나 속도면에서 모두 만족할만한 성능을 보이는데 요약하자면 작고 빠른 자료구조이다. 게다가 쓰기도 쉬워 다양한 용도에 아주 요긴하게 사용된다.</span></span></p><p class="MsoNormal"><span style="FONT-FAMILY: Verdana">&nbsp; 그러나 이런 편리한 배열에도 한 가지 단점이 있는데 배열 요소가 연속된 메모리 공간에 배치되어 있어야 하므로 중간의 요소를 삭제하거나 새로운 요소를 삽입할 수 없다는 점이다</span><span lang="EN-US"><span style="FONT-FAMILY: Verdana">. 배열은 일반적으로 삽입, 삭제가 안되는 것으로 알려져 있는데 이는 일종의 고정 관념이다. 방법을 찾아 보면 조금 불편하기는 하지만 전혀 불가능한 것은 아니다. 다음 예제는 문자형 배열을 대상으로 삽입, 삭제하는 방법을 보여준다.<br><br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">char ar[16]="abcdef";</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">void Insert(int idx, char ch)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; memmove(ar+idx+1,ar+idx,strlen(ar)-idx+1);<br>&nbsp;&nbsp;&nbsp;&nbsp; ar[idx]=ch;<br>}</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">void Delete(int idx)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; memmove(ar+idx,ar+idx+1,strlen(ar)-idx);<br>}</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">void Append(char ch)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; Insert(strlen(ar),ch);<br>}</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">void main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; printf("최초 : %s\n",ar);<br>&nbsp;&nbsp;&nbsp;&nbsp; Insert(3,'t');printf("t삽입 : %s\n",ar);<br>&nbsp;&nbsp;&nbsp;&nbsp; Delete(1);printf("b삭제 : %s\n",ar);<br>&nbsp;&nbsp;&nbsp;&nbsp; Append('s');printf("s추가 : %s\n",ar);<br>}</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana"><br></span></span><span style="FONT-FAMILY: Verdana">문자형 배열<span lang="EN-US"> ar에 "abcdef"라는 일련의 문자들(문자열)을 저장해 놓고 문자 중간에 다른 문자를 삽입하거나 삭제한다. 실행 결과를 보면 문자 중간에 다른 문자가 끼어들기도 하고 사라지기도 한다.</span></span></p><p class="a3"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">&nbsp;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></span></p><p class="a3"><span style="FONT-FAMILY: Verdana">최초<span lang="EN-US"> : abcdef</span></span></p><p class="a3"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">t삽입 : abctdef</span></span></p><p class="a3"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">b삭제 : actdef</span></span></p><p class="a3"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">s추가 : actdefs</span></span></p><p class="a3"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">&nbsp;<o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">Insert 함수는 배열의 idx번째 요소에 ch문자를 삽입하는데 12장에서 연구해 본 바 있는 메모리 이동 함수인 memmove를 사용한다. 이 함수로 삽입될 위치 이후의 문자들을 한칸씩 뒤로 이동시켜 새 요소가 삽입될 공간을 만든다. 이동을 시작할 위치는 배열 선두 ar에서부터 idx 뒤쪽인 ar+idx이고 이 번지 이후부터 한칸씩 뒤로 밀어야 하므로 ar+idx+1 번지가 이동 목적지이다.</span></span></p><p class="MsoNormal"><span style="FONT-FAMILY: Verdana">이동할 길이는 이동 시작 번지 뒤쪽의 남은 요소 개수인데 이 개수는 전체 길이인</span><span lang="EN-US"><span style="FONT-FAMILY: Verdana">strlen(ar)에서 이동 시작 요소의 번호인 idx를 빼서 구하되 널 종료 문자도 포함시켜야 하므로 1을 더해 주었다. memmove 함수는 바이트 단위의 이동 길이를 요구하므로 이동할 요소 개수에 요소 타입의 크기인 sizeof(char)를 곱해야 하나 이 경우는 요소 크기가 1이므로 생략할 수 있다. Insert(3,'t') 호출의 동작을 살펴보면 다음과 같다.<br><br></span></p><p class="a"><span lang="EN-US"><span style="FONT-FAMILY: Verdana"></span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">&nbsp; ar+3번지 이후의 내용을 ar+4번지로 이동하며 총 이동 길이는 ar+3 뒤쪽에 있는 3문자에 널 종료 문자를 더해 4바이트만큼이다. ar+3은 ar+4로, ar+4는 ar+5로 배열 끝까지 한 칸씩 오른쪽으로 이동하는 셈이다. memmove 호출의 결과로 d가 있던 자리가 비워지는데 이 자리에 삽입하고자 하는 문자를 대입하면 된다. 배열의 첨자 연산이 단순한 곱셈과 덧셈만으로 가능하기 위해서는 배열을 구성하는 요소들이 물리적으로 연속적인 메모리 공간에 저장되어 있어야 한다는 전제 조건이 만족되어야 한다. </span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">memmove는 삽입될 위치 이후를 뒤로 복사함으로써 삽입 후에도 배열이 이 조건을 만족하도록 한다. 또한 memmove 함수는 이동 시작 번지와 이동 목적지의 번지가 겹쳐 있을 때(overlap) 이동 방향을 조정하여 복사되기 전의 원본이 깨지지 않도록 한다. 위 예에서 ar+3을 ar+4로 복사해 버리면 다음 이동 대상인 ar+4가 파괴되어 버리므로 ar+5부터는 계속 ar+3의 값을 가지게 될 것이다. 이런 경우 똑똑한 memmove는 뒤쪽에서부터 복사를 함으로써 복사전의 원본이 파괴되지 않도록 한다. 함수 내부에서 알아서 정확한 복사를 하도록 되어 있으므로 개발자들은 어디서부터 어디까지 얼마만큼 복사하라는 최소한의 의사 표시만 하면 된다.</span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">Delete 함수는 idx번째 요소를 삭제하는데 Insert 함수보다 훨씬 더 쉽다. 삭제할 요소의 뒤에 있는 모든 요소를 한칸씩 앞쪽으로 이동시키기만 하면 된다. 이동할 길이는 삭제 대상 요소 이후의 남은 요소 개수에 널 종료 문자분을 더한 길이만큼이다. 남은 요소 개수는 총 길이인 strlen(ar)에서 삭제 대상 요소 다음 번호인 idx+1을 빼고 여기에 널 종료 문자분인 1을 더하면 된다. strlen(ar)-(idx+1)+1로 계산되는데 -1+1은 상쇄되어 사라진다.</span></span></p><p class="a"><span lang="EN-US"></span>&nbsp;</p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">&nbsp; b가 있던 자리에 c가 오고 c가 있던 자리에 t가 오는 식으로 모든 요소가 한칸씩 앞쪽으로 이동하며 b는 바로 뒤쪽 요소인 c로 덮여져 사라진다. 배열 끝에 새 요소를 추가하는 Append동작은 배열 끝에 삽입하는 것과 같으므로 Insert를 대신 호출하되 삽입할 위치를 NULL 문자가 있는 위치인 strlen(ar)로 지정하면 된다.</span></span></p><p class="MsoNormal"><span style="FONT-FAMILY: Verdana">&nbsp; 이 예제로 실험해 봤다시피 배열도 요소를 앞뒤로 이동시키면 삽입과 삭제가 가능하기는 하다<span lang="EN-US">. 메모리를 직접 이동시켜야 하므로 삽입 속도가 다소 느린 편인데 배열이 길수록, 삽입 위치가 앞쪽일수록 이동 시간은 더 오래 걸릴 것이다. 하지만 삽입, 삭제는 읽기나 추가 동작보다 빈도가 낮고 memmove는 굉장히 고속으로 동작(초당 20억 바이트 정도)하기 때문에 우려하는만큼 느리지 않다. <strong><span style="COLOR: #ff0000">memmove의 내부 코드는 루프를 돌리는 C코드가 아니며 CPU가 하드웨어적으로 직접 처리하는 마이크로 코드이므로 상상을 불허할 정도로 빠르다.</span></strong></span></span></p><p class="MsoNormal"><span lang="EN-US"><span style="FONT-FAMILY: Verdana">&nbsp;<o:p></o:p></span></span></p></span><br/><br/>tag : <a href="/tag/memmove" rel="tag">memmove</a>			 ]]> 
		</description>
		<category>MSDN</category>
		<category>memmove</category>

		<comments>http://ods81.egloos.com/924432#comments</comments>
		<pubDate>Sun, 28 Oct 2007 08:05:04 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 자연어 처리 기술 ]]> </title>
		<link>http://ods81.egloos.com/923458</link>
		<guid>http://ods81.egloos.com/923458</guid>
		<description>
			<![CDATA[ 
  자연어 처리 기술에 관한 자료<br>제목 - 자연어 처리의 이해 <a href="http://pds7.egloos.com/pds/200710/28/59/nlp.ppt">nlp.ppt</a><br>출처 - <a href="http://blog.naver.com/cicima1001?Redirect=Log&amp;logNo=10004108759">http://blog.naver.com/cicima1001?Redirect=Log&amp;logNo=10004108759</a><br/><br/>tag : <a href="/tag/자연어처리" rel="tag">자연어처리</a>			 ]]> 
		</description>
		<category>NLP</category>
		<category>자연어처리</category>

		<comments>http://ods81.egloos.com/923458#comments</comments>
		<pubDate>Sun, 28 Oct 2007 03:09:54 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 좋은 프로그래머 되기 ]]> </title>
		<link>http://ods81.egloos.com/923321</link>
		<guid>http://ods81.egloos.com/923321</guid>
		<description>
			<![CDATA[ 
  <a href="http://wiki.kldp.org/wiki.php/HowToBeAProgrammer">http://wiki.kldp.org/wiki.php/HowToBeAProgrammer</a><br/><br/>tag : <a href="/tag/프로그래머" rel="tag">프로그래머</a>			 ]]> 
		</description>
		<category>프로그래머</category>

		<comments>http://ods81.egloos.com/923321#comments</comments>
		<pubDate>Sun, 28 Oct 2007 02:11:40 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 오픈소스 검색엔진 너치 ]]> </title>
		<link>http://ods81.egloos.com/922725</link>
		<guid>http://ods81.egloos.com/922725</guid>
		<description>
			<![CDATA[ 
  <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 새굴림; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA"><a href="http://blog.naver.com/nutch.do">http://blog.naver.com/nutch.do</a></span><br/><br/>tag : <a href="/tag/nutch" rel="tag">nutch</a>			 ]]> 
		</description>
		<category>nutch</category>

		<comments>http://ods81.egloos.com/922725#comments</comments>
		<pubDate>Sat, 27 Oct 2007 19:04:06 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Web2.0은 오픈소스를 위한 세계 ]]> </title>
		<link>http://ods81.egloos.com/921038</link>
		<guid>http://ods81.egloos.com/921038</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-FAMILY: Verdana">지금까지의 기업 컴퓨팅 환경은 <strong>서비스 중심</strong>이였다. 자원에 대한 전적인 권한을 기업이 가지고 있었으며, 서비스 제공자와 서비스 사용자가 엄격히 구분되어 있었다. 이러한 환경에서 기업은 자신들이 분명히 제어할 수 있는 환경을 원하기 마련이다. 그래서 <strong>매우 강력한</strong> 몇개의 컴퓨터와 이들 컴퓨터에 최적화된 상용 운영체제와 상용 소프트웨어를 이용한 정형화된 컴퓨팅 환경을 선호했었다. <strong>성당모델</strong>을 따르는 환경이라고 할 수 있는데, 단지 몇개의 강력한 컴퓨터와 훌륭한 메뉴얼이 제공되는 소프트웨어를 사용하는 것으로 관리의 복잡성을 줄일 수 있었기 때문이다.<br><br></span><div><span style="FONT-FAMILY: Verdana">그러나 플랫폼 중심의 Web2.0 환경으로 넘어오면서, 기존의 컴퓨팅 환경도 변화하게 된다. <br><br></span><div><span style="FONT-FAMILY: Verdana"><span class="attach"><img alt="web2.png" src="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource?action=download&amp;value=web2.png"></span><br><br></span><div><span style="FONT-FAMILY: Verdana">기존에는 단지 몇대의 강력한 컴퓨터만을 이용해서 데이터를 다루고, 서비스를 할 수 있었으나, 데이터의 양이 극적으로 늘어나면서 수백/수천 심지어는 수만대의 컴퓨터를 이용한 서비스도 심심찮게 볼 수 있게 되었다. 여기에 서비스 제공자와 서비스 이용자가 분리되어 있던, Web1.0 시대와는 달리 </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=MashUP"><span style="FONT-FAMILY: Verdana">MashUP</span></a><span style="FONT-FAMILY: Verdana">서비스가 늘어나면서, 서비스 제공자와 서비스 이용자의 경계가 애매모호해 지게 되었다.<br><br></span><div><span style="FONT-FAMILY: Verdana">이제는 누구나 자신의 블로그 혹은 홈페이지를 통해서 </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Google/Service/GoogleMapAPI"><span style="FONT-FAMILY: Verdana">맵</span></a><span style="FONT-FAMILY: Verdana">, 온라인 경매, 온라인 서점, </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Google/Service/Coop_search"><span style="FONT-FAMILY: Verdana">개인화 검색 서비스</span></a><span style="FONT-FAMILY: Verdana">, 동영상 서비스를 할 수 있게 되었으며, 가능한 서비스의 갯수도 점점 늘어날 것이다.<br><br></span><div><span style="FONT-FAMILY: Verdana">여기에서 기존의 컴퓨팅 페러다임에 대한 문제가 발생하게 된다. 일단 처리해야 하는 데이터의 양이, 컴퓨터의 처리능력을 초과해 버렸다. 아무리 강력한 컴퓨터를 사용한다고 하더라도, 단일 컴퓨터로는 입력되는 방대한 양의 처리가 불가능하게 되었다. 때문에 분산 / 병렬 컴퓨팅 환경을 구성해야될 필요성을 느끼게 된다. 이러한 Web2.0의 환경에서 아래와 같은 이유들 때문에 <strong>오픈소스 소프트웨어</strong>와 <strong>오픈소스 운영체제</strong>가 전략적인 요소로 자리매김 하게 될 것이다.<br><br></span><h3><a id="s-1" name="s-1"></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">비용 </span><a class="perma" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource#s-1"></a></h3><div><span style="FONT-FAMILY: Verdana">대부분의 기계가 그렇듯이, 성능이 일정 수준이상 넘어가면 성능대비 가격 효율이 급격하게 떨어지게 된다. 10이 달성할 수 있는 최고 성능수준이라고 가정해보자. 3의 성능에서 6의 성능까지 올리는데에는 20의 자원으로 가능했다고 하면, 6에서 9로 올리는데에는 100 이상의 비용이 들어가게 된다. 구축하는데에도 엄청난 비용이 들어가지만, 유지보수 하는 것도 장난이 아니다. 시스템 하나하나가 강력하기 때문에, 하나의 시스템에서 문제가 생길경우, 전체분산시스템의 성능이 크게 떨어질 수 있기 때문이다. 거기에, 컴퓨터의 능력보다 처리해야 하는데이터의 증가속도가 더 빠르기 때문에, 계속적으로 값비싼 시스템을 추가해야 하는 부담까지 떠안게 된다. 이런 시스템은 관련 기술자를 찾는 것도 매우 어렵다는 문제점을 가진다. 분산 환경을 <strong>값비싼 소수의 컴퓨터</strong>로 구성하게 될경우, 밑빠진 독에 물붓기 식으로 비용이 증가하게 될 것이다. 이렇게 엄청난 비용을 투자해서 시스템을 갖춘다고 해도, 2년도 채 안되어서 구식 시스템이 되어버리는 문제가 생긴다.<br><br></span><div><span style="FONT-FAMILY: Verdana"><span class="attach"><img style="WIDTH: 479px; HEIGHT: 365px" height="412" alt="cost.png" src="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource?action=download&amp;value=cost.png" width="540"></span><br><br></span><div><span style="FONT-FAMILY: Verdana">이러한 분산환경은 강력한 몇개의 컴퓨터대신에, 적당한 성능을 가진 저렴한 다수의 컴퓨터로 구성하는게 훨씬더 유리하다. 10대의 슈퍼컴퓨터로 분산컴퓨팅 환경을 만드는 것보다 100대의 서버급컴퓨터로 만드는게 훨씬 비용이 적게 든다는 얘기가 된다. 한대 한대의 컴퓨팅 파워가 약하기 때문에, 컴퓨터 몇대에 문제가 생기더라도 전체 분산환경에 미치는 영향도 그리 크지 않다. 또한 저렴하기 때문에 쉽게 시스템을 추가할 수 있으며, 데이터의 증가에도 유연하게 대처할 수 있다. 관련 기술도 쉽게 확보할 수 있다는 잇점을 가진다. 실질적으로 거의 대부분이 분산환경이 저렴한 다수의 컴퓨터를 활용하는 방식으로 구성되고 있다.<br><br></span><div><span style="FONT-FAMILY: Verdana">이러한 분산환경에서 오픈소스는 진가를 발휘하게 된다. 웹 플랫폼을 위해서 500대의 컴퓨터를 사용해야 한다고 가정해보자. 이 환경을 구성하기 위해서 상용 운영체제를 사용할 것인가 ? 수백만원이 넘는 값비싼 상용 소프트웨어를 사용할 것인가? 과거 Web1.0 시대라면, 컴퓨터 자체가 강력하고 워낙에나 비쌌기 때문에 소프트웨어의 가격이 좀 비싸다고 해도, 큰문제가 되지 않았겠지만 수백대의 저렴한 컴퓨터에 사용하기에는 비용이나 효과면에서 너무 비효율적이다. 나라면 </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=Linux"><span style="FONT-FAMILY: Verdana">Linux</span></a><span style="FONT-FAMILY: Verdana"></span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=운영체제"><span style="FONT-FAMILY: Verdana">운영체제</span></a><span style="FONT-FAMILY: Verdana">와 </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=Mysql"><span style="FONT-FAMILY: Verdana">Mysql</span></a><span style="FONT-FAMILY: Verdana">, </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=Postgresql"><span style="FONT-FAMILY: Verdana">Postgresql</span></a><span style="FONT-FAMILY: Verdana">등의 공개소프트웨어를 이용해서 시스템을 구성할 것이다.<br><br></span><div><!--google_ad_client = "pub-0339096251232740";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";//2007-06-19: blog_centergoogle_ad_channel = "8014010384";//--><div><h3><a id="s-2" name="s-2"></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">유연성 </span><a class="perma" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource#s-2"></a></h3><div><span style="FONT-FAMILY: Verdana">기존의 패러다임으로 분산환경을 구축하는데에는 비용도 문제가 되지만, <strong>지나치게 경직</strong>되어 있다는 근본적인 문제를 가진다. 기존의 상용 운영체제와 소프트웨어들은 자신들이 <strong>제시한 환경</strong>을 고객에게 강제하는 스타일이다. Web1.0 시대라면 이게 문제가 되지 않는다. 그냥 그들이 원하는 대로 시스템을 꾸리고, 서비스를 거기에 맞게 튜닝하면 되기 때문이다.<br><br></span><div><span style="FONT-FAMILY: Verdana">그러나 Web2.0환경에서는 그러한 방식이 적용되지 않는다. Web2.0은 사용자에게 서비스를 제공하는 환경이 아닌, 플랫폼을 제공하는 환경으로, 다양한 서비스들과 플렛폼이 <strong>유동적</strong>으로 연결되는 일종의 EchoSystem(생태계)의 성격을 가지게 된다. <br><br></span><div><span style="FONT-FAMILY: Verdana"><span class="attach"><img alt="eco.png" src="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource?action=download&amp;value=eco.png"></span><br><br></span><div><span style="FONT-FAMILY: Verdana">500대의 시스템으로 이루어진 분산환경을 예로들어 보겠다. </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=분산파일시스템"><span style="FONT-FAMILY: Verdana">분산파일시스템</span></a><span style="FONT-FAMILY: Verdana">, 분산연산시스템을 만든다면 응용 프로그램에서 뿐만 아니라, </span><a href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/manSearch?google=none&amp;name=kernel"><span style="FONT-FAMILY: Verdana">kernel</span></a><span style="FONT-FAMILY: Verdana">수준에서의 수정작업이 필요할 수 있다. 상용운영체제에서는 불가능하다. 획일화된 서비스가 아닌, 다양한 서비스가 개발되어야 하기 때문에 쉽게 수정이 되며, 분기가능한 소프트웨어가 있어야 한다. 역시 상용 소프트웨어에서는 불가능하다. 제한적으로 가능하다고 하더라도, 별도의 비용과 정치적인 문제로 많은 시간이 소비된다. <br><br></span><div><span style="FONT-FAMILY: Verdana">상용소프트웨어는 더 안전하고 강력하다고 반론을 제기할 수도 있을 것이다. 물론 상용 소프트웨어는 여전히 쓰일 수 있을 것이다. 그러나 Web2.0에서의 플랫폼은 애시당초 <strong>적당히 견고하고, 적당히 강력한 환경의 구성</strong>을 지향점으로 하고 있다. 따라서 소프트웨어 역시 적당히 견고하고 적당히 강력하면 된다. 굳이 비싼 비용을 들여서 매우 견고한 환경을 만들 필요는 없다. 정리하자면 <strong>적당히 견고하고</strong>, <strong>적당히 강력하며</strong>, <strong>매우 유연한</strong> 환경이 Web2.0 플랫폼의 지향점이다.<br><br></span><div><span style="FONT-FAMILY: Verdana">오픈소스 소프트웨어는 상용 소프트웨어로는 결코 얻을 수 없는 유연성을 보장한다. 상용 소프트웨어 만큼의 견고함은 아니라 하더라도, 충분한 수준의 견고함을 확보하고 있으며, 표준을 따르며, 소스코드를 직접 제어할 수도 있다. 일정 수준이상의 개발자혹은 커뮤니티를 확보하고 있다면, 상용 소프트웨어보다 훨씬 빠르게 문제점을 찾아서 해결할 수도 있다.<br><br></span><div><span style="FONT-FAMILY: Verdana">최근 포탈사이트와 Web2.0을 표방하는 기업들을 중심으로 오픈소스 커뮤니티를 직접적으로 지원하며, 관련 개발자를 확보하려는 이유가 여기에 있다.<br><br></span><div><h3><a id="s-3" name="s-3"></a><span style="FONT-SIZE: 100%; FONT-FAMILY: Verdana">반론 </span><a class="perma" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource#s-3"></a></h3><div><span style="FONT-FAMILY: Verdana">위의 상황은 Web2.0을 핵심전략으로 삼고 있는 포털급의 규모를 가진 회사에나 적용가능한 것 아닌가라고 반론을 제기할 수도 있을 것이다. 웹서비스, 웹플랫폼은 주변요소가 아닌 <strong>핵심요소</strong>가 되었다. MS사가 이 흐름에 대항하려고 시도했었지만, 결국은 흐름을 인정하고 방향을 선회했다. 또한 큰 규모의 회사가 움직이면, 산업역시 거기에 맞추어서 재편이 될 수 밖에 없다.<br><br></span><div><h3><a id="s-4" name="s-4"></a><span style="FONT-FAMILY: Verdana"><span style="FONT-SIZE: 100%">오픈소스에 관심을</span> </span><a class="perma" href="http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Web2_OpenSource#s-4"></a></h3><div><span style="FONT-FAMILY: Verdana">우리나라의 경우 오픈소스에 대한 관심과 이해가 취약한게 사실이다. 학생들도 <strong>재미</strong>삼아서 혹은 <strong>보험용</strong>으로 다루는 경우가 많은 것으로 알고 있다. 그러나 앞으로 상황은 바뀌게 될 것이다. 변두리에서 벗어나서 소프트웨어 산업의 핵심요소로 자리매김 하게 될 것이다. 오픈소스에 조금더 관심을 가져보기 바란다. 재미도 있을 뿐더러, 많은 도움이 될 것이다.<br></span></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><br/><br/>tag : <a href="/tag/web2.0" rel="tag">web2.0</a>,&nbsp;<a href="/tag/오픈소스" rel="tag">오픈소스</a>			 ]]> 
		</description>
		<category>web2.0</category>
		<category>오픈소스</category>

		<comments>http://ods81.egloos.com/921038#comments</comments>
		<pubDate>Sat, 27 Oct 2007 11:07:51 GMT</pubDate>
		<dc:creator>오대성</dc:creator>
	</item>
</channel>
</rss>
