2010-06-03 4 views

답변

6

일반적으로 각 사용자는 페이지에 대한 HTTP 요청을 보냅니다. 서버는 요청을 받고 다른 작업자 (프로세스 또는 스레드)에게 위임합니다.

주어진 URL에 따라 서버는 파일을 읽고 다시 사용자에게 보냅니다. 파일이 PHP 파일과 같은 동적 파일 인 경우 파일은 사용자에게 다시 보내기 전에 실행됩니다.

요청한 파일을 다시 보내면 서버는 대개 몇 초 후에 연결을 닫습니다.

자세한 내용은 다음을 참조하십시오 HowStuffWorks Web Servers

0

아파치 2는 두가지의 다른 작동 모드를 가지고 있습니다. 하나는 threaded server으로 실행되고 다른 하나는 "프리 포크"(multiple processes)라는 모드를 사용합니다.

0

요청은 HTTP 데몬의 최상의 기능으로 동시에 처리됩니다.

일반적으로 HTTP 데몬은 여러 프로세스 또는 여러 스레드를 생성하고 각 스레드는 하나의 클라이언트 요청을 처리합니다. 서버는 예비 스레드/프로세스를 유지하여 클라이언트가 요청할 때 스레드/프로세스가 작성 될 때까지 기다릴 필요가 없도록 할 수 있습니다. 각 스레드/프로세스는 서로 다른 프로세서 또는 코어에 매핑되어보다 신속하게 처리 될 수 있습니다. 그러나 대부분의 경우 요구 사항은 원시 컴퓨팅의 부족이 아닌 네트워크 I/O이므로 한 번에 처리되는 요청 수보다 상당히 많은 수의 프로세서/코어를 갖기 때문에 속도가 느려지지는 않습니다.

2

HTTP는 을 사용합니다. 연결 기반 프로토콜 인입니다. 즉, 클라이언트는 서버와 통신하는 동안 TCP 연결을 설정합니다.

여러 클라이언트가 동일한 대상 컴퓨터의 동일한 대상 포트에 동시에 연결할 수 있습니다. 서버는 여러 동시 연결을 엽니 다.

Apache (및 대부분의 다른 HTTP 서버)에는 다중 처리 모듈 (MPM)이 있습니다. 아파치 스레드/프로세스를 할당하여 연결을 처리합니다. 그런 다음 이러한 프로세스 또는 스레드는 서로를 차단하지 않고 자체 연결에서 병렬로 실행할 수 있습니다. Apache의 MPM은 연결이 열려 있지 않은 경우에도 "예비"스레드 또는 프로세스를 열어 두는 경향이 있습니다. 이는 후속 요청의 속도를 높이는 데 도움이됩니다.

아파치와 함께 제공되는 ab (ApacheBench의 약자) 프로그램을 사용하면 HTTP 서버에 대한 여러 연결을 한 번에 열 때 어떤 일이 발생하는지 테스트 할 수 있습니다.

Apache의 구성 파일은 일반적으로 허용 할 동시 연결 수에 대한 제한을 설정합니다. 이는 정상 작동 중에는이 한계에 결코 도달하지 않도록 합리적인 숫자로 설정됩니다.

HTTP 프로토콜 (버전 1.1부터)을 사용하면 연결을 계속 열어 둘 수 있으므로 클라이언트는 연결을 닫기 전에 여러 HTTP 요청을 만들어 잠재적으로 동시 연결 수를 줄일 수 있습니다.아파치 기반 MPM

더 :

아파치와 상이한 다중 처리 모듈 (MPM)들을 사용할 수있다. Apache 1.x는 일반적으로 "prefork"라는 모듈을 사용했습니다.이 모듈은 들어오는 연결을 종종 기존 프로세스로 보낼 수 있도록 여러 Apache 프로세스를 미리 만듭니다. 이것은 위에서 설명한대로입니다.

Apache 2.x는 일반적으로 multithreading (단일 프로세스 내에서 여러 실행 스레드 실행)을 사용하는 "worker"라는 MPM을 사용합니다. 별도의 프로세스에 비해 멀티 스레딩의 장점은 별도의 프로세스를 여는 것보다 스레딩이 훨씬 가벼우 며 메모리를 조금만 사용할 수도 있다는 것입니다. 매우 빠릅니다.

멀티 스레딩의 단점은 mod_php와 같은 것을 실행할 수 없다는 것입니다. 멀티 스레딩을 할 때 모든 추가 기능 라이브러리는 "스레드 안전"이어야합니다. 즉, 다중 스레드 환경에서 실행되고 있음을 인식해야합니다. 멀티 스레드 응용 프로그램을 작성하는 것이 더 어렵습니다. 프로세스 내의 스레드는 이들 사이에 일부 메모리/리소스를 공유하기 때문에 다른 스레드가 스레드 쓰는 중일 때 스레드가 메모리를 읽거나 쓰는 경합 조건 버그가 쉽게 생성 될 수 있습니다. 이 문제를 해결하려면 locking과 같은 기술이 필요합니다. PHP에 내장 된 많은 라이브러리는 스레드로부터 안전하지 않으므로 mod_php를 사용하고자하는 사람들은 Apache의 "worker"MPM을 사용할 수 없습니다.

0

서버 (apache)는 멀티 스레드입니다. 즉 여러 프로그램을 동시에 실행할 수 있습니다. 몇 년 전, 단일 CPU가 여러 스레드간에 신속하게 앞뒤로 전환하여 한 번에 두 가지 일이 발생하고있는 것처럼 보였습니다. 요즘에는 컴퓨터에 여러 개의 프로세서가 있으므로 컴퓨터는 실제로 두 개의 코드 스레드를 동시에 실행할 수 있습니다. 즉, 스레드는 실제로 프로세서에 매핑되지 않습니다.

이 기능을 사용하면 PHP 프로그램을 단일 스레드로 간주 할 수 있습니다. 두 개의 요청이 동시에 서버에 도달하면 두 개의 스레드를 사용하여 동시에 요청을 처리 할 수 ​​있습니다. 아마 둘 다 같은 양의 CPU를 사용하게 될 것이므로 동일한 일을한다면 거의 동시에 완료 할 것입니다.

멀티 스레딩의 가장 일반적인 문제 중 하나는 "경쟁 조건"입니다. 두 요청이 동일한 리소스를 사용하는 경우 동일한 요청 (동일한 작업을 수행하기 위해 "경주")을 수행하는 곳 중 하나입니다. 그들은 승리 할 것이다. 둘 다 데이터베이스에 레코드를 삽입하면 둘 다 동일한 ID를 얻을 수 없으며 그 중 하나가 승리합니다. 따라서 다른 요청이 동시에 진행되고 있고 데이터베이스를 수정하거나 파일을 작성하거나 전역을 변경할 수있는 코드를 작성할 때는주의해야합니다.

프로그래밍 모델에서는 이러한 복잡성을 거의 무시할 수 있습니다.

관련 문제