2012년 4월 22일 일요일

프로토콜 계층

application layer
transport layer
network layer

link layer
physical layer
위 두가지는 특정 링크상에 통신을 다루는 책임이 있으므로 그들은 전형적으로 부여된 링크와 관련된 네트워크 인터페이스 카드로 구현된다.(이더넷이나 wifi 인터페이스 카드)


네트워크 카드
위키백과, 우리 모두의 백과사전.
Network card.jpg
네트워크 카드(network card)는 컴퓨터, 네트워크 안에서 컴퓨터끼리 통신하는 데 쓰이는 하드웨어의 하나이다. 대한민국에서는 랜 카드(문화어: 망카드, 망기판)라고 흔히 말하며, 네트워크 어댑터, 네트워크 인터페이스 카드(NIC), 이더넷 카드라고도 한다. OSI 계층 1(물리 계층)과 계층 2(데이터 링크 계층) 장치를 가지는데, 맥 주소를 사용하여 낮은 수준의 주소 할당 시스템을 제공하고 네트워크 매개체로 물리적인 접근을 가능하게 한다. 사용자들이 케이블을 연결하거나 무선으로 연결하여 네트워크에 접속할 수 있다.
"두 장의 카드"를 사용하여 같은 주소를 공유하던 사례는 없다. IEEE 표준에 근거한 것인데, 고유의 맥 주소를 네트워크 인터페이스 콘트롤러의 제조업체에게 할당하는 책임을 진다.
노벨, 3COM (마벨), 인텔, 리얼텍 등이 네트워크 카드 제조 업체로 잘 알려져 있다.

[편집] 연결 방식

네트워크 카드는 이전에는 보통 확장 카드로 따로 설치하였지만 요즘에는 대개 메인보드에 내장되어 쓰는 경우가 많다.
  • 메인보드 기준
    • 내장형(일반적으로 유선이 많으며, 일부 무선이 내장된 경우도 있음)
    • PCI 커넥터
    • ISA 커넥터 (현재는 쓰이지 않음)
    • PCI 익스프레스
  • 네트워크 기준

[편집] 속도

속도는 흔히 10/100/1000로 나뉜다.
  • 초당 10 메가비트
  • 초당 100 메가비트
  • 초당 1000 메가비트
  • 초당 최대 160 기가비트


랜카드는 인터넷을 하기 위한 필수적인 하드웨어입니다.

보통 인터넷을 하기 위해서는 랜선, 랜카드, 허브가 필요하고, 무선랜인 경우에는 무선랜카드와 AP(Access Point:허브역할수행)가 있어야 됩니다.

보통은 가입하실때 랜카드 유무를 묻는데 랜카드가 없을시는 가격을 더 받습니다.(랜카드 가격 1만에서 1만5천원선, 요즘은 경쟁이 붙어서 공짜로 해주기도 하지만요...^^)

혹시 랜카드가 남았다면 가지고 계시다가 인터넷이 안될때 랜카드 교체 방법도 한방법이 될수 있으니 버리지 마시고 가지고 계시기 바랍니다.  



랜카드란?
NIC(Network Interface Card)이며 네트워크 장비이다. 요즘은 P&P즉 플러그 앤 플레이로 인하여
자동으로 필요한 프로그램과 네트워크 자동으로 연결합니다. 쩌네?

랜카드는 케이블에 유저의 데이터를 실어서 허브나 스위치, 혹은 라우터 등으로 전달해주고 자신에게 온 데이터를
CPU에게 전달해주는 역할을
한다. 즉 데이터를 전송하고 데이터를 CPU에 올리는 작업을 NIC 네트워크 카드 랜카드의 주된 작업이다.
결국은 네트워크 상의 데이터를 주고 받아주는 장비네? 어려운거 없어 일단은 이렇게만 알아도 어디가서 랜카드에 대한 지식은 내가 짱 !!!!!!!!!!!!! 야르 !!

아래 내용은 지극히 실무적인 내용이라.. 그냥 훍터보자 외우지마 !! 머리통 터진다

