基于共享内存的分布式消息学习笔记

腾讯游戏鼠标驱动.rar 腾讯游戏-蓝钻贵族 Blue-Knight 蓝骑士有线炫光8D滚轮游戏鼠标驱动程序,Knight *骑士有线炫光8D滚轮游戏鼠标驱动 立即下载

作者:深圳自研业务组  jimwu

编辑:上海业务组 alenai

 

目录:

Tbus简介

Tbus原理

Tbus配置与工具

Tbus简单应用

Tbus运维应用-为python扩展

总结

Tbus简介

   Tbus是tsf4g(Tencent ServiceFramework for Game,腾讯游戏服务框架)中的基础组件之一,主要的目的是为上层业务提供统一的线程或进程间通信接口,屏蔽本地进程间通信以及远程进程通信的细节,让开发人员可以集中精力关注业务逻辑,是tsf4g重要组成部分。

 

Tbus原理

   Tbus基于共享内存构建无锁双通循环消息队列,发送的双方通过专用的读写队列完成数据收发,实现本地进程通信或者远程进程间通信。通信双方使用的两个队列称之为tbus通道(channel),每一组通讯的双方就需要有一个tbus通道。如下是一组tbus通道的图例描述。

                            

   进程A或B启动后,通过tbus API绑定到对应的通道,使用通道的两个消息队列进行收发数据,而不用关注对方的部署位置。

   Tbusd

如果A和B同部署于一台物理设备,与上图描述一致。如果A、B部署于不同设备之上则需要tbusd服务进程完成消息中转。通信关系如下图。

进程A发送消息后,消息被存储在Host A的发送队列中,部署于Host A的tbusd发现队列中存在消息,则从队列中把消息取出,通过tcp发送Host B上。Host B上的tbusd接收到消息后,把消息写入本地的接收队列,以供进程B读取。

为了能完成通信,Tbus还有以下几个特点:

  1. 通信双方具备全局唯一的tbus通信地址,该地址是一个点分十进制的字符串,与IP地址类似,总长度为32bit,分为4段,每段bit位数可以自定义,总长度不得超过32bit。例如:128.1.100.1,5.0.200.1。

  2. Tbus通道以及消息是存储在共享内存中,必须要使用相应的工具提前创建,进程才能绑定和使用。而当业务进程异常退出后,由于消息是存储在共享内存中,只要不主动清理共享内存、重启服务器或损坏共享内存,通道中的消息就不会丢失。

  3. Tbus通道为每一个消息都会分配一定时间内唯一的一个序列号,当消息需要跨物理服务器中转时,远端的tbusd会针对该序列号的消息进行确认,如果本地tbusd未收到确认,该消息则会重传。

  4. 当tbus通道被消息写满后(例如对端服务器死机,本地进程仍继续发送消息),则无法再往通道中写入消息,该异常需要业务自己处理。

GCIM

一台服务器可以有诸多的通信关系,每一条tbus通道就是最小的通信单元,每条通道都有自己的配置区域,保存着通道大小,通道地址以及读写指针等,一台服务器上所有配置信息汇聚起来就是全局通道信息表(globalchannel information map, GCIM),一台服务器仅需要一份。管理GCIM的工具是tbusmgr。管理关系如下:

GRM

如果一台服务器不需要和其他远程服务器通信,则使用GCIM就能完成所有工作。当两台服务器需要使用tbus进行通信时,为了完成通信,除了启动tbusd服务进程之外,还需要建立一份通信配置,称之为全局路由表(globalroute map,GRM),用于说明哪些通道的消息需要中转。GRM也是保存在共享内存中,每一台机器只需要一份,管理GRM的工具为trelaymgr。

 

Tbus配置与工具

1.Tbusmgr 与GCIM

Tbusmgr是用于创建,维护GCIM的重要命令行工具。创建GCIM共享内存信息需要依赖tsf4g规范的xml配置文件。Tbusmgr可以根据xml文件的信息对GCIM进行增删改查等所有操作。Tbusmgr.xml配置文件仅包含两部分,一部分是公共参数的设定,例如通信地址模板设定,共享内存key的设定。一部分是对tbus通道(channel)的配置,每一组通信关系就需要一份。简单tbusmgr.xml说明如下:

