StateThreads 库使用

news2024/9/20 16:52:30

文章目录

  • 需求
  • 介绍
    • 协程
    • 注意
    • 调度
  • 部署
  • 环境搭建
  • 测试
    • 测试库是否正常
    • 测试TCP服务器

需求

最近在对网关模型的并发性能进行验证,
核心目标不仅是让服务器能够承载更多的请求,
还力求在协议栈的解析阶段实现极致的轻量化和无锁操作,从而大幅提升处理效率和系统响应速度。
为实现这一目标,选取了业界内多个领先的并发处理框架作为候选对象进行测试,以评估它们在处理高并发请求时的表现和稳定性。以下是关于其中一个框架——StateThreads的一些相关内容

介绍

https://state-threads.sourceforge.net/

协程

通常我们把协程理解为是一种程序自己实现调度、用于提高运行效率、降低开发复杂度的东西。提高运行效率很好理解,因为在程序层自己完成了部分的调度,降低了对系统调度的依赖,减少了大量的中断和换页操作。
很多语言都拥有协程,例如python或者golang。而对于c/c++而言,通常实现协程的常见方式,通常是依赖于glibc提供的setjump&longjump或者基于汇编语言

注意

协程不是用来提高服务器性能的,是用来提高代码的编写速度和可维护性的

比如协议栈解析中最常见的结构 length-data , 其中length字段(假设为2字节)用于指示紧随其后的data部分的长度

解析:

  • 使用epoll来监听文件描述符(fd)的可读事件,当检测到fd可读事件时,程序需要首先读取这2字节的length,然后根据这个长度去读取相应长度的data。如果首次读取的data不完整,程序需要继续监听fd的可读事件,并在后续读取中维护状态,确保所有数据被完整接收。
  • 使用协程后上述 过程被极大地简化和抽象化,复杂的逻辑被封装在协程库中,调度由协程库实现,代码逻辑简化为,读取2个字节解析出length,读取length长度数据,然后进行业务处理

调度

ST调度工作原理,ST运行环境维护了四种队列,分别是IOQ、RUNQ、SLEEPQ以及ZOMBIEQ,当每个thread处于不同队列中对应不同的状态(ST顾名思义所谓thread状态机)。比如polling请求的时候,当前thread就加入IOQ表示等待事件(如果有timeout同时会被放到SLEEPQ中),当事件触发时,thread就从IOQ(如果有timeout同时会从SLEEPQ)移除并转移到RUNQ等待被调度,成为当前的running
thread,相当于操作系统的就绪队列,跟传统EDSM对应起来就是注册回调以及激活回调。再比如模拟同步控制wait/sleep/lock的时候,当前thread会被放入SLEEPQ,直到被唤醒或者超时再次进入RUNQ以待调度。

参考 浅析State-Thread

部署

下载

https://sourceforge.net/projects/state-threads/files/

在这里插入图片描述
解压
在这里插入图片描述
编译

# 根据具体环境选择参数 
make linux-debug
参数包括
aix-debug
aix-optimized
cygwin-debug
cygwin-optimized
darwin-debug
darwin-optimized
freebsd-debug
freebsd-optimized
……  等

环境搭建

头文件和库都在obj目录下 拷贝到开发环境
obj目录下还有配套的测试文件 proxy server lookupdns

在这里插入图片描述
.

测试

测试环境目录结构
目录结构

测试库是否正常

编译命令

gcc test.c -o test -l st -L .
#include <stdio.h>
#include "st.h"

void* do_calc(void* arg){
    int sleep_ms = (int)(long int)(char*)arg * 10;
    
    for(;;){
        printf("in sthread #%dms\n", sleep_ms);
        st_usleep(sleep_ms * 1000);
    }
    
    return NULL;
}

int main(int argc, char** argv){
    if(argc <= 1){
        printf("Test the concurrence of state-threads!\n");
        printf("Usage: %s <sthread_count>\n");
        printf("eg. %s 10000\n", argv[0], argv[0]);
        return -1;
    }
    
    if(st_init() < 0){
        printf("st_init error!");
        return -1;
    }
    
    int i;
    int count = atoi(argv[1]);
    for(i = 1; i <= count; i++){
        if(st_thread_create(do_calc, (void*)i, 0, 0) == NULL){
            printf("st_thread_create error!");
            return -1;
        }
    }
    
    st_thread_exit(NULL);
    return 0;
}


测试TCP服务器

编译命令

gcc -g tcp-srv.c -o tcp-srv -l st -L. -I .

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <errno.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <st.h>  
  
#define BACKLOG 5  
#define IOBUFSIZE 8192
#define PORT 7474  