랜카드는 랜에 접속하기 위한 카드처럼 생긴것? 이라고 생각해도 틀린말은 아니다.
랜카드를 구비할때는 주어진 환경, 버스방식, 접속방식을 고려해야 한다.
주어진 환경에는 토큰링, 이더넷등이 있고 버스방식에는 PCI, ISA, EISA등이 있고, 접속방식에는 데스크탑, 노트북
USB포트용, 프린터포트용 즉 접속 방식에만 차이를 보이뿐 동일한 기능을 한다.
외쿡은 토큰링을 많이 사용하는데 우리나라는 이더넷을 더 많이 사용한다고 한다 !! 뭐 이런건 알아도 몰라도 되지만 알아두면 좋징 !!

랜카드는 랜카드에 접속하는 케이블의 종류에 따라서 TP 포트를 가진 랜카드, BNC, AUI포트를 가진 랜카드, 광케이블과
연결하는 랜카드등 랜카드의 종류를 나눌수 있다
. 즉 다시말해 랜카드는 환경, 버스, 접속, 연결케이블에 따른 랜카드를
구비해야 한다.

[출처] 랜카드(NIC) 란?|작성자 세큐러팅

2012년 4월 16일 월요일

시스코 시스템 : 네트워크 핵심을 지배

미국의 네트워크 통신회사로 세계 네트워크 장비 시장의 3분의 2를 석권하고 있다. 최근에는 중소기업과 일반 소비영역, 광통신 영역등으로 진출하고 있으며 캘리포니아주 산호세에 본사가 있다.
국가 미국
업종 네트워크 통신
설립일 1986년
본사 캘리포니아주 산호세
총자산 328억 7000만 달러(2000)
매출액 189억 2800만 달러(2000)


본문
데이터 처리에 뛰어난 회사로 1986년 첫제품을 출하하였고, 1990년 기업공개를 하였다. 세계에서 가장 가치가 높은 회사의 하나로 꼽히는 이 회사는 네트워크를 접속시켜 인터넷을 가능하게 하는 장비에 대한 세계 시장의 3분의 2를 석권하고 있다. 또한 전화 접속 서버네트워크 관리 소프트웨어도 제작하고 있다.

전통적으로 서비스 제공업체와 기업을 상대로 업무활동을 해왔지만, 경쟁업체인 3Com의 기반인 중소기업과 일반 소비자 영역, 그리고 노텔네트워크스(Nortel Networks Corporation)와 루슨트테크놀로지스(Lucent Technologies) 등과 같은 회사들이 지배하고 있는 광통신 영역 등으로도 차츰 진출하고 있으며 주니퍼네트워크스(Juniper Networks, Inc.)와도 경합을 벌이고 있다.

유능한 인재와 최신 기술을 확보하기 위한 정책으로 1993년 이래 70여 차례의 기업 인수를 해왔지만, 2000년 말부터는 시장 상황으로 타기업 인수 속도가 느려지고 있는 상태이다.

2000년 현재 총자산 328억 7000만 달러, 매출액 189억 2800만 달러이며, 본사는 캘리포니아주() 산호세에 있다.

랜카드란

랜카드의 정의는 아래와 같습니다.