<TbusGCIM>

  <!-- 十进制点分表示法表示的通信地址模版  -->

 <AddrTemplet>8.8.8.8</AddrTemplet>

   <!-- GCIM共享内存key -->

  <GCIMShmKey>1000</GCIMShmKey>

  <Channels>

    <Priority>8</Priority>

    <!-- 通道两端进程的通信地址,使用点分法表示 -->

    <Address>0.0.1.1</Address>

    <Address>0.0.3.1</Address>

     <!-- 对于出现在配置中的第一个进程而言,SendSize,RecvSize分别表示此进程相关发送,接受数据队列的大小。由于两个进程是对等的,因此第一个进程的发送队列大小(SendSize)就是第二个进程的接受队列大小(RecvSize) -->

    <SendSize>20480000</SendSize>

    <RecvSize>20480000</RecvSize>

    <Desc>tcmcenter and itstconnd</Desc>

  </Channels>

  <Channels>

    <Priority>8</Priority>

    <Address>0.0.1.1</Address>

    <Address>0.0.2.1</Address>

    <SendSize>20480000</SendSize>

    <RecvSize>20480000</RecvSize>

    <Desc>tcmcenter and itscenterd</Desc>

  </Channels>

</TbusGCIM>

上述配置描述了:

  1. 通信地址32bit分为四段,每段长度为8bit。

  2. 共享内存使用key为1000,转化为16进制后为0x000003e8。

  3. 创建0.0.1.1与0.0.3.1通信的tbus通道。读写队列大小都为20480000字节,描述信息为tcmcenter and its tconnd

  4. 创建0.0.1.1与0.0.3.1通信的tbus通道。读写队列大小都为20480000字节,描述信息为tcmcenter and its tconnd

需要特别说明的是priority字段,该字段是通道优先级说明,当前没有使用,没有任何含义。默认值为8。

GCIM创建

在命令行下,可以使用以下命令完成GCIM创建:

tbusmgr--conf-file=./tbusmgr.xml –-write

或者:tbusmgr –C tbusmgr.xml –W ,完成创建后tbusmgr会输出其创建的信息,我们也可以使用tbusmgr查看我们写入的信息:

tbusmgr –k1000或者 tbusmgr –Ctbusmgr.xml

我们可以使用ipcs查看当前在共享内存中的信息,与tbusmgr打印打出的消息是完全一致的,在key为0x3e8上申请了192408字节大小作为管理区域,在共享内存上申请了40960544字节为0.0.1.1和0.0.3.1创建了一条通道,包含两个大小为20480000字节的消息队列,其中控制信息大小为544字节,shmid 为12091401。

Tbus通道查看

Tbusmgr –k1000 –-see 0.0.3.1 或者tbusmgr –C tbusmgr.xml –-see 0.0.3.1 可以查到看0.0.3.1的通道消息,可以查看该通道下消息数量,字节数等信息。--see-all参数则查看所有通道。

我们可以使用tbusmgr给通道中写入一些测试数据:

tbusmgr-k1000 –T --src=0.0.1.1 --dst=0.0.3.1 --data-len=14

在0.0.1.1至0.0.3.1的队列中,写入14字节的测试数据。

当前通道状况如下(tbusmgr -k1000 --see 0.0.3.1--dump-binary):

MsgNum:1,队列中有一个消息

Bytes:72,长度为72个字节,部分为控制信息。

H:0,头指针指向0;

T:72,尾指针指向72,

Size:队列大小

HSeq:队列中第一个消息序列号

Seq:队列总共传输了多少消息

可以使用tbusmgr –k1000 –-clean 1清理第一条通道中的消息,本例子中就是清理0.0.3.1与0.0.1.1中的所有消息

Tbus通道删除

Tbusmgr –k1000 –-delete 1 可以清理第一条tbus通道,本例子中为0.0.3.1与0.0.1.1的通道。删除后该通道将被清理,共享内存也将被释放。而原来的第二条通道(0.0.2.1<=>0.0.1.1)将成为第一条通道。

