Sunday, January 30, 2011

파이썬 문서고

TCP/IP 소켓 프로그래밍 책을 보다가 너무 지겨워서.. 웹 서핑.. 그러다가 음.. python의 실력을 늘리기 위한 책 없을까라고 뒤지다가 찾게된 사이트. 보아하니 파이썬을 잘 아는 이가 원서를 번역한 사이트인듯. 요즘 느끼는게.. 내가 영어 진짜 못한다다. 아.. 아무리 책이 쉽게 씌여 있어도 한글로 된 책 읽느니만 못하다. 아쉽다. 원서를 읽으면 속도가 한참 반감되는 내자신이. 여튼 한풀이는 이정도로 하고 목표는 틈나는 대로 아래 사이트 뒤적 거리고 한 강좌씩 읽기다.
http://coreapython.hosting.paran.com/pygnudoc.html

예전에 찾은 것인데 이것도 혹시나 해서 붙여 놓는다 
django 설명
http://www.hannal.net/think/01-python_django_lecture/

chapter 12 (IO 멀티플렉싱(Multiplexing))

-IO 멀티플렉싱 기반의 서버-
멀티프로세스 서버의 단점과 대안
멀티프로세스 서버의 단점 : 프로세스 생성에 많은 양의 연산, 메모리 공간 요구. IPC (inner process communcation) 방법도 복잡하다.
멀티플렉싱이라는 단어의 이해
그럼 멀티프로세스의 해결방법은 무엇인가? IO 멀티플렉싱 서버가 그 답이 될수 있다.
그럼 멀티 플렉싱이란 뭐냐? 이건 책의 그림을 보아야 할듯. 말로 하자면.. 책보자. 사전적으로 이야기 하자면 하나의 통신채널을 통해서 둘 이상의 데이터(시그널)를 전송하는데 사용되는 기술
멀티플렉싱의 개념을 서버에 적용하기
하나의 프로세스를 이용해서 둘 이상의 클라이언트에게 서비스를 제공하는 방법인데..
IO 멀티플렉싱 서버에서는 하나의 프로세스가 데이터가 수신된 소켓이 있는지 확인하고 그 소켓을 통해서 전송된 데이터를 수신하게 된다.

-select 함수의 이해와 서버의 구현-
select 함수를 이용하는 것이 멀티플렉싱 서버의 구현에 대표적인 방법이다.
select 함수의 기능과 호출순서
select 함수를 이용하면 한곳에 여러 개의 파일 디스크립터를 모아놓고 동시에 다음을 관찰할 수 있다.
관찰 항목(event) :
1.수신한 데이터를 지니고 있는 소켓이 존재 하는가?
2.블로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인가?
3.예외사항이 발생한 소켓은 무엇인가?
이와 같은 관찰 항목을 이벤트(event) 라고 한다. 관찰 항목에 속하는 상황이 발생 하였을때 이를 이벤트가 발생하였다라고 표현한다.
select 함수의 사용이 상당히 복잡한데 이를 정리하면 다음과 같다.
step1 : 파일 디스크립터의 설정, 검사의 범위 지정, 타임아웃의 설정
step2 : select 함수의 호출
step3 : 호출결과 확인
파일 디스크립터의 설정
select함수가 여러개의 파일 디스크립터를 동시에 관찰 할수 있기 때문에(곧 여러 소켓을 동시에 관찰) 우선 파일 디스크립터를 모아야 한다. 모을때도 이벤트(관찰 항목; 수신, 전송, 예외)에 따라 구분해서 모아야 한다.
이 파일 디스크립터는 fd_set이라는 구조체에 모으는데 비트단위로 이뤄진 배열이라고 생각하면 된다.그러니까 첫번째 배열의 값 (index 0인 값)은 0번의 파일 디스크립터를 의미하고 이것이 1이면 관찰 대상에 있는 파일 디스크립터라는 의미이다. select 함수 이후 변화가 없는 파일디스크립터의 fd_set 구조체의 1은 0이 된다. 그래서 select 후 여전히 1값을 갖는 fd_set 구조체의 component를 찾으면 그것이 관심있는 변화가 생긴 파일 디스크립터이다.
검사(관찰)의 범위지저오가 타임아웃의 설정
select는 함수는 다음과 같다. int select(int maxfd, fd_set *readset, fd_set *write_set, fd_set *exceptset, const struct timeval * timeout); 형태로 오류시 -1 timeout 지정시간보다 시간이 지났는데 변화가 있는 fd_set이 없으면 0을 변화가 있으면 변화된 파일 디스크립터의 수를 리턴한다.
select 함수호출 이후의 결과확인
최종! select 함수를 호출하는 예제의 확인
멀티플렉싱 서버의 구현
전체적으로 select 를 이용한 멀티플랙싱을 들여다보니, 이게 어떻게 진행되는거냐 하면 우선은 프로세스가 하나이고 전에는 한 프로세스가 하나의 파일 디스크립터만을 감당했는데, 이제는 fd_set이라는 구조체를 이용해서 파일디스크립터들을 fd_set 구조체에 묶고 fd_set을 하나하나 for문으로 들여다 보면서 관심 대상의 변화가 있는 파일디스크립터를 골라내서 특정 작업을 하는 것이다.