외부와 가장 빠른 속도로 데이터를 주고 받을 수 있는 PC의 통신장치로, 근거리통신망을 뜻하는 랜(LAN)과 비디오카드나 모뎀처럼 PC의 확장슬롯에 꽂혀 사용되는 장치를 의미하는 카드(card)를 합친 용어이다. 네트워크카드와 이더넷카드·이더넷어댑터·NIC(Network Interface Card) 등 다양하게 불린다. 여기서 이더넷(Ethernet)은 가장 널리 사용되는 랜의 방식이다. 랜에 연결된 PC나 워크스테이션들은 대체로 이더넷이나 토큰링(token ring)과 같은 근거리통신망 전송기술을 위해 특별히 설계된 랜카드를 장착하고 있다.
콘트롤칩과 통신전용칩·버퍼 등으로 이루어져 있다. 이 가운데 콘트롤칩은 데이터의 입출력과 기본적인 기능을 관장하며, 통신전용칩은 통신기능을 관장하고, 버퍼는 데이터를 저장하는 기능을 가진다. 보드의 형태에 따라 ISA(Industry Standard Architecture)용과 EISA(Extended Industry Standard Architecture)용으로 구분된다. 또한 지원되는 커넥터의 형태에 따라 AUI(attachment unit interface)+동축케이블, AUI+TP(Twisted Pair), AUI+동축케이블+TP 등의 종류가 있다. 이 가운데 AUI+동축케이블+TP로 이루어진 것을 콤보(Combo)형이라고 한다.
간단하게 말하자면 컴퓨터에 인터넷을 할 수 있게 해주는 부품이라고 생각하면 됩니다.
요즘은 대부분 메인보드에 내장된 형태로 되어 있는 내장랜을 많이 씁니다.
내장 랜이 고장난 경우 따로
이런 식으로 되어 있는 카드 형태의 랜카드를 장착해서 씁니다.
이것이 모양상의 분류구요.
무선 신호를 받아 들일수 있는 무선랜카드, 유선신호만 받아 들이는 우리가 많이 볼 수 있는 유선랜카드 로도 나울 수 있습니다.

2012년 4월 5일 목요일

비트 필드

아이오 교육센터의 기술자료는 다양한 서적/문서를 참고해서 교육센터 자체로 만든 자료입니다.
마음대로 퍼가셔도 되지만 꼭 출처를 밝혀 주시기 바랍니다.
bit flag를 활용한 성능 향상 기법
게임서버를 만들일이 있다고 가정해 보겠습니다. 저는 게임을 잘 모르지만 일예로 리니지 같은 게임을 만든 다면 게임서버에 들어갈 요소는 무엇이 있을까요? 캐릭터, 몬스터, 아데나, 맵, 좌표체계 기타등등
이 떠오릅니다. 이중에서도 가장 중요한것이 빠져 있는 데요? 그것은 바로 아이템 입니다.

그렇다면 프로그램에서 아이템을 소유하고 있는지를 표현 하려면 어떤 자료 구조가 가장 좋을 까요?
일견 떠오르는 것은 변수지만 변수는 아이템의 수가 많아 지면 변수도 증가 해야 하고 변수의 네이밍이 어려울 뿐더러 루프구조에 넣을수 없으므로 일반화 시킬수 없다는 단점이 있습니다.

이런 단점을 극복한 것이 바로 배열 이지요.

배열을 이용해 다음처럼 프로그램을 작성해 봅시다.
#include <stdio.h>