如果要恢复该通道,我们可以继续使用原来的配置文件进行恢复。

tbusmgr –C tbusmgr.xml –W

可以看到0.0.1.1<=>0.0.2.1的创建时间按没有变化,但是增加了第二条通道0.0.3.1<=>0.0.1.1。tbusmgr写入GCIM时,是采用全量写入的策略,如果共享内存中已经存在该通道,则对该通道进行忽略,如果共享内存中没有存在该tbus通道,则进行创建,如果共享内存中存在多余的tbus通道,则对该tbus通道进行删除。

2.trelaymgr与GRM

   GRM是本地服务器上的全局路由表,保存在共享内存中,用来记录tbus通道与远端链接的对应关系。Tbusd用该对应关系完成通道消息的转发。以下是trelaymgr.xml的简单说明。

<RelayMnger>

   <AddrTemplet>8.8.8.8</AddrTemplet>

    <RelayShmKey>2688</RelayShmKey>

    <Relays>

        <Addr>0.0.3.1</Addr>

       <MConn>tcp://10.1.44.61:1027</MConn>

        <Desc>relay info for 0.0.3.1</Desc>

    </Relays>

</RelayMnger>

   基于原来的示例,完成GRM的配置文件。

AddrTemplet:与tbusmgr中的字段含义相同。

RelayShmKey:共享内存key

Relays:保存对应的tbus地址与远端链接的对应关系。写入共享内存后,tbusd会把0.0.3.1上的消息使用tcp协议发送到10.1.44.61的1027端口。

   写入共享内存(使用参数与tbusmgr一致):

   trelaymgr -C relaymgr.xml –W

  

   Trelaymgr –C relaymgr.xml –-delete NUM,可以删除该编号的消息转发规则。

  

Tbus简单应用

   了解tbus实际应用细节对于运维而言,不仅可以更细致把握业务的架构与部署,应用于问题排查与故障定位,也可以通过研发的角度审视tbus以及我们的业务,多角度剖析我们的工作,提升我们的专业素养。

Tbus api简介

/* 初始化tbus系统 */

int tbus_init_ex(const char* a_pszShmKey,int a_iFlag);

/* 清理tbus系统 */

void tbus_fini(void);

/* 创建tbus句柄 */

int tbus_new(int* a_piHandle);

/* 点分十进制tbus地址转TBUSADDR类型的地址 */

int tbus_addr_aton(const char* a_pszAddr, TBUSADDR*a_piAddr);

/* 为tbus句柄绑定本地TBUS地址 */

int tbus_bind(int a_iHandle, const TBUSADDRa_iAddr);

/* 释放tbus句柄 */

void tbus_delete(int* a_piHandle);

/* 收取一条消息 */

int tbus_recv(int a_iHandle, TBUSADDR*a_piSrc, TBUSADDR* a_piDst,void* a_ppvData, size_t* a_ptLen, int a_iFlag);

/* 发送消息 */

int tbus_send(int a_iHandle, TBUSADDR*a_piSrc, TBUSADDR* a_piDst, const void* a_pvData, size_t a_iLen, int a_iFlag);

/* 取得下一个消息的指针与长度信息 */

int tbus_peek_msg(int a_iHandle, TBUSADDR*a_piSrc, TBUSADDR* a_piDst,const char** a_ppvData, size_t* a_ptLen, inta_iFlag);

api使用一般逻辑

  1. 使用tbus_init_ex初始化tbus环境

  2. 使用tbus_new创建tbus句柄

  3. 使用tbus_addr_aton把字符串tbus地址转换为TBUSADDR结构体

  4. 使用tbus_bind把tbus句柄和TBUSADDR绑定

  5. Tbus_recv/tbus_send收发消息

  6. 使用完成后,使用tbus_delete释放tbus句柄

  7. 使用tbus_fini清理tbus环境

简单示例

Tbus通道采用上面的配置,本示例通信使用0.0.1.1与0.0.2.1进行通信,为了简单说明流程,代码没做错误处理。

文件tbus_send.cpp如下,调整tbus地址转换中的地址即为tbus_recv.cpp。

