phper 프로세스 스케줄링 전략, CPU 타임 슬라이스, 프로세스 제어(생성, 파괴, 재활용, 프로세스 신호) 및 프로세스 실행 흐름과 기본 프로세스 그룹, 신호 중단 원리, 프로세스 간의 관계를 이해하세요.
프로세스 통신:
익명 파이프, 명명된 파이프, 메시지 큐, 메모리 공유, 소켓 쌍. 코드를 직접 테스트하세요.
프로세스 스케줄링 알고리즘:
폴링, 무작위 배포, 점수판 등 전략은 다음과 같습니다. 우선 순위, 대기열 또는 스택 및 기타 기본 알고리즘을 생성하려면 [직접 사용하세요]
프로세스 풀:
TCP를 경험해 본 적이 있다면 여러 클라이언트를 처리하려면 다음이 필요하다는 것을 알아야 합니다. IO 다중화 기술 [이벤트 다중화기] 또는 다중 프로세스 및 다중 스레딩을 사용하려면 클라이언트가 올 때마다 프로세스 또는 스레드를 포크하므로 컨텍스트 전환 비용이 매우 높으므로 먼저 세트를 만듭니다. 프로세스 [프로세스 풀], 클라이언트가 연결할 때 특정 알고리즘 [우리가 사용하는 폴링]을 사용하여 작업을 전달할 프로세스를 선택합니다. 이러한 방식으로 앞뒤로 생성하고 삭제할 필요가 없습니다. 효율성을 향상시킵니다.
다음은 PHP 코드 버전의 구현입니다
<?php /** * Created by PhpStorm. * User: 1655664358@qq.com * Date: 2019/1/12 * Time: 16:18 */ $flag = 1; class process { public $pid; public $name; public $file; public $num; } class instance { public $processIdx; public $proc = []; public $processNum; } function sigHandler($sigNo) { global $flag; $flag = 0; echo "信号中断处理".PHP_EOL; } function processPool(instance &$instance,$num) { if (!$instance||$num==0){ fprintf(STDERR,"%s","参数错误"); return 1; } $instance->processIdx = 0; $instance->processNum = $num; pcntl_signal(SIGINT,'sigHandler'); pcntl_signal(SIGTERM,'sigHandler'); $process = new process(); for ($i=1;$i<=$num;$i++){ $instance->proc[$i] = clone $process; $instance->proc[$i]->file = $i; $instance->proc[$i]->pid = pcntl_fork(); $instance->processIdx = $i; if ($instance->proc[$i]->pid<0){ exit("进程创建失败"); } else if ($instance->proc[$i]->pid>0){ //nothing continue; }else{ worker($instance); } } master($instance); $exitProcess= []; while (1){ for ($i=1;$i<=$num;$i++){ //非阻塞方式回收子进程 pcntl_waitpid($instance->proc[$i]->pid,$status,WNOHANG); if ($status){ $exitProcess[] = $instance->proc[$i]->pid; fwrite(STDOUT,"worker#".$instance->proc[$i]->pid."-".$status,30); } } if (count($exitProcess)==$instance->processNum){ exit(0); } usleep(1000); } } //简单的轮询算法 自己可以用队列,随机,链表,栈链,二叉树啥的折腾 function roundRobin(&$instance,$roll) { /** @var instance $instance */ return $instance->proc[$roll%$instance->processNum+1]; } function master(&$instance) { /** @var instance $instance */ fprintf(STDOUT,"master 进程 %d\n",$instance->processIdx); global $flag; $roll = 0; while ($flag){ pcntl_signal_dispatch(); /** @var process $process */ $process = roundRobin($instance,$roll++); echo "轮询的进程:".$process->pid.PHP_EOL; $file = $process->file; posix_mkfifo($file,0666); $fd = fopen($file,"w"); fwrite($fd,"hi",2); sleep(1); } for ($i=1;$i<=$instance->processNum;$i++){ posix_kill($instance->proc[$i]->pid,9); } fprintf(STDOUT,"master shutdown %d\n",$instance->processIdx); } function getProcess(&$instance) { /** @var instance $instance */ return $instance->proc[$instance->processIdx]; } function worker(&$instance) { /** @var process $process */ $process = getProcess($instance); while (1){ $file = $process->file; posix_mkfifo($file,0666); $fd = fopen($file,"r"); $content = fread($fd,10); fprintf(STDOUT,"worker#%d读取的内容:%s file=%d\n",posix_getpid(),$content,$file); } exit(0); } $instance = new instance(); processPool($instance,5);
Effect
위 내용은 PHP 프로세스 풀과 폴링 스케줄링 알고리즘으로 멀티태스킹 실현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!