请教关于使用方式和拷贝相关问题
有两个问题想请教下各位: 1) 有没有一种模式适合client和server端的交互呢? 例如,client发送一个"hello" , 可以返回一个hello。也就是返回值是经过server端处理后的值。 从demo的例子看,client端的send和recv是两个独立channel, 那发送的消息和接受到的是不是没办法一一对应呢?
auto& msg = sent("hello");
std::count << meg ; // should be "hello"
2)从client发送一个消息到server接受到处理信息需要几次拷贝数据呢? 如果使用队列模式呢? 如果我们在client用户代码中new一个string, 发送给server, 这个过程会将先将字符串拷贝到共享内存, 那么server端从共享内存拿数据时是否要从共享内存拷贝数据到自己的代码中呢? 从代码看从队列Pop时是move操作,但是这样的话 对应的共享内存空间什么时候会释放 供client server再次使用呢?
多谢:-)
1)听起来你需要的是rpc,可以通过在堵塞的ipc send上自己定义一层协议来实现。简单的一个做法可以是在自己发的消息加个序号,对端收到以后在ack消息里回过来,recv的时候取出来比较一下,不一致的丢掉就可以了(因为堵塞,所以不一致的都不是自己发的)。
2)小内存拷贝两次,大内存拷贝一次。大小内存的界限默认是64字节。发送的时候由于我没有提供共享内存池指针供数据写入,因此数据会拷贝一次到共享内存里。recv的时候,返回buff_t,指针的生命周期跟着buff_t对象走。此时对于小内存会再次拷贝一次;对于大内存,内部仅有共享内存的指针,不会发生拷贝,因此一直持有对象不释放的话,对于大内存来说会导致一个共享内存槽位无法回收。默认相同大小的槽位只有255个,超出了就会导致大内存也发生拷贝(因为无法一次性传输,会进行拆包,并在进程中分配堆内存来缓存接到的数据包),引起性能骤降。
感谢回复。 确实有些类似于rpc,但是由于是本地进程间的request-response,需要做封装。