Article::그의 공간

성공과 실패를 결정하는 1%의 프로그래밍 원리_1부정리

정리 습관(★arranging★) 2008. 12. 9. 01:54

성공과 실패를 결정하는 1%의 프로그래밍 원리

 

1. cpu를 알면 프로그래밍이 보여요

2. 컴퓨터는 2진수만 사용한다구요

3. 컴퓨터도 계산을 잘못할수 있다.

4. 네모난 메모리를 동그랗게 사용하자

-리틀엔디안 빅엔디안

5. 메모리와 디스크의 친밀한 관계

6 데이터 압축의 비밀을 파혜쳐라

1. cpu를 알면 프로그래밍이 보여요

문제 :

프로그램이란 ? ( 일련의 작업과정 ) 프로그램에 포함된 것은? ( 데이터와 명령어)

실행중인 프로그램이 저장되는곳은 (메모리) cpu란? (컴퓨터를 구성하는 부품 명령어에 따라 데이터의 연산과 제어를 함)

※프로그램의 실행은 ? (클럭(물리) , 프로그램카운터가 책임진다. PC)

※프로그램은 순차진행, 조건분기, 반복 세가지의 과정을 거친다.

-조건분기 및 반복에 사용되는 점프는 레지스트리 프래그로 가능하다.

※스택 : 푸쉬 팝 lifo

※베이스 레지스터와 인덱스레지스터 : 배열을 만들 때 사용한다.

※cpu가 하는 일은 : 데이터전송명령어, 연산명령어, 점프명령어, 호출/리턴 명령어

2. 컴퓨터는 2진수만 사용한다구요

문제:

비트 바이트 8비트 1바이트 <<2 = x2 >>2= /2

산술 쉬프트 논리 쉬프트

3. 컴퓨터도 계산을 잘못할수 있다.

문제:

2진수의 0.1을 10진수로 나타내면 0.5 그럼 10진수 0.1을 2진수로 나타내묜?

부동소수 형식 이란 ( 소수를 부호, 가수, 기수, 지수의 4부분으로 나누어표현)

부호비트를 사용하지 않고 음수를 나타내는 방법은?(엑세스방식)

※0.1->2진수로 만들기가 정확하지 않은 이유

2^-1, 2^-2, 2^-3, 2^-4 ... 의 수로 정확하게 1을 만들어 내지 못하므로

예방법 - 무시 하거나 , 정수형으로 계산하거나

4. 네모난 메모리를 동그랗게 사용하자

문제:

어드레스 지정을 위해 10개의 핀을 가진 메모리 IC의 경우 지정할 수 있는 어드레스의 범위는 2^10

short는 2바이트 31비트 환경에서 포인터는 4바이트 실제 메모리처리단위는 1바이트

바이너리 서치트리 왼쪽은 작고 오른쪽은 크게

 

 

※리틀엔디안 빅엔디안

엔디안 모든 플랫폼(유닉스, 리눅스, 윈도우)에서 공통적으로 binary파일을 읽고 쓰고 하고 싶습니다. 즉, double, int, char 등으로 이루어진 binary 파일을 여러가지 플랫폼에서 작성하고 그 파일을 window에서 읽을 수 있게 하고 싶습니다. 그런데 리틀엔디안, 빅엔디안 이란 것때문에 그게 쉽지만은 않은 작업같더군요. 1) 각 시스템에 해당 시스템이 어떤 엔디안인지 알 수 있는 API함수같은 것이 있는지요? 2) 제가 간단히 테스트해본 바로는 int나 캐릭터는 리틀엔디안/빅엔디안의 영향을 받지만 double은 상관없는 것 같더군요. (자신은 없습니다. -_-; 한달쯤 전에 아주 간단히만 체크해본 거라서.) 어떤 데이터 타입이 리틀/빅엔디안의 영향을 받는 지 알 수 있을까요? 3) 제가 생각하는 것은 예를 들어 무조건 '리틀엔디안'으로만 파일에 쓰이도록 하는 방식을 생각하고 있습니다. 혹시 더 좋은 방법이 있을런지요? 4) 더불어 예전에 올렸던 질문글에서 한 분이 다음과 같은 방식을 알려주시더군요. 다음 매크로를 쓰려고 합니다. 

코드:

#if LITTLE_ENDIAN #    define Swap32LE(x) (x) #    define Swap32BE(x) ((((x) &0xff000000) >> 24) | (((x) &0xff0000) >> 8) | (((x) &0xff00) <<8) | (((x) &0xff) <<24)) #else #    define Swap32LE(x) ((((x) &0xff000000) >> 24) | (((x) &0xff0000) >> 8) | (((x) &0xff00) <<8) | (((x) &0xff) <<24)) #    define Swap32BE(x) (x) #endif

 

 

체스맨

 

1. 어떤 엔디안인지 파악하는 방법은 (1) 컴파일러 또는 시스템 고유의 매크로가 정의되어있는지 판단하는 방법 : 예를 들어 __sparc__ 가 정의되어 있다면 big endian (2) 실시간에 판단하는 방법 : 

코드:

union {     short i2;     char  i1[2]; } val; val.i2 = 0x0102; if( i1[0]==0x02 ) little_endian(); else big_endian(); 

2. 2바이트 이상의 값이면 모두 엔디안의 영향을 받습니다. 그러므로, double 도 예외가 아닙니다. 3. 무조건 고정된 엔디안을 사용하는 것보다는 선택할 수 있게 하는 게 더 좋겠죠. 제 경우는 읽어올 때 : 입력측 엔디안을 지정해서 시스템 엔디안으로 변경 쓸 때 : 출력측 엔디안을 지정해서 시스템 엔디안을 출력측 엔디안으로 변경 하는 입출력 함수를 새로 정의했습니다. coral.kldp.net 라이브러리에 정의되어 있는 함수입니다. 

 

※ 포인터

4바이트 읽는 양을 선언하는건 자료형

※스택과 큐

LIFO , FIFO

링 버퍼 ( 링처럼 돌아가면서 입출력을 처리 )입력과 출력간에 일정시간을 둠

※리스트

삽입 삭제시 배열처럼 한번에 많은 이동을 안해도 돼서 빠르다.

삭제시 삭제할 항이 가진 다음요소 항목을 그전 요소가 가져가 바로 그요소를 건너뛰는 것으로 삭제함 추가시 마지막에 있는 요소의 다음 요소항목에 비어있는 배열을 향하기 전의 요소항목을 넣어주고 새로추가된 항목에 추가될 마지막 항목의 값을 준다.

 

※바이너리 서치 트리

리스트의 업그레이드

좌우로 나눈다 큰데이터와 작은 데이터로 배열에 두 개의 포인터를 둔다 하나는 왼쪽요서 작은쪽요서 또다른 하나는 큰쪽요소

5. 메모리와 디스크의 친밀한 관계

문제:

내장프로그래밍은 폰노이만의 작품

캐쉬메모리는(속도를 빠르게해주는 주메모리의 보조메모리)

가상메모리(디스크의 일부를 가상의 메모리처럼 사용하는 것)

DLL(프로그램실행시 동적으로 결합되는 함수나 데이터를 기록한 파일)

C에서 스택 클린업이란( 스택영역을 사용해서 함수의 매개변수를 주고 받는 것을 말함)

1클러스터는 윈도우에서(512바이트)

 

※프로그램은 디스크 ->메모리->CPU순으로 진행된다.

※캐시 (system.ini : 윈도우가 시작될 때 기본적으로 메모리를 적재하는 프로그램과 파일 , 폰트 드라이버등에 대한 정보를 가지고 있다 이를 더세분화 한건 win.ini)

 

※가상 메모리 : 세그먼트 방식, 페이징 방식

윈도우는 페이징 방식 - 페이지의 크기가 작을 수록 페이징 테이블의 크기가 커짐

페이지의 크기가 줄어들면 내부 단편화 문제가 줄어든다.

※DLL : 동적 링크파일 메모리 절약 현재는 컴포넌트로 시스템에 독립적이다.

※_stdcall 스택 청소과정을 담당 시키는 것 일종의 가비지 컬렉션

6 데이터 압축의 비밀을 파혜쳐라

문제 :

파일기록단위 1바이트

압축의 방법 : 런 렝스 코딩, 허프만코드

무손실 압축과 손실압축 : 복구가능여부

※허프만코드는 빈도수가 적은건 긴코드 빈도수가 많은건 짧은 코드를 사용한다.

이는 분석을 통해 코드를 만들며 코드의 체계를 허프만 트리로 작성한다. 출현 빈도수에 따라 내림차순 정열을 하고 빈도수가 적은 항목부터 바이너리 트리를 작성해 나가고 이를 이용해 최상위에서 빈도수가 많은 쪽이 0즉 왼쪽이 0 오른쪽은 1으로 정하여 코드를 만들어 낸다.

처음으로