#include<iostream>

#include"pal/pal.h"

#include"tbus/tbus.h"

usingnamespace std;

 

intmain()

{

        int iRet = 0, iBusRecvHandle = 0;

        TBUSADDR iSrcAddr,iDstAddr;

        char szBuf[1024] = "this is atsf4g tbus test! ";

        tbus_init_ex("1000", 0); //初始化

        tbus_new(&iBusRecvHandle);  //创建tbus句柄

      //tbus地址转换,两个地址互换后保存即为tbus_recv.cpp

        tbus_addr_aton("0.0.1.1",&iSrcAddr);

        tbus_addr_aton("0.0.2.1",&iDstAddr);

      //tbus地址绑定

        tbus_bind(iBusRecvHandle, iSrcAddr);

      //发送消息 this is a tsf4g tbus test!

        tbus_send(iBusRecvHandle,&iSrcAddr, &iDstAddr, szBuf, strlen(szBuf), 0);

        size_t iRecvLen = sizeof(szBuf);

      //接收消息,打印消息或者打印No msg in tbus channel.

        iRet = tbus_recv(iBusRecvHandle,&iDstAddr, &iSrcAddr, szBuf, &iRecvLen, 0);

        if (TBUS_ERR_CHANNEL_EMPTY ==(unsigned)iRet)

        {

            cout <<"No msg in tbuschannel." << endl;

        }else {

            cout << "Recv Data: "<< szBuf << endl;

       }

      //tbus 清理

        tbus_delete(&iBusRecvHandle);

        tbus_fini();

        return 0;

}

简单编译生成tbus_send和tbus_recv可执行文件(TSF4G为tsf4g安装目录):

g++ -c-fPIC -I${TSF4G}/include/ tbus_send.cpp -o tbus_send.o

g++ -otbus_send tbus_send.o -L${TSF4G}/lib/ ${TSF4G}/lib/libtsf4g.a -Wl,-Bstatic-lscew -lexpat -Wl,-Bdynamic -lpthread

 

g++ -c-fPIC -I${TSF4G}/include/ tbus_recv.cpp -o tbus_recv.o

g++ -otbus_recv tbus_recv.o -L${TSF4G}/lib/ ${TSF4G}/lib/libtsf4g.a -Wl,-Bstatic-lscew -lexpat -Wl,-Bdynamic –lpthread

执行结果:

 

Tbus运维应用-为python扩展

   Tbus提供了快速高效的进程通信接口,让上层逻辑基本可以完全忽略消息的收发与流转,为快速搭建中小型乃至大型应用提供了强有力的支持。该收益不仅仅是针对C++,针对内部常用的python更是如此。业务应用需要对外提供服务,前端还需要搭载公共组件tconnd,运维内部系统完全对内服务,逻辑服务加上tbus就能完成非持久化存储的部分构建(同理,持久化部分可以考虑使用tormsvr进行代理),极大降低了系统构建的复杂度(采用tcm-tagent管理更能降低了后续管理的成本)。

   Tsf4g当前虽然没有为python提供可用的api,但是如今使用python与C++构建混合系统的技术日臻完善,我们可以为python扩展tbus接口。以下是使用第三方库boost.python为python封装tbus接口的简单探讨。

   构建环境

   系统:Tlinux1.2

   Gcc:4.4.6(tlinux1.2默认版本)

   Boost.python:1.49。lib目录~/lib/boost1.49,库文件~/include/boost/

   Python:2.7.3,默认安装目录/usr/local/。

(该示例继续沿用上一个例子的tbus环境)

   Tlinux1.2 上python默认版本是2.6.6,由于没有库文件,为了获取库文件,所以升级上2.7.3,python版本可以在其官网(www.python.org)获取到。

Boost.python是boost的一个子库,为python与C++交互提供了简单易用的接口,使用前需要编译,boost库可以在其官网(www.boost.org)下载。完成python安装以及boost.python编译后,我们可以开始为python扩展tbus的动态库了:

  1. 针对tbus api进行简单类封装(以下的tbus.hpp文件);

  2. 使用boost.python对1步骤中的tbus类进行python封装(以下的libtbus.cpp)。

  3. libtbus库编译,完成编译后就可以在python环境下导入tbus了。

