说下程序开发中的服务、进程、线程、协程

文章介绍了如何在阿里云Ecs服务器上通过SSH登录,启动Docker服务,以及使用NodeJS和Java创建服务器。讨论了进程和线程的概念,以PHP-FPM为例说明进程在处理并发请求中的作用,并引出协程作为轻量级线程的概念,特别提到了Swoole在PHP中的协程实现。
摘要由CSDN通过智能技术生成

服务

我们通过阿里云购买了一台Ecs服务器,我们称之为一个服务器实例,我们通过ssh登陆上这个实例,ssh就是这个实例上提供的一个服务,我们再通过systemctl start docker启动docker,就是在这个实例上启动一个docker服务,我们通过编程方式如用nodejs的createServer,或者java的ServerSocket也可以启动一个服务

var http=require('http'); //用来启服务
var fs=require('fs'); //用来读取文件
var root="C:/Users/Administrator/Desktop/notice" //你本地放index.html页面的文件路径

//开启服务
var server=http.createServer(function(req,res){
    var url=req.url;
    var file = root+url;
    fs.readFile(file,function(err,data){
        if(err){
            res.writeHeader(404,{
                'content-type' : 'text/html;charset="utf-8"'
            });
            res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
            res.end();
        }else{
            res.writeHeader(200,{
                'content-type' : 'text/html;charset="utf-8"'
            });
            res.write(data);//将index.html显示在客户端
            res.end();

        }
    })
}).listen(8888); //端口号
console.log('服务器开启成功');

可以发现,服务的底层都是通过建立 TCP/UDP 连接与其他服务器或者客户端使用 IP 地址和端口进行通信

进程

进程是GNU/Linux 操作系统进程中最常见的执行单元。一个任务在一个进程中运行。也可以说一个请求对应一个进程,如果你有管理 PHP-FPM 服务器的经验,你应该知道你不能仅仅通过增加 PHP-FPM 进程数来服务更多的请求。我们通过一个jmeter压力测试来解释进程,我们用jmeter新建了一个任务,并发200,循环次数200,并设置http请求到一个php程序,我们点击开始,然后立即在服务器上运行top命令,可以看到马上显示了很多php-fpm,每个php-fpm就是一个进程,php通过fork多个php-fpm来处理多并发请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPTZagHB-1680878723522)(null)]
每一个启动都会产生至少一个进程
image.png

线程

与进程相比,线程更轻量级。多个线程在一个进程中执行并共享一些全局状态。默认情况下,每个线程都可以在任何时间点访问和修改全局状态。为了保持数据同步,使用锁来防止全局状态被多个线程修改而导致的数据丢失。如果多个线程在没有适当同步的情况下访问同一个可变状态变量,您的程序就会被破坏。众所周知,编写和调试带有线程和锁的高性能并发程序非常困难。我们必须处理死锁、数据竞争等问题。一些现代编程语言如 Node.js 和 PHP 甚至没有线程的概念,但线程的好处也是想而易见,在java的多任务和大数据量处理中非常常见。
image.png
我们通过top可以查看到进程,同样,我们也可以通过htop命令(yum install -y htop)查看线程。我们先在服务器端输入htop,然后按来进入htop的设置菜单。选择“设置”栏下面的“显示选项”,然后开启“树状视图”和“显示自定义线程名”选项。按退出设置,我们再jmeter跑一下任务。这时可以观察到线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ixLeg4X-1680878722717)(null)]
为什么是php-fpm而不是php呢,因为php没有多线程的功能,多线程/进程都交由php-fpm来做了。
我们换成测试swoole程序看看有什么不同
image.png
可以看到挂载进程下面的很多php线程,说明swoole实现了原来php没有的进程/线程机制

协程

The word “coroutine” is composed of two words: “co” (cooperative) and “routines” (functions)
"coroutine "这个词由两个词组成:“co”(合作)和 “routines”(函数)。

协程可以简单理解为轻量级的线程,只不过这个线程是用户态的,不需要操作系统参与,创建销毁和切换的成本非常低,和线程不同的是协程没法利用多核 CPU 的,想利用多核 CPU 需要依赖 Swoole 的多进程模型
我个人的理解是:协程就是通过控制函数间的合作,而不需要操作系统参与,用同步的代码来达到异步的效果
image.png
下面用一段代码来举例协程

<?php
  use Swoole\Coroutine;
use function Swoole\Coroutine\run;

echo "main start\n";
run(function () {
  echo "coro " . Coroutine::getcid() . " start\n";

  Coroutine::create(function () {
    echo "coro " . Coroutine::getcid() . " start\n";
    Coroutine::sleep(.2);
    echo "coro " . Coroutine::getcid() . " end\n";
  });

  echo "coro " . Coroutine::getcid() . " do not wait children coroutine\n";
  Coroutine::sleep(.1);
  echo "coro " . Coroutine::getcid() . " end\n";
});
echo "end\n";
/*
main start
coro 1 start
coro 2 start
coro 1 do not wait children coroutine
coro 1 end
coro 2 end
end
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值