2016-06-24 3 views
1

이 질문이 열려 있거나 너무 막연한 것처럼 보일 경우 사과드립니다. 나는 최선의 C/Cpp 프로그래머가 아닙니다. 문제).서버 프로세스가 클라이언트 입력/메시지를 기다리는 가장 좋은 방법은 무엇입니까

두 개의 실행중인 프로세스, 클라이언트와 서버가 있다고 가정합니다 (이들은 제작자와 소비자로 볼 수도 있지만 여기서는 클라이언트와 서버가 더 좋을 수도 있습니다). 서버는 클라이언트의 "하위"(일종의, 아래 참조) 프로세스로서 다소 오프로드로 작동하도록 만들어졌습니다. 시간이 지남에 따라 클라이언트는 여러 작업을 생성 한 다음 생성 된 서버로 오프로드합니다. 작업에 따라 서버는 작업 완료에 대한 정보를 클라이언트에 다시 보내거나 보내지 않을 수 있습니다. 제쳐두고, 일부는 스레드로이 작업을 수행 할 수 있다고 제안 할 수도 있습니다. 내가 들어 가지 않을 이유 때문에 스레드가 여기에서 작동하지 않습니다. 클라이언트와 서버는 메모리를 공유하지 않아야합니다 (공유 메모리가있을 수도 있고 없을 수도 있습니다. 클라이언트와 서버가 서로 다른 두 가지 머신입니다. 필자가 작성한 코드는 두 가지 가능성을 모두 지원해야합니다).

서버의 초기화 기간이 매우 길어서 항상 실행 중이어야하므로 두 번째 프로세스가 서버가됩니다. 따라서 항상 클라이언트의 모든 메시지를 청취해야합니다. 간단한 의사 코드/C 예제가 아래에 나와 있습니다.

int main() { 
    ... 
    client_pid = getpid(); 
    pid = fork(); 
    if(pid > 0) { 
     /* sets up connection with client, based on what connection type has been 
     * given (shared memory, sockets, etc). I don't know anything 
     * about what type of connection is established only that all 
     * communication is handled by the wait_For_Jobs and generate_Jobs functions 
     */ 
     start_Server(client_pid, connection_type); 
     wait_For_Jobs(); 
    } else { 
     // gets information needed to send messages to server 
     contact_info = wait_for_connection(); 
     generate_Jobs(contact_info); 
    } 
} 

이것은 내가 원하는 것의 매우 개요입니다. 내가 가진 질문은 "wait_For_Jobs"함수와 관련이 있습니다. 불행히도 connection_type은 런타임까지 알 수 없기 때문에이 질문은 어떤 유형의 통신 방법 (예 : 공유 메모리, 소켓 등)에 따라 여러 가지 대답을 가질 수 있습니다. 간단히하기 위해 공유 메모리가 사용중인 통신 유형이라고 가정합니다 (부스트 프로세스 간). 이를 염두에두고, 서버가 클라이언트로부터의 입력을 기다리는 가장 효과적이고 효율적인 방법은 무엇입니까? 하나의 가능한 접근법은 while 루프를 다소 아래의 방식으로 사용하는 것입니다.

void wait_For_Jobs() { 
    while(true) { 
     if(check_If_Message_Received_Over_Shared_Memory){ 
      // handle message 
     } 
    } 
} 

그러나 이것은 매우 비효율적 일 것으로 생각됩니다. 프로세스는 항상 "바퀴를 돌리고"있습니다. 약간의 수정은 일정 기간 동안 while 루프가 끝날 때 프로세스를 "잠자기"상태로 만드는 것입니다. while 루프에서 코드를 실행하는 것만 큼 다른 것은 아닙니다 (실제로는 같은 것입니다). 응답 시간을 희생시키면서 리소스 사용량을 줄입니다. 이상적으로 프로세스는 대기 모드에 있어야하며 메시지를 받으면 컴퓨팅을 시작해야합니다. 그러나, 나는 C 또는 Cpp에서 그런 것을 어떻게 할 것인지 확신하지 못한다. 이를 염두에두고 더 나은 대안이 있습니까?

+0

* "가능한 클라이언트와 서버는 서로 다른 두 대의 컴퓨터입니다."* - 공유 메모리를 배제하는 것은 소켓의 관점에서 생각할 것입니다. – Galik

+0

런타임에 사물이 어떻게 실행되는지를 결정하는 if 문. 이를 통해 사용자는 하드웨어 사용자가 사용 가능할 경우 로컬로 실행할지 여부를 결정할 수 있습니다. 이 질문의 요점은 질문에서 위에서 언급 한 바와 같이 while 루프를 사용하지 않음으로써 연구 사용 (즉, CPU 사용률)을 낮출 수 있는지 여부입니다. 예를 들어 세마포어가 사용 되더라도 컴파일 된 코드의 어딘가에 while 루프가 존재할 것으로 생각됩니다. 문제는이 루프가 더 효율적인지 여부입니다. 안드로이드와 같은 시스템에서 OS는 프로세스가 잠자기 상태가 될 때 메시지를 보낼 때 깨울 수 있습니다. – Ryan

+0

C/CPP에서 이와 유사한 작업을 수행 할 수있는 경우 (기본적으로이 작업을 수행하는 대신 프로그램에서 OS에 요청할 수 있음) 비슷한 것) 그러면 세마포어보다 훨씬 효율적이라고 생각합니다. 사실, 세마포어는 기본적으로 자원 관리 및 할당에 사용됩니다. 활용도를 떨어 뜨리지 않습니다. – Ryan

답변

0

공유 메모리를 사용하는 경우 다른 요청이 표시 될 때 발생하는 세마포어를 차단해야합니다.

소켓을 사용하는 경우 수신 차단을 사용하십시오.

+0

네,하지만 세마포어를 계속 확인하지 않겠습니까? 즉, 개념적으로는 리소스 사용 측면에서 while 루프를 실행하는 것과 동일하지 않습니까? 차단 수신에 대해서도 마찬가지입니다. 특히, 세마포어를 차단해야한다면, 쓰는 실제 코드의 while 루프는 필요하지 않을 것입니다 (적어도 C/Cpp의 세마포어에는 익숙하지 않습니다.) 프로세스가 여전히 차단되었는지 확인하려면 코드가 컴파일 된 후 어딘가에 while 루프가 있어야한다고 생각합니다. – Ryan

+0

이 질문을하는 또 다른 방법은 세마포 또는 차단을 사용하여 성능이 향상되는지 여부입니다. ? – Ryan

+0

아니요 세마포 및 차단은 커널 *에서 블록 *을 읽으며 이벤트에 의해 깨우쳐집니다. 스핀 루프가 없습니다. 마지막 질문에 '성능 향상'이 무엇입니까? CPU 사용량 측면에서는 무엇입니까? – EJP

관련 문제