Swoole起步1

环境:Centos7+PHP7.3+Nginx
进程
我们以Linux下修改用户的密码指令passwd为例
我们知道linux中万物皆文件passwd就是运行/usr/bin/passwd这个文件的行为或指令
当我们不执行passwd这个指令时,/usr/bin/passwd文件不被执行,此时该文件对4个核心资源的占用情况为:

  1. 磁盘空间/硬盘(disk):28k;
  2. 内存(menmory):不占用;
  3. cpu:没有进行运算,即不使用 ;
  4. 网络(network):不使用
    就像一张凳子被搁在角落里一样,只占用物理空间
    当我们执行passwd命令运行文件时
    这个文件就会产生一个进程,此时4个核心资源的占用情况为:
  5. 磁盘空间/硬盘(disk):28k;
  6. 内存(menmory):占用;
  7. cpu:使用 ;
  8. 网络(network):使用
    每一个进程都会有一些特性:
    进程标识:PID
    父进程的ID:PPID (可能有)
    所有者:用户
    状态:runing/runable/sleeping/zombie

----------------------分割线----------------------------
可以将进程状态类比超市的顾客(cou相当于结账员):
有些正在结账runing
有些等待结账 runable
有些在挑选商品sleeping(不使用cpu运算)
僵尸状态zombie(等待被清理的商品或垃圾)

ps aux //查看所有进程,这个用最多
ps aux | grep 指定进程  //查看指定进程状态 

%CPU:CPU占用率
%MEN:内存占用率
VSZ占用虚拟内存(买房子的建筑面积)
RSS占用实际内存(实用面积,一切以实物为准)
TTY进程运行的终端
STAT状态 S(可中断)、D(不可中断)睡眠 
time从启动到现在一共占用cpu时间
command 该进程是谁运行的

----------------------分割线----------------------------
问题:那什么是进程?
简单来说,进程是一个数据结构,数据结构里面存放了很多成员变量,这个是最本质的。很多书说:
进程是资源的集合
我列举几个这个数据结构里面我们听的比较多的成员变量:

struct task_struct {
    pid_t                   pid;
    struct list_head        children;
    struct files_struct     *files;
}

pid变量里面保存着这个进程的标识,也就是说给进程标一个号,区分一下各个进程。通过children变量,
操作系统可以找到这个进程的所有子进程。变量files里面有一个变量fdtab,
通过fdtab里面的fd指针,可以找到当前进程打开的所有文件
操作系统会为每一个进程分配一个task_struct数据结构,一旦CPU执行某个进程的代码的时候,
操作系统把当前进程的这些变量提供给CPU。
因为每个进程都有自己的这个task_struct数据结构,
所以每个进程的变量是在各自的进程里面的,因此不同进程的变量是隔离的,这些变量也包括全局变量、文件句柄(即上图中的fd)
不同进程的文件句柄是隔离的,所以在A进程创建的Socket连接或打开的文件,在B进程内是无效,即使是将它的fd发送到B进程也是不可用的
问题:那句柄文件是有什么作用?
我们执行一段代码:

<?php
//file.txt 的内容为ABCDE
$h1=fopen('file.txt','r');
$h2=fopen('file.txt','r');

$countent=fread($h1,3); //结果为ABC
echo 'h1,the content is:'.$countent.PHP_EOL;

$countent1=fread($h1,1);//结果为D
$countent2=fread($h2,1);//结果为A

echo 'h1,the content is:'.$countent1.PHP_EOL;
echo 'h2,the content is:'.$countent2.PHP_EOL;

为什么$countent1和countent2的执行结果不相同???
当用户调用open系统调用(或者其他打开文件的系统调用)的时候,内核会创建一个打开文件对象来表示该文件的一个打开实例。内核同时也会分配一个文件描述符countent作为打开文件对象的句柄
open系统调用向进程返回这个文件描述符,然后这个文件描述符就被存放在file array里面了。然后进程就可以通过这个countent1来找到对应的文件
我们称offset为打开文件对象
在Linux系统中,文件默认是顺序访问的。当用户打开文件的时候,内核初始化这个offset的偏移指针为0,也就是说当还未执行
$countent=fread($h1,3)时,offest指向偏移指针为0,指向字母a
执行$countent=fread($h1,3)后,offset指向3,字母为d
也就是说,当进程从文件里面读取3个字节之后,offset此时指向字母d。
当进程下一次读取文件的时候,读取出来的第一个字母就是d了。这就是offset的概念。

可以看出$countent1和$countent2都是指向同一个文件,但是进程countet1去读取读到d,countent2读取为a,
所以每一个文件描述符代表着与文件的一个独立会话,对应的打开对象即offset保存着该会话的内容,
这包括了(只读,只写,读写)以及下一次读取或者吸入时的偏移指针。
这也是进程的一个进程隔离特性

----------------------分割线----------------------------
关于进程的生命周期:
父进程用fok()函数(复制自己的地址空间)产生子进程(分配一个唯一的PID,
此时父进程不死亡,父进程进入睡眠sleeping,当子进程运行完发送一个process命令并释放自己的内存,
进入僵尸状态,父进程被唤醒后完全消灭子进程),进程执行exec(),最后死亡exit(),
所有的进程都是第一个系统进程(systemd)的后代

pstree查看第一个系统进程,和父子关系,即进程树

守护进程指一直在后台运行的进程,除非主动kill或关机
问题:为什么需要进程状态?
因为每个cpu或核型只能初一一个进程,进程在运行时,他对时间和资源分配的需求会不断变化,从而分配一个状态
----------------------分割线----------------------------

文章参考:https://www.jianshu.com/p/efc193bd8b32
swoole文档:https://wiki.swoole.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值