chapter 11 (프로세스간 통신(Inner Process Communication))

-프로세스간 통신의 기본 개념-
프로세스간 통신의 기본 이해 
예를 들어 프로세스 A가 프로세스 B의 특정 변수를 통해서 프로세스 B의 상태 내지는 값을 알려고 할때 이것이 프로세스 간의 통신다. 그런데 fork 함수를 통해서 프로세스를 생성하게 되면 부모 프로세스의 내용을 새로운 메모리 공간에 복사 하기 때문에 두 프로세스 간에는 공유하는 메모리 공간이 없기 때문에 두 프로세스 간에 통신이 이루어 지기 위해서는 별도의 방법이 필요하다.
파이프(PIPE) 기반의 프로세스간 통신
이렇듯 두 프로세스가 통신하기 위해서는 파이프 라는 것을 생성해야 한다. 이는 운영체제의 자원, 즉 메모리 공간으로 fork에 의해 복사 되는 것이 아니다(다만 그 파이프를 의미하는 파일 디스크립터가 복사 된다). 이 파이프 생성 함수로 int pipe(int filedes[2]); 가 있으며 int형 배열 filedes에 [0]인자를 파이프의 출구에 해당하는 파일 디스크립터가 [1]에는 입구에 해당하는 파일 디스크립터가 저장된다. 이 파이프를 이용해서 두 프로세스간에 통신이 가능하다.
파이프 기반의 프로세스간 양방향 통신
*책의 예제를 반드시 살펴라. pipe 사용시 주의 해야 할 점이 코딩되어 있다. 
파이프 하나를 놓고 두 프로세스에서 통신할때 두 프로세스 모두 read write 함수를 호출해서 pipe에다가 메시지를 주고 받을때, 코딩에 따라 자기가 보낸 메시지를 자기가 받는 경우가 생긴다. (책의 예제를 보게 되면 알게 되는 점이 부모 프로세스가 끝나면 자식 프로세스의 실행 코드의 유무에 상관없이 명령 프롬프트로 돌아오게 된다. 또 하나 A라는 프로세스에서 read를 호출하기 전에 B라는 프로세스에서 write가 호출되어야 파이프에 B에서의 메시지가 써져서 A 프로세스에서 읽혀지게 되는데 write 함수가 호출되기전에 read함수가 호출되면 어떻게 되나 생각이되는데 이는 read가 함수가 pipe의 내용을 읽을때까지 대기하게 된다.) 그럼 자기가 보낸 메시지를 자기가 받지 않고 반드시 상대방이 받게 하는 방법은 두개의 파이프를 사용하는 것이다.

-프로세스간 통신의 적용-
메시지를 저장하는 형태의 에코 서버
무엇인가 더 큰걸 만들어보고 싶다면