int main()
{
int item[4] = {0,}; // 아이템은4, 0은없음, 1은있음
int i;

item[0] = 1; // 0번아이템취득
item[3] = 1; // 3번아이템취득

for( i=0; i<4; i++ )
{
if( item[i] != 0 ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}
printf("---------------------\n");
item[0] = 0; // 0번아이템상실

for( i=0; i<4; i++ )
{
if( item[i] != 0 ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}

return 0;
}

프로그램의 결과는?

0번 아이템 소유중
3번 아이템 소유중
---------------------
3번 아이템 소유중

로 출력 됩니다.

아주 훌륭한 결과라 할 수 있습니다. 아이템 개수가 늘어 나더라도 프로그램은 아이템의 수만 바꾸면 간단하게 바꿀수 있도록 설계 되어 있으니 아이템 소유 유무를 출력하는 부분만 함수로 분리 해주면 아주 좋은것 같습니다.

그렇다면..
다음과 같이 함수로 모듈화 하면 되겠네요..
#include <stdio.h>

void get_item( int *item , int n)
{
int i;
for( i=0; i<n; i++ )
{
if( item[i] != 0 ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}
}


int main()
{
int item[4] = {0,}; // 아이템은4, 0은없음, 1은있음


item[0] = 1; // 0번아이템취득
item[3] = 1; // 3번아이템취득

get_item ( item, 4 );
printf("---------------------\n");
item[0] = 0; // 0번아이템상실

get_item ( item, 4 );

return 0;
}

그럼 이제 모든게 끝났습니다. 원래 게임 서버라는게 그래픽이 들어가지 않으므로 빠르게 데이터를 중계하는 자료구조가 중요한데 위에 설계처럼 배열을 이용하니 간단히 해결 된것 같습니다.

그럼 이제 문제가 전혀 없는 걸까요?

잠시 생각해 봅시다.

동시접속자 : 10000명
캐릭터 수 : 5개
아이템수 : 1024개
아이템 메모리단위 : 4byte

인 시스템의 경우 아이템을 위한 서버의 메모리는 얼마일까요?

4 * 10000 * 5 * 1024 => 약 200 Mbyte

라는 결과가 나옵니다. 게임서버를 이루는 수많은 요소 중에 아이템을 표시하기 위해서 저렇게 메모리를 많이 끼워야 한다는 결론이 나옵니다. 머 요즘은 메모리가 싸니깐 메모리를 더 끼면 되는거 아녀? 라고 생각할 수도 있지만 더 큰 문제는 메모리를 저렿게 많이 사용하면 속도가 느려져서 유저들이 게임을 실시간으로 즐길수 없다는 결론에 도달하게 됩니다.

결론적으로 위와 같이 프로그램 하면 절대 안된다는것이지요..

안된다는 것을 알았다면 대안이 필요할텐데요?

그 대안은 바로 아이템을 위해 INT를 사용 하지않고 char를 사용하는 것입니다.

하지만 그 정도 대안으로는 위와 같은 문제를 해결 할수 없지요.. 메모리를 혁신적으로 줄여서 성능을 향상 시키고 싶다면 고수들이 즐겨 쓰는 비트 필드 연산자를 이용 하면 됩니다.

다음의 프로그램을 보세요.. 그리고 원리를 생각해 보세요.
#include <stdio.h>

void get_item( int *item , int n)
{
int i;
for( i=0; i<n; i++ )
{
if( *item & (1<<i) ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}
}

int main()
{
int item=0; // 아이템을표시하기위해배열을사용하지않음

item |= 1<<0; // 0번아이템취득
item |= 1<<3; // 3번아이템취득

get_item ( &item, 4 );
printf("---------------------\n");
item &= ~(1<<0); // 0번아이템상실

get_item ( &item, 4 );

return 0;
}

프로그램의 결과는?

0번 아이템 소유중
3번 아이템 소유중
---------------------
3번 아이템 소유중

으로 기존 배열 버젼과 같습니다.

다음 설명을 보세요.

모든 아이템을 1bit만으로 표시 하기 위해 비트별 |는 비트 세팅을 위해 사용 됩니다.


위에 그림처럼 아이템은 비어 있었으나 가장 마지막 비트가 세팅됩니다.
비트 필드는 가장 오른쪽이 2의 0승 자리 이므로 0번째 인덱스가 세팅되었다고 볼수 있습니다.



위에 그림에서 보듯이 0번 인덱스가 세팅 되어 있는 아이템에서 3번 인덱스를 세팅하려해도
비트필드 연산 | 가 사용 됩니다. 원래 세팅되었던 값은 그대로 유지된채 3번이 추가 되는것을 볼수 있습니다.

비트가 세팅되었는지 검사하는 연산자는 & 연산자 입니다. 아이템의 다른 인덱스의 비트의 세팅유무에 상관없이 0번 인덱스에 1로 세팅되어있으면 1이되고 0으로 세팅되었으면 0이됩니다. (C언어 에서는 모든 비트가 0일때 false) 그러므로 해당 검사 하려는 비트를 추출 하기 위해서는 비트 마스크 역할을 하는 & 연산자가 사용 됩니다.
위에 그림도 마찬가지로 3번째 인덱스의 세팅 값이 전체의 TRUE/FALSE를 결정하므로 3번째 인덱스의 세팅유무를 추출 할수 있습니다.

마지막 하이라이트인 비트 제거 입니다. 비트제거는 비트검사 루틴에다가 ~인 1의 보수를 적용하면 작성 할수 있습니다. 전체 아이템에서 ~을 취한 비트 마스크를 적용하면 기존 플래그는 그대로 내려오고 해당 플래그만이 제거 된것을 확인 할 수 있습니다.
이상으로 배열을 이용한 모델의 게임서버의 메모리량을 32분의 1로 혁신적으로 줄이고 속도도 향상 시킨 비트 필드 연산자의 활용법을 공부 했습니다.
하지만 이렇게 기능을 향상 시킨 프로그램도 치명적인 문제를 안고 있는데요? 그문제는 무엇일까요?
그 문제는 바로 INT는 정수 표기법 이므로 32bit 이상을 가질수 없고 그렇기 때문에 아이템을 32개 밖에 처리 할수 없다는 문제가 있습니다.
아주아주 치명적인 문제이지요..
게임서버에 아이템을 32개밖에 둘수 없다니....
메모리를 아무리 아끼면 머합니까? 사용할수 없는데....
그렇다고 여기서 포기 하면 안되겠지요? 그래서 우리의 선인들은 더욱도 놀라운 기법을 연구했는데요?
이 문제를 어떻게 해결할지 여러분도 고민해 보세요..
그럼 다음 강좌에 그 기법을 상세히 논의 해보도록 하지요...
무료 세미나를 진행 합니다.
주제 : C 포인터의 모든것
신청 : www.ioacademy.co.kr 참고

진수 바꾸기

질문자 인사 감사합니다. 덕분에 많이 알아갑니다.

#include <stdio.h>
typedef unsigned int UINT;

void print(UINT dec)
{
int i=0;
for(i=0; i < 32; i++) {
printf("%c", (dec & (0x01 << i))? '1':'0');
}
putchar('\n');
}

UINT dec2bit(UINT dec)

{
UINT bit = 0U;
while(dec) {
bit |= (0x01 << (dec % 10));
dec /= 10;
}

return bit;
}

int main()
{
UINT bit1 = dec2bit(1234U);
UINT bit2 = dec2bit(3456U);
UINT bit3 = bit1 | bit2;

print(bit1);
print(bit2); print(bit3);

getchar();
return 0;
}

2012년 3월 31일 토요일

아스키 코드

아스키코드는 위 약자풀이에서 보는 것과 같이 미국표준협회(ANSI)에서 제정된 것이다.
이것은 정보교환용 미국표준부호이며, 문자, 숫자, 특수문자에 수치(numberic Value)를 부여한 부호체계이다.

음... 쉽게 설명하자면 사전에 약속을 한다음 암호를 보내고 해독하는 과정을 생각하면 쉽게 이해되리라 생각한다. -_-

예를 들어서 대문자 'A'는 16진수로 '0x40'으로 약속되었으며
소문자 'a'는 16진수로 '0x61'로 약속되어 있다.




자세한 내용은 아스키코드 협회 홈페이지를 참조하세요.
링크 : http://www.asciitable.com/

이렇게 아스키코드는 16진수로 둘째자리까지 있어서
총 256개로 구성되어 있다 (0x00에서 0xFF까지)
그리하여 우리는 여기서 아스키코드는 8비트(bit)졌음을 알수 있고 고로, 1바이트(byte)로 이루어졌음을 알수 있다.

보통은 (0x00 에서 0x7F) 부분을 많이 사용하며...
그 이후의 문자들은 확장형이라고 해서 보통 유니코드를 아스키로 읽을때 볼수있는 괴상망측한 문자들로 구성되어 있다.





아스키코드는 본인의 업무상에서는 주로 하드웨어를 제어할때 많이 쓰이며,
그 경우 메세지 앞뒤로 제어문자들이 딸려오는 것이 특징이다.
아스키코드만으로는 세상모든 문자를 다 표현할 수 없어, 그리하여 어제 설명했던 유니코드를 만들어 다양한 전세계언어들을 넣을 수 있도록 하고 있다.

CS공부, 유용한 사이트

http://winapi.co.kr/

fopen() 옵션과 binary/text mode

fopen() 옵션 정리

fopen의 파일 열기 옵션은 좀처럼 제대로 외우기가 쉽지 않다. 또한 모든 옵션별 차이점을 제대로 파악하기도 쉽지 않고... 일단 파악된 만큼 정리해 놓고... 추후 더 발견된 사항이 있으면 지속적으로 update해 나가는게 좋을 듯..

"r" : 읽기 전용 모드. 파일이 없으면 NULL return.
"w" :쓰기 전용 모드. 파일이 없으면 생성되고 있으면 내용이 없어진다.
"a" : append모드. 파일이 없으면 생성. 이미 존재하는 파일 끝부분에 file pointer가 위치하게 되며 이 위치부터 뒷쪽으로만 write가능. 읽기는 불가능. fseek등으로 이 부분보다 앞으로 file pointer를 이동시키면 어떻게 될까 ? 아래 내용으로 봐서는 fseek등으로 file pointer를 이동하여도 이와 상관없이 파일 끝부분에 write가 되는 것으로 생각됨.

Opening a file in append mode (a in the mode) causes all subsequent writes to the file to be forced to the current end-of-file, regardless of previous calls to the fseek() function.
"r+" : 읽고 쓰기 모드, 파일이 없으면 NULL return.
"w+" : 읽고 쓰기 모드 단, 파일이 없으면 만들고 있으면 기존 내용을 지움. write를 먼저 한 후 동일 파일 포인터로 읽기 수행이 필요한 경우 사용. 보통은 읽기 전용, 혹은 쓰기 전용으로 fopen하므로 w+가 필요한 일은 별로 없을 듯.
"a+" : append모드, 읽고 쓰기 가능. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 추가된 내용을 쓴다. 읽기는 fseek로 지정한 file pointer위치에서 가능하나 쓰기는 파일 끝부분에서만 가능.

When a file is opened with update mode (+ in the mode), both input and output may be performed on the associated stream

[출처] http://dooeui.blogspot.com/2008/10/fopen.html



그리고 rb, rt 처럼 뒤에 b와 t는 :
b : binary
t : text 를 뜻 합니다.
b, t의 다른 점은 b로 파일을 쓸 경우 text에디터로 열면 알 수 없는 문자료 표기된다고 보시면 되고, t는 일반 text파일로 써 사람이 저장된 데이터를 읽을 수 있는 그대로 볼 수 있습니다.
물론 b로 파일을 저장했다면, 반드시 b모드로 파일을 읽어야만 합니다. text mode일 경우도 동일하고요.

즉, 각 설명은 아래와 같이 볼 수 있습니다.

a) "r"와 "rb"
- r : 오직 파일을 읽기 위해서 개방(해당 파일을 열기만 할 때)
- rb : 파일을 읽기 위해서 개방 그리고 2진모드(binary mode)로 하라

b) "rb" 와 "r+b"
- rb : 파일을 읽기 위해서 개방하는데 2진모드(binary mode)로 하라.
- r+b : 파일을 읽고 쓰기위해서 개방하는데 2진모드로 하라.

c) "w"와 "wb"
- w : 파일을 쓰기위해 개방(오직 쓰기)
- wb: 파일을 쓰기위해 개방하고 binary mode로 개방하라.

d)"ab"와 "a+b"
ab : w모드와 달리,지정해 준 파일이 존재하면 data를 지우지 않고 파일의 끝에서 부터 추가하고 binary mode로 한다.
a+b : 파일을 읽고 쓰기위해 개방하는데 지정해 준 파일이 존재 시 파일 끝에서 부터 데이터를 추가하며 binary mode로 한다.

