3-4进程调度

pcntl_fork 创建了一个子进程,这个时候就会存在父进程和子进程,cpu先调度哪个进程? pcntl 封装了可以控制进程优先级的函数 pcntl_setpriority(setpriority),修改任意进程的优先级,pcntl_getpriority(getpriority)获取任意进程的优先级。 进程的观察命令:top top - 23:28:59 up 13:13, 1 user, load average: 0.30, 1.20, 1.61 任务: 386 total, 1 running, 385 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.8 us, 1.7 sy, 0.1 ni, 95.3 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st MiB Mem : 5855.6 total, 664.6 free, 3875.4 used, 1315.7 buff/cache MiB Swap: 976.0 total, 364.7 free, 611.3 used. 1379.6 avail Mem 进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 7305 wanger 20 0 4956504 454380 52432 S 4....

2022-03-05 · 王二

3-3进程exec

pcntl_exec 函数用来执行一个程序,它内部的系统调用是 execve 一般的用法是父进程先创建一个子进程,然后子进程调用这个函数,正文段(代码段)+ 数据段会被新程序替换,它的一些属性会继承父进程,PID并没有发生变化。 execve() executes the program referred to by pathname. This causes the program that is currently being run by the calling process to be replaced with a new program, with newly initialized stack, heap, and (initialized and uninitialized) data segments. pathname must be either a binary executable, or a script starting with a line of the form: #!interpreter [optional-arg] ——execve 示例: demo7.php <?php function showID($str) { $pid = posix_getpid(); fprintf( STDOUT, "%s pid=%d,ppid=%d,gpid=%d,sid=%d,uid=%d,gid=%d\n", $str, $pid, posix_getppid(), posix_getpgrp(), posix_getsid($pid), posix_getuid(), posix_getgid() ); } showID("parent:"); $pid = pcntl_fork(); if (0 == $pid) { pcntl_exec('/usr/bin/php', ['demo2....

2022-03-05 · 王二

3-2进程退出和回收

