服务器模型学习

服务器模型 阅读详情

服务器模型大体分为三种:循环模型、并发模型及IO复用模型。

循环模型

循环服务器指的是对客户端的请求和连接,服务器处理完一个之后再处理另一个,即串行处理客户端的请求。循环服务器又叫迭代服务器。循环服务器常用于UDP服务程序。

并发模型

单客户端单进程,统一accept()

该模型是由主进程统一处理客户端的连接,当客户端的连接请求到来时,服务器的accept()函数成功返回,此时服务器端的进程调用fork()分叉。父进程等待客户端的连接,子进程去处理已连接客户端的业务。

单客户端单进程,各线程独立accept()

简单并发服务器可以同时对多个客户端的请求进行处理。原理主要是主进程提前构建多个子进程,当客户端请求来时,系统从进程池中选取一个子进程处理客户端的连接,每个进程处理一个客户端的请求,在全部进程处理能力得到满足之前服务器的网络负载基本不变。


单客户端单线程,统一accept()

该模型是由主进程统一处理客户端的连接,当客户端的连接请求到来时,服务器的accept()函数成功返回,此时服务器端的进程调用pthread_create()函数创建线程。主进程等待客户端的连接,新创建的线程去处理已连接客户端的业务。

单客户端单线程,各线程独立accept(),使用互斥锁

该模型是由主进程提前分别分配多个线程同时处理客户端的连接,也就是每个线程都可以调用accept()函数去处理连接,为了防止冲突,线程处理连接时必须使用线程互斥锁,在调用accept()函数之前锁死,调用完成后释放锁。

 I/O复用模型

原理解析

并发服务器有一个比较大的缺陷,它需要建立多个并行的处理单元。当客户端增加时,随着处理单元的增加,系统的负责会逐渐的转移到并行处理单元的切换上,处理业务能力就会降低。因此出现了一种I/O复用模型,该模型在服务器启动时建立多个不同的处理单元,如:连接处理单元,业务处理单元等。当客户端连接到来时,将客户端的连接放在一个状态池中,对所有的客户端连接在一个处理单元中轮询处理。与之前的并发服务器相比,客户端的增加不会造成处理单元的增加,而处理与cpu和内存的速度直接相关。

该模型首先调用socket()函数建立一个套接字描述符,调用bind()函数将套接字与本地地址和监听端口绑定,然后调用listen()设置侦听队列长度。然后建立两个线程,一个为连接业务处理线程,一个请求业务处理线程。

连接业务处理线程调用accept()函数接收客户端的连接,得到客户端连接套接字文件描述符并将其放入客户端连接状态表中,该状态表是由连接业务处理线程与请求业务处理线程共享。

请求业务处理线程用于处理客户端的业务请求,例如请求的分析、IO数据的读取等。该线程根据连接业务处理线程获取的客户端的套接字文件描述符(状态表),建立文件描述符集合,使用select()函数对文件描述符集合进行超时等待。当有客户端请求到来时,请求处理线程接收并对其进行处理。当请求完毕时,客户端退出时请求业务处理线程将此客户端的文件描述符从客户端连接状态表中取出。

代码实例

服务器端代码 select.c 如下:

/******************************************************************************
            版权所有 (C), 2018-2019, xxx Co.xxx, Ltd.
 ******************************************************************************
    文 件 名 : select.c
    版 本 号 : V1.0
    作    者 : lijd
    生成日期 : 2018年12月24日
    功能描述 : I/O复用之select函数
    修改历史 :
******************************************************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <ctype.h>
#include <netinet/in.h>
#include <netinet/ip_icmp.h>
#include <unistd.h>
#include <signal.h>
#include <arpa/inet.h>
#include <errno.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define BUFFLEN 	1024
#define SERVER_PORT 8888
#define BACKLOG		5
#define CLIENTNUM	512
 
int connect_host[CLIENTNUM];
int connect_number = 0;
 
static void *handle_request(void *argv)
{
    time_t now;
    char buff[BUFFLEN];
    int n = 0;
    int maxfd = -1;
    fd_set scanfd;
    struct timeval timeout;
	
    int i = 0;
    int err = -1;
	
    while(1)
    {
        // timeout变量传入select时会被内核程序实时刷新,再次循环调用select时需重新赋值,设置select程序阻塞时间
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
 
        maxfd = -1;
        // 由于fd_set集合传入select函数,即是传入参数,又是传出参数,内核程序会把就绪队列标志带入fd_set集合中带出,再次调用select时需要重新初始化fd_set集合
        FD_ZERO(&scanfd);
        for(i = 0; i < CLIENTNUM; i++)
        {
            if(connect_host[i] != -1)
            {
                FD_SET(connect_host[i], &scanfd);
                if(connect_host[i] > maxfd)
                {
                    maxfd = connect_host[i];
                }
            }
        }
		
        err = select(maxfd+1, &scanfd, NULL, NULL, &timeout);
        switch(err)
        {
            case 0:    break;
			case -1:    printf("error~~~~~\n");    break;
			default:
			{
				if(connect_number <= 0)    break;
				for(i = 0; i < CLIENTNUM; i++)
				{
					if(connect_host[i] != -1)
					{
						if(FD_ISSET(connect_host[i], &scanfd))    // 判断描述符是否可读写
						{
							memset(buff, 0, BUFFLEN);
							n = recv(connect_host[i], buff, BUFFLEN, 0);
										
							if(n > 0 && !strncmp(buff, "TIME", 4))
							{
								memset(buff, 0, BUFFLEN);
								now = time(NULL);
								sprintf(buff, "%24s\r\n", ctime(&now));
								printf("buff : %s\n", buff);
								send(connect_host[i], buff, strlen(buff), 0);
							}
									
							close(connect_host[i]);
							connect_host[i] = -1;
							connect_number--;
						}
					}
				}
				break;
			}
		}
    }
}
 
static void *handle_connect(void *argv)
{    
    int s_s = *((int *)argv);
    struct sockaddr_in from;
    socklen_t len = sizeof(from);
    while(1)
    {
        int i = 0;
        int s_c = accept(s_s, (struct sockaddr *)&from, &len);
        printf("from client link IP : %s\n", inet_ntoa(from.sin_addr));
        for(i = 0; i < CLIENTNUM; i++)
        {
            if(connect_host[i] == -1)
            {
                connect_host[i] = s_c;
				connect_number++;
				break;
			}
		}
    }
}
 
int main(int argc, char* argv[]) 
{
    int s_s;
    struct sockaddr_in local;
    int i = 0;
    memset(connect_host, -1, CLIENTNUM);
	
    s_s = socket(AF_INET, SOCK_STREAM, 0);
	
    memset(&local, 0, sizeof(local));
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port = htons(SERVER_PORT);
	
    bind(s_s, (struct sockaddr *)&local, sizeof(local));
    listen(s_s, BACKLOG);
	
    pthread_t thread_do[2];
    pthread_create(&thread_do[0], NULL, handle_connect, (void *)&s_s);
	
    pthread_create(&thread_do[1], NULL, handle_request, NULL);
	
    for(i = 0; i < 2; i++)
    {
		pthread_join(thread_do[i], NULL);
    }
	
    close(s_s);
	
    return 0;
}

服务端程序运行平台IP为:10.0.13.111,IP客户端连接平台:10.0.13.222。运行程序执行结果如下:

 对于此篇博客存在的问题,欢迎各位大佬指正留言。

Amazon AWS 服务器租用 机器学习 深度学习模型训练 之所以需要租用aws是因为自己买不起服务器,周围又没有可用的服务器资源,听说aws是比较好的,所以就去试着用了一下,感觉还可以,自己用的过程中发现比较详细的介绍很少,所以结合自己这段时间使用的经验,和大家介绍一下。 Step1 账号注册 aws如果想要注册个人账号,只能用国际版,不能用中国版的,中国版的只能企业级的使用。网站在https://aws.amazon.com/cn/。 点... 阅读详情

相关推荐

在服务器上运行深度学习模型

5.编写深度学习模型:使用您选择的深度学习框架编写您的模型代码。这包括定义模型的架构、选择合适的损失函数和优化算法,并进行模型的训练和评估。1.选择合适的服务器:首先,您需要选择一台适合运行深度学习模型的服务器。服务器的硬件配置应具备足够的计算能力和存储容量。6.运行深度学习模型:在服务器上运行您的深度学习模型之前,确保您的代码和数据集都位于正确的位置。确保数据集的路径在您的代码中是正确的,并且服务器具有足够的存储空间来存储数据集。请注意,这只是一个简单的示例,您可以根据自己的需求设计更复杂的模型。

VnReact的博客 771

常用的服务器模型

常用的服务器模型

weixin_48150445的博客 661

GPU云服务器体验:深度学习模型训练

通过在GPU云服务器上进行深度学习模型的训练,我们可以充分利用强大的计算资源,加快模型训练的速度,从而更快地迭代和优化模型。此外,云服务提供商还提供了灵活的付费模式,我们可以根据实际使用情况进行付费,避免了购买昂贵的GPU设备和基础设施的维护成本。这些云服务提供商都提供了强大的GPU实例,例如AWS的P3系列实例或Azure的NC系列实例,它们配备了高性能的GPU,能够加速深度学习模型的训练过程。由于GPU的并行计算能力,深度学习模型的训练速度将大大提高,从而加快了模型迭代和优化的过程。

VnReact的博客 643

常见服务器模型

常见服务器模型对比,已经优缺点分析 1. 迭代式服务器 accept + read / write 特 点: 这种迭代器其实不是并发服务器, 而是迭代服务器, 因为他一次只能服务一个客户端, 属于单线程。 长连接:需要read – write 之间循环接受客户端请求, 但此时该模型只能服务一个客户端 短链接:如果想要支持短链接,其中的 计算 - 处理 - 打包 操作不能太耗时, 应为太过耗时会影响其他客户端连接到来。 2. fork/thread - per - connection 特 点:

weixin_42496943的博客 1728

如何在服务器端部署深度学习模型并提供预测服务

本文详细介绍了如何在服务器端部署预训练的深度学习模型,并提供了一种更佳的实践方法,即将图像预处理和预测解码放在服务器端进行。通过Flask框架创建API,实现接收图像URL,进行预处理,运行预测并返回预测结果的字符串。同时,提供了相应的代码示例和测试命令。

weixin_36213081的博客 500

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 397

计算机网络-服务器模型

一.服务器模型一.服务器模型1.支持多客户端访问//单循环服务器socketbindlistenwhile(1)acceptwhile(1)recv/sendclose注:该模式remvform为阻塞态,服务器将等待接收数据2..支持多客户端同时访问 (并发能力)socketbindlistenwhile(1)//出错处理while(1) //负责 与 客户端通信的recv/sendclose。

2401_83532323的博客 1103

WSL2离线安装Ubuntu终极指南:绕过Microsoft Store慢速下载(附最新22.04 LTS离线包)

本文提供WSL2离线安装Ubuntu 22.04 LTS的完整指南,帮助开发者绕过Microsoft Store下载慢的问题。通过PowerShell命令配置环境、获取离线安装包并完成安装,同时包含初始配置、资源优化及常见问题解决方案,助您快速搭建高效的Linux开发环境。

c8d9e0f1的博客 898

GPU服务器上跑深度学习模型

如何在 Linux 操作系统上训练深度学习模型?

m0_59705760的博客 4670

STC8H8K64U ADC采样实战:从蜂鸣器控制到电压测量(附完整代码)

本文以STC8H8K64U单片机为核心,通过两个实战案例详细讲解ADC采样的应用。首先介绍如何利用ADC采样值动态控制蜂鸣器响度,实现模拟PWM效果;其次深入探讨高精度外部电压测量的方法,包括硬件连接、两点校准技巧以及软件滤波,旨在帮助开发者从理论到实践全面掌握ADC功能。

weixin_29159441的博客 558

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1526

Xshell安装及连接服务器训练深度学习模型

Xshell安装及连接服务器训练深度学习模型Xshell安装Xshell连接服务器深度学习模型训练 Xshell安装 参考文章: xshell下载. 安装过程之中遇到问题可以参考评论区内容,本人亲测有效。 Xshell连接服务器 以本实验室的服务器为例。在使用之前,首先需要获取服务器的IP地址,端口号,此外还需要服务器的管理员为你分配好对应的账户和密码,否者你无法登录。 安装好Xshell后,打开Xshell,会出现以下界面: 因为我已经连接过实验室的服务器,所以窗口内会有记录。初次连接服务器可以在左上

xhxzdxm的博客 3499

2025年第十六届蓝桥杯省赛C/C++大学B组 个人题解

也是写了写部分题解,朱波也是狠狠水了个省二┭┮﹏┭┮,毕竟许多算法知识没怎么学。

2301_80173664的博客 2430

pycharm中连接服务器训练模型学习

最近深度学习项目训练模型2万多epoch的情况下需要在gpu服务器上跑项目,在网上看到许多租用服务器跑项目的帖子,配置各种环境挺复杂的,好多都是在vscode中的,而且还需要下载什么连接ssh服务器的app,代码环境不一样也挺复杂,因此自己想尝试一下pycharm中如何做。安装软件依赖,我是用的pytorch,所以要安装pytorch,我是在官网找的对应安装命令,和上面一样安装完成,基本就没有问题了。将这几个输入到上面框的里面,会让你输入密码的,输入密码即可。,如下面的页面,选择租用新实例。

weixin_55780257的博客 692

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

weixin_42412049的博客 2276

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 465

怎么在云服务器上跑深度学习项目,怎样在服务器上跑深度学习模型

怎样在服务器上跑深度学习模型 内容精选换一换随着深度学习的广泛应用,大量的深度学习框架及深度学习硬件平台应运而生,但不同平台的神经网络模型难以在其他硬件平台便捷的运行,无法充分利用新平台的运算性能。TVM(Tensor Virtual Machine)的诞生解决了以上问题,它是一个开源深度学习编译栈,它通过统一的中间表达(Intermediate Representation)堆栈A800-901...

weixin_30044149的博客 3785

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2783

【服务器】上传文件到服务器并训练深度学习模型&下载服务器文件到本地教程

本文教程为,上传文件到服务器并训练深度学习模型,与下载服务器文件到本地。演示指令输入,完整的上传文件到服务器,并训练模型过程,并演示完整的下载服务器文件到本地的过程。

嵌入式阿齐Archie 2402

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

租用GPU服务器跑深度学习模型心得

相信很多刚接触人工智能学习的人会遇到这个问题,当时用笔记本的CPU在跑一个Unet,19个epoch要跑半个小时,电脑内存也爆满。 先跑一个简单的网络试试看,比如Unet Unet代码可以在unet代码下载 用自己的轻薄本CPU跑的情况如图,电脑要炸啦 后来又想去买显卡,看了看价格还是望而却步了。而且学这个很多人都是学生,无收入。要想搭建gpu环境,配置最好RTX2060以上,这已经很贵了。笔记本跑大模型很有可能也会烧坏显卡。目前实验室还没有多余的显卡让我使用,所以就决定考虑租用GPU服务器。

地中海の养成记 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

试用阿里云GPU服务器进行深度学习模型训练

最近在用PyTorch时发现在本地训练模型速度一言难尽,然后发现阿里云可以白嫖gpu服务器,只要没有申请过PAI-DSW资源的新老用户都可以申请5000CU*H的免费额度,三个月内有效。

enjoy life 6732

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

在服务器上运行论文中的深度学习模型

首先需要在服务器上搭建运行环境,参见上一篇博客:【服务器上搭建深度学习模型运行环境:ubuntu本文主要讲在搭建好运行环境的情况下如何跑开源模型,以这篇论文为例。以下部分我已在本地下载完毕并上传至服务器文件夹。

qq_46056318的博客 959

Pycharm远程连接深度学习服务器Autodl实现模型训练

本文介绍了如何通过AutoDL云平台和PyCharm搭建深度学习开发环境。AutoDL提供开箱即用的GPU算力服务,支持多种型号显卡选择,预装主流深度学习框架,用户可按需租用并按使用时长计费。文章详细讲解了租用服务器、选择镜像、配置SSH连接等步骤,重点说明如何将PyCharm与AutoDL远程实例连接,实现本地编辑自动同步云端运行的高效工作流,帮助开发者利用云GPU资源突破本地算力限制。

A13883的博客 1991

租服务器训练深度学习模型

推荐用AutoDL(便宜、功能强大、gug少、有时时客服解决问题)

m0_63172128的博客 8877

模型稳定后放在服务器上,深度学习网络模型部署——知识储备Docker(一)

欢迎关注公众号:七只的Coding日志,[更多链接](https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzk0ODA5NTc5MQ==&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scen...

weixin_34652835的博客 1426
上一篇: Nginx事件模块学习之epoll
下一篇: shell脚本中执行命令误区
码农诗人
博客等级 码龄11年 985粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值