출처 : 네이버지식인
[출처] fopen의 옵션들|작성자 남땡





바이너리(Binary) & 텍스트(Text) 파일의 차이

2010/04/23 11:32
'바이너리와 텍스트의 차이'를 검색하다 여기까지 찾아오셨다면 잘오셨습니다. 혹시 좀전에

"텍스트(text) 파일은 문자를 출력하는데 적합한... 어쩌고 저쩌고
...반면 바이너리(binary)는 그림이나 음악 파일을 저장하는데 적합합니다..."

이런 자료를 보셨다면 빨리 잊으십시오 =_=;;
적어도 개발자라면, 이런 컴퓨터 교양 서적 서두에나 적힐 법한 자료를 원하진 않을것입니다.

C언어든 아니든간에, 파일을 저장할 때 text mode와 binary mode를 구분하게 되어있습니다.
Windows OS 위에서의 애기지만요~ 어쨌든,

간단한 테스트를 위해 아래와 같이 문자열을 만들고 text mode와 binary mode로 저장해봅시다.

예) "안녕하세요? 어쩌구 저쩌구~..."

다음 메모장으로 읽어보죠.
둘 다 똑같죠?


아~ 똑같구나~ 해서 그냥 사용하면, 반드시 가까운 미래에 알 수 없는 버그와 함께 돌아옵니다.