static void *handle_request(void *arg)
{
	st_netfd_t cli_nfd = (st_netfd_t) arg;
	struct pollfd pd;
	pd.fd = st_netfd_fileno(cli_nfd);
	pd.events = POLLIN;
	char buf[IOBUFSIZE];
	int nw, nr;
	for ( ; ; ) {
		/*pd.revents = 0;
		if (st_poll(&pd, 1, ST_UTIME_NO_TIMEOUT) <= 0) {
			printf("st_poll<=0\n");
			break;
		}*/
		//if (pd.revents & POLLIN) {			
			nr = (int) st_read(cli_nfd, buf, IOBUFSIZE, ST_UTIME_NO_TIMEOUT);
			if (nr <= 0)break;
			printf("[recv][%d] %s\n",nr,buf);     
			nw = st_write(cli_nfd, buf, nr, ST_UTIME_NO_TIMEOUT);
                        printf("[write] %d\n",nw);
			if (nw == nr)break;			
		//}
	} 
done:
	st_netfd_close(cli_nfd);
	return NULL;
} 

int main() {  
    int sock, client_fd;  
    struct sockaddr_in address;
	struct sockaddr_in cli_addr;
    socklen_t addrlen = sizeof(address);  
    st_netfd_t cli_nfd, srv_nfd;
    int n =0;
    // 初始化StateThreads库  
    if (st_init() != 0) {  
        perror("st_init");  
        return 0;  
    }  
	if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		printf("socket");
		exit(1);
	}
	n = 1;
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&n, sizeof(n)) < 0) {
		printf("setsockopt");
		exit(1);
	}
	// 绑定socket到端口  
    address.sin_family = AF_INET;  
    address.sin_addr.s_addr = INADDR_ANY;  
    address.sin_port = htons(PORT);  
	
	if (bind(sock, (struct sockaddr *)&address, sizeof(address)) < 0) {
		printf("bind");
		exit(1);
	}
	listen(sock, 128);
	if ((srv_nfd = st_netfd_open_socket(sock)) == NULL) {
		printf("st_netfd_open");
		exit(1);
	}
        printf("tcp srv start\n");
	for ( ; ; ) {
		n = sizeof(cli_addr);
		cli_nfd = st_accept(srv_nfd, (struct sockaddr *)&cli_addr, &n,ST_UTIME_NO_TIMEOUT);
		if (cli_nfd == NULL) {
			printf("st_accept\n");
			continue;
		}
		if (st_thread_create(handle_request, cli_nfd, 0, 0) == NULL) {
			printf("st_thread_create\n");
			continue;
		}
	}	
	close(sock); 
	st_netfd_close(srv_nfd);
	return 0;  
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记:如何使用Process Explorer分析句柄泄露溢出问题

一、目的&#xff1a;如何使用Process Explorer分析句柄泄露溢出问题 使用 Process Explorer 分析句柄泄漏问题是一个非常有效的方法。句柄泄漏通常是由于应用程序在创建系统资源&#xff08;如文件、注册表项、GDI 对象等&#xff09;后没有正确释放这些资源。以下是使用 二、…

智尊助手V1.0.0定位打卡 定位摸鱼免root

去除了卡密验证&#xff0c;部分软件改不了&#xff0c;非常好用的虚拟定位软件&#xff0c;重点是不需要root权限就可以使用&#xff0c;操作也非常简单。 链接&#xff1a;https://pan.quark.cn/s/c92084a6cd84 &#x1f4c1;大小&#xff1a;37M &#x1f3f7;标签&#…

Linux如何ping整个网段

一、fping 命令详解 yum provides fping # 查找包名 yum -y install fping # 安装包二、fping 批量筛选存活IP脚本 vim /tmp/ip.sh !/bin/bash fping -g 10.121.52.1/24 >/tmp/ip.txt #输出 cd /tmp/ && cat ip.txt | grep "is alive&quo…

CC工具箱使用指南:【整库计算YSDM】

一、简介 这是一个批量计算【YSDM】的小工具。 一般的数据库要素或表格都有一个【YSDM】字段&#xff0c;用来标识要素类或表格。 【YSDM】的值通常是固定的&#xff0c;入库标准都会给定一个YSDM表&#xff0c;如下&#xff1a; 我们需要将表的内容保存或转换为excel格式&a…

惠中科技光伏清洗剂:绿色清洁,引领光伏行业新潮流

在当今全球能源转型的大潮中&#xff0c;光伏产业作为绿色能源的重要组成部分&#xff0c;正以前所未有的速度蓬勃发展。然而&#xff0c;随着光伏板在户外环境的长时间暴露&#xff0c;其表面不可避免地会积累灰尘、鸟粪、油污等污染物&#xff0c;严重影响光伏板的透光率和发…

如何为你的大模型应用选择最佳架构?六大模式全面解读

随着大模型&#xff08;如 GPT-4、BERT、GPT-3.5 等&#xff09;在自然语言处理、图像识别、医疗诊断等领域的广泛应用&#xff0c;如何构建高效、灵活的架构来支持大模型在复杂场景下的应用变得至关重要。本文将详细介绍几种常见的大模型应用架构设计模式&#xff0c;包括路由…

如何选择适合海外直播的网络?

随着全球化的推进&#xff0c;海外直播正成为企业、个人和机构日益关注的热点。无论是用于营销、推广还是与观众互动&#xff0c;海外直播为各种组织提供了更广泛的机会。然而&#xff0c;要确保直播的质量和用户体验&#xff0c;必须满足一系列网络要求。 1. 网络速度 要保证直…

C 语言基础 -- 函数/指针/结构体

