[Network 09. 27]04. Chapter4 Mulit Threaded Socket

2010. 9. 27. 21:59Network

쓰레드란? 일반적으로 프로그램은 위에서 아래로 내려가다보니 이거 다른걸 작업할려고 해도 하던 작업을 끝마쳐야지 작업을 할 수 있는 상황이 발생하는데 이를 해결하기 위해 쓰레드라는 개념을 이용한다. 프로세서는 일단 시피유마다 하나인 줄은 알것인데..요즘들어 뭐 듀얼이니 쿼드니 해서 프로세서를 늘리는게 요세 대세인듯 하다 하여튼 과거를 생각해서 쓰레드가 나왔으며 쓰레드는 여러개의 프로세스로 놔누기 위한 가벼운 프로세스라고 보면 된다.
스레드의 특징으로는 같은 프로세스내의 모든 스레드는 같은 메모리 공간을 공유 하며 프로세스는 스레드와 달리 자신만의 메모리 공간을 가진다.

Thread클래스
      - public Thread(ThreadStart)
      -public Thread(ParameterizedThreadStart)
      -public Thread(ThreadStart,int)
      -public Thread(ParameterizedThreadStart,int)
스레드를 생성하기 위해서는 스레드로 실행할 부분의 코드를 따로 분리하여 메서드로 구성해야 한다.
위의 스레드 생성자는 이 스레드 메서드에 대한 대리자를 인자로 가짐
마지막 두개의 생성자는 최대 스택 사이즈를 지정 할 수 잇는 정수형 인자를 가진다.

대리자

 대리자란 C나 C++에서의 함수 포인터와 같은 역활
 스레드메서드가 인자를 가지지 않는 경우 ThreadStart 대리자를 사용
 스레드 메서드가 인자를 가지는 경우 ParameterizedThreadStart 대리자를 사용

스레드 생성 및 시작(인자가 없을 때)
 void thread1()
{
}

void main()
{
        ThreadStart ts=new ThreadStart(thread1);
        Thread t=new Thread(ts);
         t.Start();
}

일단 쓰레드를 돌리기 위한 기준을 잡기위해 메소드 하나 만들고 그 후 주 흐름에서 ThreadStart 로 메소드의 인자를 만들어 준다.
Thread를 생성하여 ThreadStart에 만든 객체를 Thread의 인자값으로 만들어 준다.
마지막으로 쓰레드를 실행하기 위해 객체.Start()를 붙여준다. 위와 같은 방법으로 해도 되지만 간략화해서 ThreadStart없이 아래와 같이 해도 된다.
 Thread t= new Thread(thread1);
t.Start();

스레드 생성 및 시작(인자가 있을 때)
 void ParameterTh(Object data)
{
}

void Main()
{
        ObjectParam param=new ObjectParam();
        Thread t=new Thread(ParameterTh);
         t.Start(param);
}

쓰레드 동기화
Exclusive Lock
lock 블록을 이용 한 스레드가 락을 획득하면, 나머지 스레드는 차단
락이 해제될 때까지 대기
 lock (this)
{
      작업내용
}

Monitor
메서드 호출과 try finally 블록을 이용하여 락을 획득하고 해제
 Monitor.Enter(this);
       작업내용
 Monitor.Exit(this);

Mutual Exclusion
뮤텍스 알고리즘 이용
 mutex.WaitOne();
         작업내용
 mutex.ReleaseMutex();

리스너 소켓 프로세스 흐름

Tcp 소켓 리스너는 접속을 수락한 후 다시 리스닝 상태로 돌아간다.
  소켓을 종단점에 바인딩 한 후, 들어오는 요청에 대해 리스닝을 시작 
  클라이언트가 서버로 접속을 시도하면, 서버는 이요청을 수락하고 클라이언트와 통신을 하기 위한 새로운 소켓 객체를 생성 
  접속 수락후에 리스너 소켓은 다시 리스닝 상태로 돌아가서 또 다른 접속 요청을 대기
  단일 스레드 환경에서는 서버가 한 클라이언트의 요청을 처리하기에 바빠서 또 다른 요청을 처리할 수 있는 제어 방법을 가지고 있지 않음 그렇기에 한계를 극복하기 위해 멀티 스레드 소켓을 구현한다.

멀티 스레드 소켓
크게 두부분으로 나눠져 있으며 리스닝 부분이랑 접속후 수락하고 클라이언트와 통신하는 부분으로 나눠져 있다.

 클라이언트와 통신을 위해 소켓을 생성하여 통신을 처리하는 부분을 스레드 메서드로 구현
리스너는 접속 수락 후 클라이언트와의 통신을 위한 새로운 소켓을 생성한 후, 리스닝 상태에 또 다른 요청이 있을 경우 동인한 작업을 수행한다.

쓰레드로 향상된 에코 서버!!

첫째, 쓰레드와 소켓 클래스 선언하기
using System.Net.Sockets;
using System.Threading;

둘째, 쓰레드로 돌아갈 부분 만들기
 static void ClientHandler(Object socket)
{
         Socket client = (Socket)socket;
         IPEndPoint endpoint = (IPEndPoint)client;
         Console.WirteLine("{0} connected at port {1}",endpoint.Address,endpoint.Port);
         byte[] buffer=new byte[256];
         int byteRecv=0;
         string msg="";
         
         while(!msg.Equals(Exit))
         {
                  byteRecv=client.Receive(buffer);
                  msg=Encoding.Unicode.GetString(buffer,0,byteRecv);
                  Console.WriteLine("{0}:{1}>{2}",endpoint.Address,endpoint.Port,msg);
                  clinet.Send(buffer, byteRecv,SocketFlage.None);
         }
         client.Close();
}

셋째, 메인부분에 쓰레드 만들기
 TcpListener listener=null;
 listener=new TepListener(IPAddress.Any,8888);
 listener.Start();

 while(true)
 {
         Socket client=listener.AcceptSocket();
         Thread t= new Thread(ClientHandler);
         t.Start(client);
 }
listener.Stop();

'Network' 카테고리의 다른 글

[Network 11. 03]07. 졸업시험정리  (0) 2010.11.03
[Network 09. 28]05. Chapter5 UDP  (0) 2010.09.28
[Network 09. 27]03. Chapter3 TCP  (0) 2010.09.26
[Network 09. 26]02. Chapter2 Socket  (0) 2010.09.26
[Network 08. 31]01. Chapter1  (0) 2010.08.31