본문 바로가기
IT/데이터베이스_네트워크

윤성우의 열혈 tcp/ip 소켓 프로그래밍 18장 연습문제 솔루션

by nutrient 2021. 5. 24.
728x90
728x170

 

 

정    답 1.
CPU의 실행시간을 프로세스가 고속으로 나누기 때문에 둘 이상의 프로세스가 동시에 실행 가능하다. 그리고 컨텍스트 스위칭이란, CPU에 의한 실행의 대상을 변경하는 과정에서 발생하는 준비과정으로써, 이전에 실행되던 프로세스의 데이터를 메모리 공간에서 내리고 이어서 실행될 프로세스의 데이터를 메모리 공간에 올리는 작업을 의미한다. 


정    답 2.
쓰레드 각각의 고유 데이터는 프로세스 각각의 고유 데이터보다 크기가 작다. 때문에 컨텍스트 스위칭의 과정에서 올리고 내릴 데이터의 크기가 그만큼 작으며, 이로 인해서 프로세스의 컨텍스트 스위칭보다 속도가 빠르다. 또한 모든 쓰레드는 스택을 제외한 나머지 메모리 공간을 공유하기 때문에 IPC와 같은 별도의 통신 기법을 필요로 하지 않는다. 

정    답 3.
프로세스는 운영체제 관점에서의 실행흐름을 의미하고, 쓰레드는 프로세스 내에서 구분되는 실행의 흐름을 의미한다. 

정    답 4.  b, c, d

정    답 5. d

정    답 6.
다음 두 함수 중 하나를 호출해서 명시적으로 쓰레드의 완전 소멸을 명시해야 한다. 
 pthread_join 함수의 호출
     pthread_detach 함수의 호출

정    답 8.
동기화를 하지 않으면 둘 이상의 쓰레드가 메모리 공간에 동시에 접근을 해서 문제를 일으킨다. 반면 동기화를 해버리면, 임계영역에 포함되어야 하는 read 함수의 호출문장으로 인해서 다른 클라이언트가 전송하는 문자열을 읽어 들이지 못하고 대기해야만 하는 상황이 벌어질 수 있다. 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <pthread.h>

#define BUF_SIZE 100
void * handle_clnt(void * arg);
void error_handling(char *buf);

char buf[BUF_SIZE];
pthread_mutex_t mutx;

int main(int argc, char *argv[])
{
	int serv_sock, clnt_sock;
	struct sockaddr_in serv_adr, clnt_adr;
	int clnt_adr_sz;
	pthread_t t_id;

	if(argc!=2) {
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}

	pthread_mutex_init(&mutx, NULL);
	serv_sock=socket(PF_INET, SOCK_STREAM, 0);
	memset(&serv_adr, 0, sizeof(serv_adr));
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_adr.sin_port=htons(atoi(argv[1]));
	
	if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1)
		error_handling("bind() error");
	if(listen(serv_sock, 5)==-1)
		error_handling("listen() error");

	while(1)
	{
		clnt_adr_sz=sizeof(clnt_adr);
		clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr,&clnt_adr_sz);
		pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock);
		pthread_detach(t_id);
		printf("Connected client IP: %s \n", inet_ntoa(clnt_adr.sin_addr));
	}

	close(serv_sock);
	return 0;
}

void * handle_clnt(void * arg)
{
	int clnt_sock=*((int*)arg);
	int str_len=0;
	
	while(1)
	{
		pthread_mutex_lock(&mutx);
		str_len=read(clnt_sock, buf, sizeof(buf));
		if(str_len<=0)
			break;
		else
			write(clnt_sock, buf, str_len);
		pthread_mutex_unlock(&mutx);
	}
	
	close(clnt_sock);
	return NULL;
}
void error_handling(char *buf)
{
	fputs(buf, stderr);
	fputc('\n', stderr);
	exit(1);
}
728x90
그리드형

댓글