좀 차이를 두기 위해 아래와 같이 코딩하고 파일을 비교해 봅시다.

void CMFCViewerDlg::OnBnClickedButton2()
{
int data[100];
for(int i=0; i<100; i++)
data[i] = i;
SaveFile("binary.log", (char*)data, sizeof(data), 1); // binary mode로 저장
SaveFile("text.log", (char*)data, sizeof(data), 0); // text mode로 저장
}

사용자 삽입 이미지
사용자 삽입 이미지


"똑같은 내용인데, 크기가 1바이트 다릅니다."

이것은 binary mode의 특정 캐릭터(charactor)가 text mode로 저장될 때 2byte로 저장되기 때문입니다. 바로 줄바꿈 캐릭터입니다. CR & LF 라 불리는 것들인데, UNIX, MAX, Windows 3인방에서 각각 줄바꿈을 다르게 사용하다보니 생긴 현상입니다.

어쨌든 text mode는 줄바꿈을 CRLF로 관리하는데, 여기서 CR은 0x0D 이고 LF는 0x0A 입니다.
그래서 위의 예제에서

"text mode로 저장하면 정수(integer) 0x10 이 LF로 인식되어 0x0A0D 로 변형저장 됩니다."
그래서 무턱대고 구조체나 배열 데이터를 text mode로 저장했다가 읽으면 알 수 없는 0x0D가 어디선가 튀어나오게 됩니다.