本文介绍指针、函数和结构体 粉丝福利&#xff0c; 免费领取C/C 开发学习资料包、技术视频/项目代码&#xff0c;1000道大厂面试题&#xff0c;内容包括&#xff08;C基础&#xff0c;网络编程&#xff0c;数据库&#xff0c;中间件&#xff0c;后端开发/音视频开发/Qt开发/游戏…

html+css+js网页设计 翘珠宝微商城移动端20个页面

htmlcssjs网页设计 翘珠宝微商城移动端20个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 …

ET6框架(十二)ET-EUI基本使用

文章目录 一、下载插件&#xff1a;二、使用插件例子三、使用规则四、公共UI组件五、脚本生成缝隙 ET-EUI是基于ET6.0版本拓展出来的一个套UI框架 一、下载插件&#xff1a; 首先我们需要下载&#xff0c;地址&#xff1a; GitHub - zzjfengqing/ET-EUI: 基于ET框架的UI模块 …

ESRI ArcGIS Pro 3.1.5新功能及安装教程和下载

ESRI ArcGIS Pro 3.1.5 主要新功能包括&#xff1a; 改进的数据编辑和管理&#xff1a;支持更多数据格式和更精细的属性表操作。增强的空间分析工具&#xff1a;新增和优化空间分析工具&#xff0c;提高数据分析效率。更好的3D可视化&#xff1a;改进3D渲染性能&#xff0c;支…

中国艺术孙溟㠭凿篆《无用之用》

孙溟㠭凿篆作品《无用之用》 这方作品是孙溟㠭先生用凿木的方式凿刻出来的&#xff0c;呈现出了凿痕的效果&#xff0c;与众不同。 孙溟㠭凿篆《无用之用》 孙溟㠭凿篆《无用之用》 万般皆有所用&#xff0c;取其长补余短&#xff0c;无用之用是为大用&#xff0…

SAPUI5基础知识25 - 聚合绑定(Aggregation Binding)

1. 背景 Aggregation Binding 是 SAPUI5 中的一种数据绑定方式&#xff0c;用于将数据模型中的集合&#xff08;如数组&#xff09;绑定到 UI 控件的聚合&#xff08;如列表项、表格行等&#xff09;。 常见的场景包括将一个数组绑定到 sap.m.List 的 items 聚合&#xff0c;…

校园转转二手交易市场JAVA系统-幽络源整理免费分享

校园转转二手交易市场JAVA系统&#xff0c;由幽络源精心收集整理&#xff0c;附带详细的功能介绍和部署教程。此系统已经过站长实际测试&#xff0c;功能完备、运行稳定&#xff0c;适合用于校园二手交易平台的搭建。 后台功能介绍 系统设置&#xff1a;全面的系统配置管理功能…

跨部门协作:搭建共享型客服知识库

引言 在当今这个快速变化且高度互联的商业环境中&#xff0c;企业面临的挑战日益复杂多变。为了更有效地服务客户、提升客户满意度&#xff0c;客服团队不仅需要掌握丰富的专业知识&#xff0c;还需要能够快速响应并解决跨领域的问题。然而&#xff0c;单一部门的知识库往往难…

小乌龟运动控制-4两只小乌龟

ROS小乌龟系列文章目录 第一章 小乌龟划圆圈 第二章 小乌龟走方形 第三章 五角星 第四章 两只小乌龟 文章目录 ROS小乌龟系列文章目录前言1、生成第2个乌龟2、实现两只小乌龟一个画圆圈一个画方块运行 前言 ROS 中实现两只小乌龟一个画圆圈一个画方块的代码实现 1、生成第2个…

安装office过程中遇到的一系列问题及解放方案(Windows)

本博文列出安装office过程中遇到的一系列问题及解放方案&#xff08;Windows&#xff09;参考的相关博客&#xff0c;仅供参考。 office下载与安装&#xff1a; 免费装Office2021工具Office Tool Plus使用教程 JH过程中遇到0xC004F074错误&#xff1a; win10 JH 错误代码&a…

pycharm中配置已有的conda环境

背景 之前已通过conda命令创建环境&#xff0c;并安装依赖正常运行程序&#xff0c;现希望在pycharm中进行调试 配置流程 打开pycharm&#xff0c;并打开项目&#xff0c;路径&#xff1a;setting->Project: your_project -> Python Interpreter&#xff0c;点击 Add …

TCP/IP五层模型

目录 一. 概述 1.TCP基础入门 2.TCP数据报结构 3. TCP/IP五层协议模型讲解&#xff1a; 4. 网络设备所在分层​编辑 5. TCP的三次握手 一. 概述 作为一名程序员&#xff0c;对于TCP/IP五层协议&#xff0c;重点掌握应用层和传输层&#xff0c;特别是以下两层对应的协议&a…

国内服务器部署NextChat程序教程

问题描述 NextChat在ChatGPT私人搭建方面广受欢迎&#xff0c;详细的Vercel部署教程建议参考之前的文章《通过NextChat(ChatGPT-Next-Web)低成本给自己或客户部署GPT程序》&#xff0c;在Vercel上部署的方法比较灵活&#xff0c;因为可以自由更改程序内容&#xff0c;所以推荐…