说明:步骤1不是必须的,可以直接对tbus原始api进行python封装。这里对tbus进行简单的封装是为了简化示例。

文件Tbus.hpp

#ifndefTBUS_HPP

#defineTBUS_HPP

 

#include"pal/pal.h"

#include"tbus/tbus.h"

 

class Tbus{

 

protected:

        std::string shm_key;

        std::string send_channel;

        std::string recv_channel;

        int bus_handler ;

        TBUSADDR send_addr;

        TBUSADDR recv_addr;

 

public:

        Tbus(std::string key, std::string send,std::string recv) : shm_key(key),  send_channel(send), recv_channel(recv), bus_handler(0){}

        bool init(){

                if (TBUS_SUCCESS !=tbus_init_ex(shm_key.c_str(), 0)) {

                        std::cout <<"Tbus init failed!" << std::endl;

                        return false;

                }

                if (TBUS_SUCCESS !=tbus_new(&(this->bus_handler))) {

                        std::cout <<"Tbus create bus handler failed!" << std::endl;

                        return false;

                }

                if (TBUS_SUCCESS !=tbus_addr_aton(this->send_channel.c_str(), &send_addr)) {

                        std::cout <<"Tbus failed to convert " << this->send_channel

                                       << " to addr." << std::endl;

                        return false;

                }

                if (TBUS_SUCCESS !=tbus_addr_aton(this->recv_channel.c_str(), &recv_addr)) {

                        std::cout <<"Tbus failed to convert " << this->recv_channel

                                       << " to addr." << std::endl;

                        return false;

                }

                if (TBUS_SUCCESS !=tbus_bind(bus_handler, send_addr)){

                        std::cout <<"Tbus bind failed!" << std::endl;

                        return false;

                }

                return true;

        }

 

        int send_message(const std::string & message){

                return tbus_send(bus_handler,&send_addr, &recv_addr, message.c_str(), message.length(), 0);

        }

 

        boost::python::str recv_message(){

                char buffer[1024] = {0};

                size_t recv_len = 1024;

                int ret =tbus_recv(bus_handler, &recv_addr, &send_addr, buffer,

                                &recv_len,0);

                if (TBUS_SUCCESS == ret){

                        returnboost::python::str(buffer, recv_len);

                }

                returnboost::python::str("None");

        }

 

        void finit(){

                tbus_delete(&bus_handler);

                tbus_fini();

        }

 

        ~Tbus(){

                this->finit();

        }

 

};

 

#endif

 

代码说明:

Tbus:构造函数,参数为共享内存key,收发端进程的tbus地址;

Init:初始化函数,初始化tbus环境,完成tbus句柄以及tbus地址内部转换;

send_message:消息发送函数,为了快速完成封装,只能发送string

recv_message:消息接收函数,考虑到python的使用,直接返回python下的str类型数据;

finit:tbus环境清理,删除tbus句柄,退出tbus。

文件libtbus.cpp

#include"boost/python.hpp"

#include"tbus.hpp"

 

BOOST_PYTHON_MODULE(libtbus){

        namespace bpy = boost::python;

       bpy::class_<Tbus>("Tbus", bpy::init<std::string,std::string, std::string>())

                        .def("init",&Tbus::init)

                       .def("send_message", &Tbus::send_message)

                       .def("recv_message", &Tbus::recv_message)

                        .def("finit",&Tbus::finit);

        bpy::def("tbus_error_string",tbus_error_string);

}

代码说明:

使用boost.python封装tbus.hpp为libtbus库。封装Tbus类的五个函数:构造函数,init,send_message,recv_message以及finit。具体boost.python语法含义可以参考官方文档(完整的说明那就是另外一篇帖子了)http://www.boost.org/doc/libs/1_54_0/libs/python/doc/index.html

 

简单Makefile

(请注意库文件目录,替换为自己实际目录)

CXXFLAGS=-I/data/home/jimwu/include/tsf4g/-I/usr/local/include/python2.7 -I/data/home/jimwu/include/