进程的退出 PHP 进程退出的几种情况 运行到最后一行语句 运行时遇到 return 运行时遇到 exit() 函数的时候 程序异常的时候 进程接收到中断信号 正常结束、异常结束(跟信号有关),不管以何种方式退出,都有一个终止状态码。 僵尸进程 僵尸进程(zombie process):指子进程已结束,但是父进程还没有使用 wait(pcntl_wait)/pcntl_waitpid(waitpid) 来回收。 进程结束时并不会真的退出,还会驻留在内存中,父进程需要通过 wait 「pcntl_wait」函数来获取进程的终止状态码,同时该函数会释放终止进程的内存空间。否则容易造成僵尸进程过多,占用大量内存空间。 wait 函数挂起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将被释放。关于 wait 在您系统上工作的详细规范请查看您系统的 wait(2)手册。 ——pcntl_wait 示例: <?php $pid = pcntl_fork(); if (0 === $pid) { fprintf(STDOUT, "我是子进程,pid = %d,运行完我就没事啦。\n", posix_getpid()); } else { fprintf(STDOUT, "我是父进程,pid = %d。\n", posix_getpid()); sleep(1); while (1) { # code... ; } } 运行结果:...

2022-03-04 · 王二

3-1进程标识与fork

进程标识 一个程序被加载到内存中运行,系统会为这个进程分配相应的标识信息,比如 pid,ppid,uid,euid,pgid,sid,gid,egid… 进程查看命令 pstree 可看出进程间的关系 父子,兄弟; ps -exj ps -aux ps … PID PPID PGID UID TTY STAT TIME COMMAND laradock@3a6c2da5a07b:/var/www$ ps exj PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 24 24 24 pts/1 495 Ss 1000 0:00 bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/larado 24 495 495 24 pts/1 495 R+ 1000 13:37 php demo4.php LC_ALL=en_US.UTF-8 NVM_DIR=/home/laradock/.nvm LS_COLORS=no=00:fi=00: 0 496 496 496 pts/2 1051 Ss 1000 0:00 bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/larado 496 1051 1051 496 pts/2 1051 R+ 1000 0:00 ps exj LC_ALL=en_US....

2022-02-28 · 王二

2-3解释器文件

解释器文件 解释器文件,是一种文本文件,例如 PHP 写的解释器文件 demo.php。 #!/usr/bin/php <?php echo 'Hello World!' chmod u+x demo.php 赋予可执行权限,即可直接以 ./demo.php 执行。 解释器,是可执行文件 ELF,例如 /usr/bin/php。 bash 进程启动过程 bash 进程是如何创建的? 直接在 centos、ubuntu等终端直接登录,由 login 服务开启 bash 进程。 通过网络方式登录到 shell 终端,由 sshd 服务开启 bash 进程。 sshd 服务默认监听 22 端口。 进程观察的几个命令: pstree 查看 Linux 进程间的关系,显示进程树。 pstree -ap: ├─sshd,9408 │ └─sshd,444836 │ └─bash,444875 │ └─pstree,444893 -ap ctrl+c 产生一个中断信号,退出当前终端正在执行的进程。 ctrl+z 把当前台进程丢到后台去暂停。 strace,跟踪系统调用和信号。...

2022-02-18 · 王二

2-2命令行参数与环境参数表

命令行参数 php 两种请求方式: 浏览器请求过程: http://127.0.0.1/demo2.php 浏览器访问 —> tcp 协议请求 —> Apache/Nginx[集成环境]web服务器 —> php-fpm 服务 cli 请求: php demo2.php a b c d cli 是直接在终端调用 php 解释器。 其中 [a,b,c,d] 就叫命令行参数。 环境参数表 当前 bash 进程调用 execve 函数传递进来的参数。 print_r(getenv());

2022-02-17 · 王二

2-1程序与进程

什么是程序? ELF 概念 程序(Program) 一般是指可执行文件,在Linux系统中它按 ELF 格式进行存储,并没有后缀可标识其文件类型,需要通过 file 命令来查看 ELF 文件的具体类型。 ELF 全称是 Executable Linkable Format (可执行与可链接格式),在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。 ELF文件种类: EXEC 可执行文件 object code 目标代码文件 shared libraries 共享库文件 REL 可重定位文件 在Linux中为 xx.o xx.a,也称为静态库文件,其中 xx.o 称为目标文件,可被链接器链接成为可执行文件,静态库文件,动态库文件。 示例:php扩展中常用的动态库文件如curl,网络框架库如event.so socket扩展库sockets.so c/c++项目程序员一般引用第三方的库函数都是使用第三方编译好的动态库或是静态库文件 .so, .a。 core dump 核心转储文件 存储进程产生的异常信息。是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写入一个磁盘文件。这种信息往往用于调试。 ELF 文件格式 ELF 文件信息是以 section 或 segment 来存储的。...

2022-02-16 · 王二

1-1课程介绍

课程简介 本课程内容涵盖了 Linux 下 ELF 文件、进程、进程控制原语、进程调度算法、中断信号系统、Linux bash 进程与终端、进程、特权进程、守护进程、会话、进程间通信、UNIX域进程间通信、进程间同步、进程池等知识技术点。 课程测试环境 ubuntu 20.04 php 7.x VScode 课程需要有哪些基础知识 PHP使用1年以上 能独立编译安装PHP和相关扩展 对Linux基础命令有所了解 不浮躁有足够的耐心学习知识 会使用翻译工具,爱百度google的同学^_^ 大其心,容天下之物;虚其心,受天下之善;平其心,论天下之事;潜其心,观天下之理;定其心,应天下之变。 ——— 《呻吟语·卷二·乐集·修身》 如今新兴语言层出不穷,我还有必要学PHP? 本套课程集中于 Linux 下多进程编程知识,虽然使用 PHP 来演示讲课,但在讲解中,会涉及到内核系统调用函数的说明,因为Linux内核系统调用对于所有的编程语言都是通用的。也就是说大家换一门其它编程语言,在本套课程所学到的知识都能完全应用到其它语言中,除非大家换了Linux操作系统,或是Linux操作系统的实现不使用C语言了。这也是本套课程的目标。让大家掌握方法以便能深入的研究 Linux 的 API(C 语言定义好的接口函数)。 go,python,nodejs,java,php rust,… 不论应用使用何种编程语言,底层的系统调用函数完全一致。 例如 PHP 的 pcntl_fork 底层调用的系统函数:fork,clone 课程适合哪些人? 以下列出几点小问题如果您感兴趣,则本套课程将非常适合您! PHP 解释器是什么类型的文件?我怎么查看它?为什么我在终端执行 php index.php 它就执行了?从哪里开始执行的?到哪儿结束呢? elf 文件; 通过 file /usr/bin/php 查看;...

2022-02-15 · 王二