결론: 데이터를 저장할 때는 반드시 binary mode로 저장하는 습관을 가지세요 -*
출처:http://snbosoft.tistory.com/76








유닉스/리눅스

미국 벨(Bell) 연구소에서 개발된 소프트웨어 개발용의 운영 체제(OS). 유닉스는 1969년에 그 원형이 완성되었지만 1973년에 프로그램 대부분이 C 언어로 수정되었다. 이 때문에 이식성이 높아졌으며, 동시에 다중 사용자/다중 태스크의 실행을 지원할 수 있는 것을 특징으로 하는 대화형의 운영 체제이며, 텍스트 조작 툴, 문서 처리, 전자 메일 외에 취급이 쉬운 파일 시스템을 갖추고 있다. 당초에는 미니컴퓨터용이었지만 최근에는 퍼스널 컴퓨터범용 컴퓨터용의 유닉스도 개발되어 일반에게도 보급되기 시작했다. 최근에도 이러한 유닉스에 준한 기능을 갖춘 OS가 출현하였으며 이것을 유닉스라이크 OS(UNIX-like operating system)라고 한다.

출처
컴퓨터인터넷IT용어대사전, 전산용어사전편찬위원회 엮음, 2011, 일진사

유닉스








리눅스는 핀란드의 컴퓨터공학과 학생이던 리누스 토발즈(Linus Torvalds)가 만든 컴퓨터 운영체제(OS).

리누스 토발즈는 헬싱키대학에 재학중이던 시절 학교 수업중 교육용 유닉스(UNIX)인 미닉스(Minix)를 배우면서 보다나은 미닉스를 만들어보기 위해 취미삼아 운영체제를 만들기 시작했다.

그는 고가의 장비를 소유할 수 없는 처지였기에 대형 컴퓨터에서 사용하는 유닉스 소스 코드를 수정해 개인PC에서도 사용할 수 있는 공개 운영체제(OS)로 개발하고 자신의 이름을 따서 '리눅스 0.01 버전'으로 명명했다.