LDFLAGS=-L/data/home/jimwu/lib/boost1.49-L/usr/local/lib/python2.7 -L/data/home/jimwu/lib/tsf4g/

 

libtbus.so: libtbus.o /usr/local/lib/libpython2.7.a

tsf4g_lib.rar_tencent game_无锁队列_腾讯tbus_腾讯tbus是_腾讯游戏 Tbus是tsf4g(Tencent ServiceFramework for Game,腾讯游戏服务框架)中的基础组件之一,主要的目的是为上层业务提供统一的线程或进程间通信接口,屏蔽本地进程间通信以及远程进程通信的细节,让开发人员可以集中精力关注业务逻辑,是tsf4g重要组成部分。 Tbus原理 Tbus基于共享内存构建无锁双通循环消息队列,发送的双方通过专用的读写队列完成数据收发,实现本地进程通信或者远程进程间通信。通信双方使用的两个队列称之为tbus通道(channel),每一组通讯的双方就需要有一个tbus通道。如下是一组tbus通道的图例描述。 立即下载

相关推荐

Windows 24H2下eNSP AR_40启动失败的终极修复指南

本文针对Windows 11 24H2更新后eNSP AR_40路由器启动失败的问题,提供了终极修复方案。核心在于解决系统强制虚拟化安全(VBS/Hyper-V)与老版模拟软件的兼容性冲突。指南详细介绍了安装关键系统更新KB5053656、精细调整Windows虚拟化功能以及后续排错步骤,帮助用户在24H2系统上稳定运行eNSP进行网络实验。

weixin_29233333的博客 507

【亲测免费】 探秘高效开发利器:TSF4G - 构建微服务的未来

探秘高效开发利器:TSF4G - 构建微服务的未来 项目简介 是一个强大的、面向未来的微服务框架,它由开发者xgugeng精心打造,旨在简化分布式系统开发,提高代码质量和运行效率。TSF4G 基于 TypeScript 和 Go 语言,提供了全面的服务治理能力,包括服务注册与发现、熔断降级、负载均衡、配置中心等核心功能。 技术解析 TypeScript & Go 结合 TSF4G 将 Ty...

gitblog_00065的博客 805

运算放大器电路仿真实践:从零实现完整示例

通过一个完整的运算放大器电路仿真示例,深入掌握电路仿真的关键步骤与技巧,帮助电子爱好者和工程师快速上手实际项目设计。

weixin_34725745的博客 1317

Win11安装Linux子系统Ubantu测试TSF4G

试试在电脑硬件BIOS允许虚拟化。

brook0344的专栏 428

LabVIEW状态机实战:用STM32+DHT11搭建温湿度监测系统(附完整VI源码)

本文详细介绍了如何利用LabVIEW状态机模式与STM32微控制器、DHT11温湿度传感器构建温湿度监测系统。通过硬件选型、状态机设计、LabVIEW程序实现及系统优化等环节,提供了一套完整的解决方案,并附有VI源码,助力开发者快速实现嵌入式温湿度监测应用。

weixin_42549723的博客 518

【Unity3D】关于unity中spriteAtlas的打包方案及使用时内存状态的多组对照实验

unity项目中使用精灵(Sprite)为了降低性能消耗,我们可以使用精灵图集(Sprite Atlas)技术,它能够将多个纹理合并成一个大纹理

云渊寒烬 5100

分布式学习笔记

简单理解: 数据分布式存储 请求分布式调度 多节点分布式部署 双重备份,热切换 系统的核心: 分布式算子:(例如:sun公司的hash) 对于任意输入,输出均匀分布 输出结果数可控 通信:(cindysocket) 高并发量 多线程     一接口服务器(interfaceServer) 对外提供访问接口并接受请求,一般内置一个http服务器进程 监控各dispat...

a4512138的专栏 118

【凌智视觉模块】rv1106 部署 pp-humseg 模型

