본문 바로가기

공부/tcp/ip 프로그래밍

18장 멀티쓰레드 기반의 서버구현 하나의 cpu에서 함수를 동시에 실행한다는 것은 context switch이 자주 빠르게 일어난다는 의미 예) 쓰레드1 처리 도중-> 쓰레드1의 내용 저장 -> 쓰레드2를 처리 -> 쓰레드2를 처리를 완료하고 쓰레드1의 내용을 복원 -> 쓰레드1 처리완료 쓰레드 구조 쓰레드는 데이터 영역, 힙 영역, 코드 영역은 공유 하지만 스택영역은 각자 독립적으로 사용 코드영역: 프로그램의 실제 코드가 저장되어 있는 영역 스택영역 : 로컬변수, 함수에 호출에 관련된 정보, 임시데이터가 저장되는 영역 힙영역 : 동적 메모리 할당에 사용되는 영역 데이터영역 : 전역변수등의 데이터가 저장되는 영역 -D_REENTRANT(= 헤더파일 선언 이전에 매크로 _REENTRANT를 정의) 임계영역에서 동시호출시 문제가 발생할 수 .. 더보기
동기, 비동기, 블로킹, 논블로킹 [출처] 동기, 비동기, 블러킹, 논 블러킹 (C언어를 배우자) |작성자 bilope 1. 동기(同期, synchronous) 동기의 사전적 의미는 "동시에 발생하는 것" 입니다. 클라이언트가 서버에 "저 지금 접속했습니다." 라고 요청했다면, 서버가 "아 그래? 너 접속했구나? 너 접속했다고 해줄께." 라고 대답할 때까지 클라이언트가 무릎 꿇고 가만히 기다려야합니다. "이게 동시에 발생하는 것과 무슨 상관이 있지?" 라고 생각하시는 분들을 위해, 간단한 예를 들어 설명해드리겠습니다. 제가 고또님께 꼭 드릴 말씀이 있어 전화를 걸었습니다. 그런데 고또님이 전화를 받지 않으십니다. 저는 고또님이 전화를 받으실 때까지 계속 전화기를 붙잡고 기다립니다. 이 과정에서 저는 전화기를 붙잡고 기다리느라 아무런 행동.. 더보기
17장 select보다 나은 epoll 서버 설계구현방법 서버 모델 최소화(select, epoll, iopc, multi process) + 기능(받은 정보를 가지고 무엇을 어떻게 처리할 것인가? 예>echo) 구조체 1. struct book{ } a; 2. struct { } a; 3. Struct student{ }; typedef struct student student; student mystudent; 4. typedef struct { } software; software visual; 5. typedef union epoll_data{ } epoll_data_t; epoll_data_t data; select의 단점 1. 전체 파일디스크립터가 나타나는 배열에 생성되어 검사의 대상이 되는 파일디스크립터만 1로 표시하여 일일히 손.. 더보기
16장 입출력 스트림의 분리에 대한 나머지 이야기 Half-close 생성하기 위한 조건 1. 쓰기 스트림 삭제 2. EOF 전달 half-close를 하기 위한 방법1(실패) ※ 하나의 파일 디스크립터를 기반으로 입출력 파일 포인터 생성시 하나의 파일 포인터만 종료되어도 완전 종료된다. ※ 시스템 리소스(여기서는 소켓)는 가리키는 포인터 (여기서는 파일 디스크립터)가 없을 때 종료된다. half-close를 하기 위한 방법2(성공) 파일 디스크립터의 복사함수 #include int dup(int fildes); int dup2(int fildes, int fildes2); 성공시 복사된 파일 디스크립터, 실패시 -1 반환 fildes : 복사할 파일 디스크립터 전달 fildes : 명시적으로 지정할 파일 디스크립터의 정수 값 전달 fgets() EOF.. 더보기
15장 소켓과 표준 입출력 컴퓨터 시스템 구조 저수준 입출력 함수를 이용하기 위해 open함수를 이용함 Open함수는 파일 서술자를 반환 고수준 입출력 함수를 이용하기 위해 fopen함수를 이용함 fopen함수는 파일에 대한 구조체(파일에 대한 정보가 들어있음, 파일의 현재커서위치, 파일의 끝에 도달여부, 파일의 이름 등등)를 반환 저수준 입출력 함수는 파일 서술자(= 파일을 나타내는 숫자로 표현됨)를 이용 고수준 입출력 함수는 스트림을 이용, 스트림은 버퍼를 가지고 있음 파일 서술자나 파일에 대한 구조체는 파일을 찾아가기 위한 지도라고 생각해도 됨 파일이 어디에 있고 파일에 대한 설명을 가지고 있기 때문에 파일 서술자를 이용한 입출력은 파일 서술자가 나타내는 파일에서 정보를 보내거나 받아옴 스트림(=다리)를 이용한 입출력은 파일.. 더보기
14장 멀티캐스트 & 브로드캐스트 멀티캐스트(udp방식) 브로드캐스트(udp방식) TTL(time to live) int send_sock; int time_live = 64; send_sock = socket(PF_INET, SOCK_DGRAM, 0); //TTL의 설정과 관련된 프로토콜의 레벨은 IPPROTO_IP, 옵션의 이름은 IP_MULTICAST_TTL setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*) &time_live, sizeof(time_live)); TTL = 패킷을 얼마나 멀리 전달할 것인가 결정하는 요소 라우터를 하나 거칠 때마다 1씩 감소, 값이 0이 되면 패킷은 더 이상 전달되지 못하고 소멸 멀티캐스트 그룹으로의 가입 그룹가입과 관련된 프로토콜의 레벨은 .. 더보기
13장 다양한 입출력 함수들 send, recv함수 윈도우 = 리눅스 send함수 #include ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags); 성공시 전송된 바이트 수, 실패시 -1 반환 sockfd : 데이터 전송 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달 buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달 nbytes : 전송할 바이트 수 전달 flags : 데이터 전송시 적용할 다양한 옵션 정보 전달 recv함수 #include ssize_t recv(int sockfd, void* buf, size_t nbytes, intflags); 성공시 수신한 바이트 수(EOF전송시 0), 실패시 -1 반환 sockfd : 데이터 수신 .. 더보기
12장 IO멀티플렉싱 멀티프로세스구조 IO멀티플렉싱 select함수의 단점 1. 전체 파일디스크립터가 나타나는 배열에 생성되어 검사의 대상이 되는 파일디스크립터만 1로 표시하여 일일히 손으로 배열에 넣어 놓아야 함 2. 변화가 있는 파일디스크립터 뿐 아니라 변화가 없는 파일디스크립터까지 나타나 있는 배열을 받아서 일일히 for문을 통해서 1로 표시된 변화가 생긴 파일디스크립터가 무엇인지 찾아야 함 select 함수 fd_set형 변수에 값을 등록, 변경 등에 관한 함수 FD_ZERO(fd_set* fdset) 인자로 전달된 주소의 fd_set형 변수의 모든 비트를 0으로 초기화 FD_SET(int fd, fd_set* fdset) 매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보를 등록.. 더보기