티스토리 뷰

씨언어 cafe에 올렸던 질문과 답



fork()(multi process) 와 thread (multi thread) 두 방법의 효율성 질문입니다..^^




질문 제목 : fork()(multi process) 와 thread (multi thread) 두 방법의 효율성 질문입니다..^^

 

 

질문 요약 : TCP 소켓통신중 여러(약 1,000개 이상)의 Client 를 수용하는 program을 작성할때 더 효율적인 방안은 무엇일까요?

 

 

질문 내용 :  


안녕하세요..^^

현재 C를 이용한 TCP 소켓 Server 프로그램 작업중에 있습니다.


현재 제가 짜는 프로그램은 multi thread를 이용하여, Client의 요청이 들어오면 Thread를 하나 생성하여 작업공간을 부여한 뒤, 

작업을 처리하게 두고, Main program은 다시 accept 상태로 돌아가 다른 Client의 요청을 기다리는 일을 하고 있는데요.


이게 생각보다 변수공유 문제가 조금 있는것 같더라구요..어디부터 꼬인건진 모르겠지만, Thread가 생성되면 생성될수록 프로그램이 조금씩 오동작 하는것처럼 보입니다.


그래서, fork 를 이용한 멀티 프로세싱(?) 방식을 조금 이용해 볼까 하는데요~

워낙 C 언어 지식이 짧은지라, 이곳에 질문을 올리게 되었습니다.


만일 위 상황에서 thread가 fork 방식으로만 변경된다고 하면 어떤 문제점이 있을까 예상해 보았습니다.


1. 한개의 Port로 들어오는 여러개의 요청을 처리할 수 있는가?

   (즉, 여러대의 자식 process들이 하나의 port에서 작업처리가 가능한지..)


2. fork를 이용하였을 때, 변수등의 문제점에서 완벽하게 자유로운가?


이 부분에 대해서 어떻게 생각하시는지.. 

C언어 선배님들의 고견을 듣고싶습니다..^^


참, 하나만 더 추가로 질문을 드리자면, 


3. 보통의(그러니까 일반적인..) TCP 서버 프로그램에서는 멀티 스레딩/멀티 프로세싱 어떤 기법을 이용하여 구현하는지 궁금합니다....ㅎㅎ


질문들이 너무 길었네요..

연말 즐겁게들 보내시구요, 

대한민국 프로그래머들 화이팅입니다..^^

\



=============================

답변 



멀티쓰레드는 같은 가상메모리 공간에서 구동되므로 데이터 공유가 자유로운 장점이 있지만, 그래서 동기화 문제에 더 신경을 써야되는 단점이 있습니다. 멀티프로세스는 서로 다른 가상메모리 공간에서 구동되므로 데이터 공유가 불편하지만, 동기화에 아무 신경을 안써도 된다는 장점이 있죠. 단, 멀티프로세스라도 데이터 공유를 하기 시작하면 동기화 문제는 피할 수 없습니다.

1. 그냥은 안되고, descriptor를 clone하는 기법을 써야됩니다.

2. 완벽하게 자유롭지만, 프로세스간 데이터를 공유해야 하는 상황이면 멀티쓰레드와 동일한 문제를 갖습니다.

3. 정석적인 방법은 쓰레드풀(Thread Pool)과 비동기 입출력을 이용합니다. 이는 데이터 공유 문제 때문이 아니고, 극한의 성능을 뽑아내기 위해서입니다. 따라서 데이터 공유시에 발생하는 동기화 문제는 여전히 프로그래머가 알아서 해결해야되는 문제로 남습니다.

뮤텍스, 세마포어, 크리티컬섹션 등 운영체제가 제공하는 동기화 수단들을 이용해보세요.



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함