폰 노이만 아키텍쳐

Posted 2012. 10. 16. 18:19

1. 컴퓨터 아키텍처의 기본

컴퓨터는 크게 입력,연산,저장,출력 장치로 나눌수 있다.

입력/출력 장치는 말 그대로 키보드 모니터 같은 거고

연상장치와 저장장치는 주로 Computer Architecture에서 다룬다.


2. 폰 노이만 아키텍쳐 , 하바드 아키텍쳐

둘다 Stored Program Concept를 따르는 아키텍쳐다.

Stored Program Concept란

1 + 1 = 2 라는 계산을 컴퓨터로 한다면

1. Fetch : 1 + 1 을 해 달라고 컴퓨터 에게 입력한다.

2. Decode : 컴퓨터는 받은 명령을 해석한다.

3. Execute : 컴퓨터는 1과 1을 더해 2를 만들어 낸다.

4. Store : 결과를 보여준다.

이런 순서를 반복하는것.

이런 Stored Program Concept를 Von Neumann(폰 노이만) 박사가 1945년 제안하였고

현재 가장 많이 사용하고 있다. 이런 Stored P..... 를 사용한 구조를 폰 노이만 아키텍처라 한다.

여기서. 데이터는 메모리에서 읽거나 메모리에 쓰기도 하는 반면..

명령어는 메모리에서 읽기만 하는 구조가 폰 노이만 아키텍처다.

특징은 프로세서에게 메모리 특정 지점부터 실행하도록 지시 할 수 있다.

이때 데이터와 명령어 사이에 뚜렷한 구분이 없어서 주어진 내용을 무조건 실행한다.

데이터 자체에 고유 의미가 없고 이를 해석하는 프로그램에 의해 의미가 달라진다.

데이터와 명령어는 메모리를 공유하며 특정 프로그램에서 명령어인 내용은 다른 프로그램에서

데이터 일수 있다.



하바드 아키텍처

명령어와 데이터 통로를 저장공간과 물리적으로 분리한 아키텍처를 말한다.

폰 노이만 아키텍처와 다르게 CPU는 메모리로부터 명령어를 읽거나 데이터를 읽고쓰고가 동시에 가능

하다. 그러나 명령어와 데이터 같은 신호 통로와 메모리를 동시에 사용하지 않는다.

하바드 아키텍처 컴퓨터에서는 CPU는 메모리로부터 명령어와 데이터를 동시에 사용할수 있고

현재 명령을 마치는것과 동시에 다음 명령을 가져 올 수 있기 때문에 속도가 더 빠르다.

하지만.. 가격이 더 비싸다던데..



뭐.. 1~4번을 하나의 싸이클로 보면

1~4번 작업이 끝날때 하나의 결과를 받을 것이다.

작업이 다 끝나야 다음 작업이 실행되고..

결국 작업 중인 번호 외엔 놀고있는거다.

이 놀고있는 시간이 무언가 다른 작업을 하면서 속도를 올리는게 파이프라이닝 이란것..

즉 겹치지 않는 곳에서 할일을 하는것이다.


폰 노이만 : 중앙처리장치 중심의 구조로 중앙집권식 명령처리. 데이터메모리와 프로그램 메모리가 구분되어있지않고 하나를 가지는 구조


하버드 아키텍처 : 중앙처리장치 없는 병렬식 구조. 지방분권식 명령처리.

데이터 메모리와 프로그램 메모리가 서로 다른 버스를 사용하는 구조로 명령과 데이터를

동시에 읽어 들일 수 있다.

Socket의 옵션

Posted 2012. 10. 16. 16:15

1. SO_RCVBUF, SO_SNDBUF

이 옵션은 TCP의 소켓 옵션에 해당한다.

이 옵션을 설정하면 커널의 송/수신 버퍼의 크기를 조정 할 수 있다.

(커널 : 운영체재의 핵심부분으로 메모리에 상주하면서 시스템에 존재하는 자원을 관리한다)

응용프로그램이 원격지로 전송하는 자료는 일단 송신버퍼에 복사되어 있다가

원격지의 수신버퍼로 전송된다. 수신버퍼는 전송받은 자료를 응용프로그램이 읽어갈때까지 보관한다.

수신버퍼의 크기가 작으면 버퍼외의 자료를 수신측에서 모두 버려진다.

TCP에선 흐름제어를 통해 connect함수나 listen함수의 연결준비 단계에서 수신버퍼의 크기를

기준으로 송수신 버퍼값을 설정한다. 하지만 그렇다 하더라도 커널이 그대로 적용하지 않고

값을 참조한뒤 커널의 정책에 따라 버퍼의 크기를 결정한다.

즉, 적용한 버퍼의 값이 실제로 적용되지 않을 수 있다.




2. SO_REUSEADDR

