看鹅

2022-03-10 面试复盘

笔试题 40分钟,A4纸手写。 好多年都没握过笔了。 MVC 中的 M, V, C 分别代表什么? 我的答案: Model View Controller 分析:回答比较粗浅,只写出了完整的单词。 以下代码的运行结果 $value = FALSE; if (empty($value)) { echo 'null'; } else { echo 'have value'; } 我的回答:have value 正确答案:null 分析:对 empty 方法记忆模糊不清。 判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于false,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。 ——empty 写出示例中日本电话号码的正则:03-1234-5678,06-1224-5989 我的回答:正则不熟悉,随便写了些。 正确答案: 改进:系统学习下正则,之前也学过,用的时候还是习惯去搜现成的表达式。归根结底还是没学会。 在线正则表达式 正则表达式 – 教程 | 菜鸟教程 正则表达式 - JavaScript | MDN 写出下面代码的运行结果: $arr = [2, 3, 5, 8, 10, 9, 7, 5, 9]; // 2 3 5 8 10 9 7 5 9 // 0 1 2 3 4 5 6 7 8 // 0 5 // 1 8 // 2 9 // 3 9 // 4 数组没有下标为10的元素 null $num = 0; for ($i = 0; $i < 5; $i++) { $num += $arr[$arr[$i]]; } echo $num; 我的回答:31...

2022-03-11 · 王二

4-1 什么是中断信号(软中断)

中断信号 指软件中断信号,简称软中断。 中断信号处理程序(信号处理函数,信号捕捉函数)完以后,就会返回继续执行主程序。 中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。 引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念。 ——中断 中断尽管可以提高计算机处理性能,但过于密集的中断请求/响应反而会影响系统性能。这类情形被称作中断风暴(interrupt storm)。 中断处理过程示意图 中断源 就是产生中断信号的单元。 在终端按下按键产生的中断信号 ctrl+c, ctrl+z, ctrl+\ 硬件异常 在终端使用 kill 来发送中断信号 posix_kill / kill(2) 函数、pcntl_alarm / alarm(2)函数 软件产生的中断信号 SIGURG [TCP/IP],SIGALRM 中断响应 对信号的处理。 忽略 执行中断处理函数(捕捉信号执行信号处理函数) 执行系统默认 signal ===> 动作[忽略,默认,执行用户编写好的信号处理函数] 中断返回 中断服务程序运行完之后返回。 信号对进程的影响: 直接让进程终止 让进程停止 SIGCONT 可以唤醒进程到前台继续运行 demo11.php <?php echo posix_getpid(); while (1){ ; } 发送 SIGSTOP 让进程停止之后 [1] Killed php demo11.php [2] Killed php demo11.php [3]+ Stopped php demo11.php $jobs [1]+ Stopped php demo11....

2022-03-09 · 王二

3-7 进程查看

一个程序启动之后就是一个进程,进程的数据在内存中,包括正文段和数据段,内存中的一些数据也会写入到proc文件系统中。 $ ll /proc/ total 4 dr-xr-xr-x 447 root root 0 Mar 8 06:31 ./ drwxr-xr-x 1 root root 4096 Mar 1 07:45 ../ dr-xr-xr-x 9 root root 0 Mar 8 11:43 1/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 12/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 21/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 22/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 23/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 24/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 3252/ dr-xr-xr-x 9 laradock laradock 0 Mar 8 11:47 499/ dr-xr-xr-x 9 root root 0 Mar 8 11:47 983/ top top - display Linux processes....

2022-03-08 · 王二

3-6 SUID特权进程

SUID、SGID 概念 The Unix access rights flags setuid and setgid (short for “set user ID” and “set group ID”) allow users to run an executable with the file system permissions of the executable’s owner or group respectively and to change behaviour in directories. They are often used to allow users on a computer system to run programs with temporarily(暂时、临时) elevated(提高) privileges in order to perform a specific task. While the assumed user id or group id privileges provided are not always elevated, at a minimum they are specific....

2022-03-08 · 王二

3-5多进程编写

多进程编写需要清楚的几个问题 创建了几个进程? 每个进程 $count 是多少? 每个进程从哪个地方开始运行代码的? fork 之后,每个进程的变量 $i, $count 的值是多少 ? 每个进程运行到哪一行语句结束? 示例一: 代码 <?php $count = 10; for ($i = 0; $i < 2; $i++){ $pid = pcntl_fork(); // step1-1 parent 创建子进程 child-1: count = 10, i = 0 // step3-1 cpu 调度 parent 创建子进程 child-2: count = 100, i = 1 // step5-1 cpu 调度 child-1 创建子进程 child-3: count = 11, i = 1 if ($pid == 0){ $count += 1; // step1-2 child-1 执行:count = 11, i = 1 // step4 child-2 执行: count = 101, i = 2 // child-2 最终结果:count = 101 // step6 child-3 执行:count = 12, i = 2 } else { $count *= 10; // step2 cpu 调度 parent:count = 100, i = 1 // step3-2 cpu 调度 parent:count = 1000, i = 2 for循环退出 // parent 最终结果:count = 1000 // step5-2 cpu 调度 child-1:count = 110, i = 2 // child-1 最终结果:count = 110 } } while(1){ fprintf(STDOUT, "pid=%d,count=%d\n", posix_getpid(), $count); sleep(3); } 分析: step1-1 parent 创建子进程 child-1:count = 10, i = 0...

2022-03-07 · 王二

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... ; } } 运行结果: php demo5.php 我是父进程,pid = 1282。 我是子进程,pid = 1283,运行完我就没事啦。 进程状态: laradock@3a6c2da5a07b:/var/www$ ps exj PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 807 1282 1282 807 pts/2 1282 R+ 1000 0:15 php demo5....

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,跟踪系统调用和信号。 通过 strace -f -s 65500 -p 9408 -o ssh.log 追踪 pid = 9408 的 sshd 进程的系统调用,来分析 bash 进程是如何创建的。...

2022-02-18 · 王二