리누스는 리눅스의 소스코드를 공개했으며, 이를 바탕으로 수만명의 프로그래머들이 다양한 응용 프로그램을 내놓아 성능이 개선되고 있다. 리눅스 운영체제가 대표적으로, 누구나 무료로 이용할 수 있는데다 공개된 코드를 기반으로 프로그램을 마음대로 변형할 수도 있다.

리눅스는 오픈소스를 주장하는 소프트웨어 공유 운동단체인 GNU 프로젝트의 전폭적인 지원과 전세계 프로그래머의 참여하에 전세계 서버용 OS의 27%를 점유할 만큼 급성장했다.

'오픈소스'란 소프트웨어 등을 만들 때 해당 소프트웨어가 어떻게 만들어졌는지 알 수 있도록 일종의 프로그래밍 설계지도를 무료 공개, 배포하는 것.

리눅스는 결국 10년 만에 거대 소프트웨어 기업인 마이크로소프트(MS)를 위협하는 존재로까지 부각되기에 이르렀다.

한편 리눅스의 마스코트는 펭귄이다. 맛있게 식사를 마친 후 편안히 앉아있는 상태를 그린 것인데 이 펭귄을 디자인한 사람은 Larry Ewing이라는 사람이고 펭귄 이름은 Tux라고 한다

2012년 3월 21일 수요일

o/s 추가 개념

 process syncronization

동시에 여러개의 쓰레드가 동일한 자료를 접근하고 조작할 때 그 실행결과가 접근이 발생한 특정 순서에 의존하는 상황이 발생하는데 이로 부터 보호하기 위해 우리는 한순가에 단하나의 쓰레드만이 공유 변수를 조작할 수 있도록 보장해주어야 한다. 이러한 보장을 위해 쓰레드에 대한 동기화기 필요하다.


사운드 포지라는 음성 편집 프로그램을 열어 파일을 불러온다. 현재 그 파일은 winamp프로그램을 통해 현재 플레이 되고 있다고 해보자

결국 현재 음악 파일이 2개의 프로그램을 통해 불러진 상태 이때 사운드 포지 에서 편집을 하게 된다면 윈엠프에서 듣공 ㅣㅇㅆ는 음악 파일은 어떻게 디는 것일가
이런한 부분이 바로 프로세스 동기화가 필요한 부분이다.

이 문제는 많은 수의 접속자를 수용하는 서버에서는 더욱더 중요한 문제가 아닐 수 없다.

::임계 구역(critical section)::
프로세스 동기화를 위해 가장 먼저 알아야 할 개념이다.
각 쓰레드들(프로세스)은 각자의 임계구역을 갖는다. 이곳에서 쓰레드는 공통변수를 변경하고 테이블을 갱신하면 파일에 대한 쓰기 작업을 수행한다.


::동기화 작업의 필요조건 3가지::
1. 상호배제(mutual exclusion)
임의 한 쓰레드가 자신의 임계구역에서 실행되고 있다면 다른 쓰레드들은 그들의 임계구역에서 실행이 불가능 하다.(임계구역에는 하나의 쓰레드만 들어갈 수 있다.)

2. 진행(progress)
임계 구역에서 실행되고 있는 쓰레드가 없고 임계구역으로 진입코자 하는 쓰레드가 다루 사면

3. 한정된 대기(Bounded waiting)
쓰레드의 Starvation을 예방코자 임의의 한 쓰레드가 임계구역에 진입요청을 한 후 다른 쓰레드들이 임계 구역에 진입하도록 허용되는 횟수에 한계를 둠(어느정도 대기를 하면 임계 구역에 들어갈 수 있도록 보장을 해줘야 함)

출처:http://cafe.naver.com/geekerproject.cafe

64비트, 32비트

윈7 64비트에서는 기존의 VISTA나 XP의 기본적인 "Program Files"폴더가 "Program Files(x86)" 으로 변경되어지고 64bit 어플리케이션만 " Program Files"에 설치가 됩니다.

기본적으로는 동일하지만 차이점은 있는 것이지요.