이 옵션은 커널이 소켓을 사용하는 중에도 계속해서 사용 할 수 있게 하는 옵션입니다.

커널이 소켓을 사용하게 되는건. 연결 종료 과정에서 먼저 연결 종료를 시작한 쪽은 상대방으로 부터

FIN패킷을 받고 FINM_ACK패킷을 전송한 후 일정시간동안 종료하지 않고 커널이 해당 소켓을

점유할 때를 말한다. 이렇게 먼저 종료를 시작하는 시스템은 응용프로그램이 종료를 하더라도

소켓은 커널에서 일정시간동안 점유중인 상태로 있게 된다. 이런 경우 응용프로그램을 재실행하면 

bind를 호출할때 아직 점유중인 포트를 연결하려는 시도 때문에 오류가 난다.

일정 시간이 지나면 다시 접속이 가능 하지만 온라인게임서비스에서 일정 시간을 딜레이하는건

다소 무리가 있다. 이럴때 이 옵션을 사용하면 점유중에서도 연결이 가능하게 해준다.


3. SO_LINGER

이 옵션은 close함수를 호출할때 송신버퍼의 자료가 모두 전송된 것인지 확인인 하지 않고 종료를 할

것인지 정하는 옵션이다. TIME_WAIT관련..




4. TCP_NODELAY

Nagle알고리즘에 관련된 옵션이다.

Nagle알고리즘은 가능하면 여러번 보내지 말고 한번에 많이 보내는 원칙을 기반으로 만들어진것.

그리고 ACK를 수신해야만 다음 전송을 진행한다.

TCP는 기본적으로 Nagle알고리즘이 적용되어 있다.

적은양을 모으다 보면 통신량은 줄어들지만 지연될 수 있는 단점이 있다.

또한 사용하지않고 마구 보내게되면 전송량이나 부하가 커진다.

그냥 끄고 스케쥴러 사용하자



Socket의 종료( closesocket )

Posted 2012. 10. 16. 15:13

소켓의 종료는 closesocket함수를 호출하면 종료 하게 된다.

하지만 단순히 closesocket만 호출하면 문제가 발생 할 수 있다.

그 문제가.. 온라인게임을 서비스 하는 입장이라면 단순하지 못한 문제..


closesocket를 호출 했을때 어떻게 종료가 되는지 흐름을 알아야 한다.

1. A가 B에게 연결 종료를 요청한다

2. B는 종료전 할 일이 남아있기 때문에 FIN를 보내지않고 ACK만 보내고 CLOSE_WAIT 상태로 넘어간다.

-> 할 일이란. 송(수)신버퍼상 남아있는 데이터를 모두 전송하는 작업임

3. 작업이 끝난 후 B는 FIN를 보내고 연결을 종료하고자 한다.

4. A는 B의 FIN을 잘 받았다는 ACK를 B에게 보내게 되고 A의 ACK를 받으면 B는 종료한다.

문제는 4번 과정에서 A는 ACK를 보내고 소켓이 제거될때까지 TIME_WAIT라는 상태에 있게 되는데

(약 4분)이 TIME_WAIT에 빠지는 이유는 A가 B로 보낸 마지막 종료 메세지 이후 바로 종료하면

라우터나 기타네트워크 상에서 발생하는 문제들에 의해 마지막 종료 메세지가 B에 도착 하지 못했을때

생긴다. 그러면 B는 종료하지 못하고 다시 A에게 마지막 FIN을 보내게 된다.

여기서 A가 TIME_WAIT가 아니라 강제종료된 상태라면 이 마지막 FIN역시 무시됬을테고 B는 여전히

A가 어떤상태인지 모르고 대기하게 된다.표준대기시간인 4분동안...


이게 무슨 문제냐면.. TCP규정상 TIME_WAIT상태일때 그 포트를 다른 프로세서가 이용하지 못하게

막아 두었다. 그래서 해당 소켓을 사용 하지 못하게 된다.


사용할수 있는 포트가 65535개나 되고 일정시간(약4분)이 지나면 사용 할 수 있게 되는데

이게 무슨 문제가 되겠냐.. 하면


로그인을 처리하는 로그인서버를 보면..

유저가 100만명인 게임이 잘 돌아가다가 예기치 못하게 서버 다운이 되었을 경우

서버를 재가동할때 100만명의 유저가 한번에 몰리게 된다.

이런경우 4분만에 포트를 다 소비하지 않는다고 장담 할 수가 없다..

이 같은 경우도 생각 해 두어야한다.


이럴때를 대비해 socket옵션에서 SO_LINGER를 사용해 대기없이 바로 종료하게 하면 된다.

간단히 끝날 문제를 대비해두자. 그냥 넘어갈 이유는 없다.

« PREV : 1 : ··· : 57 : 58 : 59 : 60 : 61 : 62 : 63 : ··· : 77 : NEXT »