人像分割技术实现摘要 人像分割是利用计算机视觉技术将图像/视频中的人物与背景分离的像素级处理技术。凌智视觉模块基于RV1106芯片开发,支持高效视觉模型部署。当前主流方法包括PP-HumanSeg、BiSeNet等深度学习模型,其中PP-HumanSegV2以96.63% mIoU精度和63FPS手机端速度成为SOTA方案。 实现流程包含: 初始化RKNN模型后端 图像预处理(尺寸调整、颜色空间转换) 执行模型推理 后处理(概率解码、动态阈值分割、形态学优化) 代码实现要点: 使用RKNPU2Backend

m0_50786932的博客 985

【共享内存】基于共享内存的无锁消息队列设计

上交所技术服务2018-09-05 https://mp.weixin.qq.com/s/RqHsX3NIZ4_BS8O30KWYhQ 目录 一、背景 二、消息队列的应用需求 (一) 通信架构的升级 1、支持多写一读 2、高吞吐量 3、低时延 三、关键技术 (一)基于共享内存的存储和通信 (二) 无锁互斥访问 1、消息队列多写者的无锁操作 2、队列读操作 ...

RToax 6042

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1393

手把手教你学基带SOC芯片(4.4.9)--基带芯片的电源管理实例:高通 Snapdragon 系列实例(十)

Snapdragon 888 通过支持多种深度睡眠模式,如 AOAC 模式、低功耗模式和深度睡眠模式,以及智能电源管理技术,实现了对功耗的精细管理。这些模式不仅延长了设备的电池寿命,还确保了用户在各种使用场景下的良好体验。无论是保持网络连接、限制后台活动,还是完全关闭不必要的功能,Snapdragon 888 都能够灵活应对,提供高效的功耗管理方案。

MHD0815的博客 740

分布式系统概念和设计——分布式共享内存

分布式数据共享和一致性模型

多头注意力探索Now 2956

OpenStack详解、排错、经验总结

第1章 Openstack简介 1.1 计算(Compute):Nova。 一套控制器,用于为单个用户或使用群组管理虚拟机实例的整个生命周期,根据用户需求来提供虚拟服务。负责虚拟机创建、开机、关机、挂起、暂停、调整、迁移、重启、销毁等操作,配置CPU、内存等信息规格。自Austin版本集成到项目中。 1.2 对象存储(Object Storage):Swift。 一套用于在大规模可扩展系统中通过内置冗余及高容错机制实现对象存储的系统,允许进行存储或者检索文件。可为Glance提供镜像存储,为Cinder提供

weixin_40548182的博客 1974

基于共享内存的无锁消息队列设计

一、前言 在前一篇文章中有讲到如何利用CAS原理实现无锁同步,这篇文章就是借用CAS和共享内存实现进程间的高速通信。 消息队列是一种进程、系统间进行通信的常用组件。应用程序通过读写出入队列的消息来通信,实现异步通信,简化系统设计;消息队列还能作为缓存,提高系统吞吐量。 想必大家对环形队列的实现有很清楚的了解,消息队列头主要就是包含一个当前队列的头部位置和尾部位置的信息,环形队列可以存放一...

钟离默的个人博客 2418

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java分布式共享内存_分布式共享内存

DSM本文是mit6.824 Schedule: Spring 2016的第12课,前面课程内容可以在分布式找到,更多详细资料可以到:distributed-system查看。介绍在并发编程中,我们需要处理两个关键问题:线程之间如何通信线程之间如何同步通信是指线程之间以何种机制来交换信息,在命令式编程中,线程之间的通信机制有两种:共享内存消息传递我们从通信和同步两个维度来看共享内存和消息传递。在共...

weixin_39975366的博客 1048

数学建模模型总结

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

进程间通讯:共享内存和消息队列简述

操作系统内的并发执行进程可以是独立的也可以是协作的: 如果一个进程不能影响其他进程或受其他进程影响,那么该进程是独立的,换句话说,不与任何其他进程共享数据的进程是独立的; 如果一个进程能影响其他进程或受其他进程所影响,那么该进程是协作的。换句话说,与其他进程共享数据的进程为协作进程。 协作进程需要有一种进程间通信机制(简称 IPC),以允许进程相互交换数据与信息。进程间通信有两种基本模型:共享...

我要出家当道士 947

分布式共享内存两种实现方式

分布式共享内存 这里,我们介绍两种分布式共享内存,一种是分布式共享内存,另外一种是naive分布式共享内存 简单的分布式共享内存 所有的进程去访问一个共享内存,这个共享内存是虚拟的,他可能分布在不同的物理机上,其实可以理解为一种抽象,他整合了所有的存储资源,然后所有的调度、分配、读写都对程序员是隐藏的,他提供给程序员的就是一个虚拟的内存块(或者内存管理平台),程序员就可以向操作一块磁盘一样...

qq_35240226的博客 5175

分布式消息队列

作者:vincentchma,腾讯 IEG 后台开发工程师一、消息队列的演进分布式消息队列中间件是是大型分布式系统中常见的中间件。消息队列主要解决应用耦合、异步消息、流量削锋等问题,具有高...

腾讯技术工程 7462

异步编程 - 14 异步、分布式、基于消息驱动的框架 Akka

Akka 是一个开源的并发、分布式、基于消息驱动的框架,用于构建高可伸缩性、可靠性和并发性强的应用程序。它是基于 JVM(Java虚拟机)的,主要使用 Scala 编程语言开发,但也提供了 Java API,因此可以在 Java 和 Scala 中使用。Actor 模型:Akka 的核心构建块是 Actor,它是一种轻量级并发原语。Actor 之间通过消息通信进行互动,每个 Actor 都有自己的状态和行为,它们之间是相互隔离的,这有助于构建高度可伸缩的系统。并发性和并行性。

小工匠 1万+

重新审视 CXL 时代下的分布式内存

随着摩尔定律增长的逐渐减缓,系统规模的水平扩展已经成为提升系统性能的关键策略。然而,这种扩展依赖于分布式系统架构的支持,而分布式编程的固有复杂性给构建高效、可靠及弹性的系统带来了严峻挑战。因此,简化分布式编程依旧是分布式编程框架追求的核心目标。

阿里云云栖号 1739

通信与共享内存

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”? http://www.imooc.com/wenda/detail/505010 使用共享内存的话在多线程的场景下为了处理竞态,需要加锁,使用起来比较麻烦。另外使用过多的锁,容易使得程序的代码逻辑坚涩难懂,并且容易使程序死锁,死锁了以后排查问题相当困难,特别是很多锁同时存在的时候。 共享内存会涉及到多个线程同时访问修改数据的情况,那得...

yaochuyi的博客 669

以通信方式共享内存,不要以共享内存方式通信(2)

继续以“以通信方式共享内存,不要以共享内存方式通信”这句话展开。 从云原生开始。 云原生是面向微服务的架构,而消息传递是微服务交互的媒介,每个工人都接触过关于消息队列的概念,正是消息支撑了云原生微服务。 消息并不封装状态,消息本身无状态,状态通过消息之间的交互来体现。消息交互可自由组合,这是分布式的源泉,而云原生本身就是面向分布式的设计。 一个部署云原生应用的IDC机房就是缩小版的全球TCP/IP互联网,无状态的消息在分布式的微服务之间传递,状态仅由微服务的交互定义和维护。 甚至一台物理主机内部板卡也成了微

TCP/IP 1万+

深入理解分布式消息队列

一、消息队列的演进分布式消息队列中间件是是大型分布式系统中常见的中间件。消息队列主要解决应用耦合、异步消息、流量削锋等问题,具有高性能、高可用、可伸缩和最终一致性等特点。消息队列已经逐渐成...

极客重生 2409

Python的共享内存、共享内存队列

pythons通过共享内存、共享内存队列进行图像传输、提升性能的示例

WonderThink的博客 3073

进程通信方式全面对比:共享内存、管道、Socket、消息传递、信号

因此无需考虑数据从一个进程内存复制到另一个进程内存的问题(但仍需要内核在内部传递信号信息给目标进程)。

m0_73499661的博客 1177
上一篇: 御龙在天掉线问题定位过程
下一篇: 欢迎使用优快云-markdown编辑器
ctreewang
博客等级 码龄16年 1608粉丝 276原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值