我有一个关于UNIX中服务器编程的非常具体的问题(Debian,内核2.6.32).我的目标是学习如何编写可以处理大量客户端的服务器.我的目标是超过30 000个并发客户(即使我的大学提到有50万个可能,这似乎是QUIIITEEE的大量:-)),但我真的不知道(甚至可能是什么)这就是我要问的原因这里.所以我的第一个问题.有多少同时客户可能?客户端可以随时连接并与其他客户端联系并组成一个组(1个组最多包含12个客户端).他们可以互相聊天,因此TCP/IP包的大小取决于发送的消息.客户端还可以将数学公式发送到服务器.服务器将解决它们并将答案广播回组.这是一项非常繁重的操作.
我目前的方法是启动服务器.比使用fork创建一个守护进程.守护进程绑定套接字fd_listen并开始侦听.这是一个while(1)循环.我使用accept()来接听来电.
一旦客户端连接,我就为该客户端创建一个运行通信的pthread.客户端被添加到一个组并共享一些内存(需要保持组运行),但仍然每个客户端都在不同的线程上运行.获得正确的内存访问是一个很大的问题,但现在工作正常.
在程序的开头我读出了/ proc/sys/kernel/threads-max文件并根据我创建我的线程.根据该文件的可能线程数量约为5000.远离我希望能够服务的客户端数量.我考虑的另一种方法是使用select()和创建集.但是在集合中查找套接字的访问时间是O(N).如果我连接了超过几千个客户端,这可能会很长.如果我错了,请纠正我.
好吧,我想我需要一些想法:-)
Groetjes Markus
PS我为C++和C标记它,因为它适用于两种语言.
我目前正在深入研究Wavelets并对某些事情感到有些困惑.
首先,这不是功课.它仅用于娱乐编码.
为了更好地理解,我在C中实现了LeGal 5/3小波的提升方案.据我所知,它似乎有效.我可以反转它并正确再现原始图像.在伪代码中,我的前进dwt看起来像这样:
// deinterleave splits the low band from the high band
// (e.g. 1 0 3 0 6 0 8 1 11 becomes 1 3 6 8 11 | 0 0 0 1)
for each row in image:
dwt1d(row)
deinterleave(row)
for each col in image:
dwt1d(col)
deinterleave(col)
Run Code Online (Sandbox Code Playgroud)
但我很挣扎.
当应用dwt时,我得到了我的变换图像,但值超出了范围[0 - 255].因此我将它们存放在短裤中.有些是负面的,有些是非常大的.现在我如何显示它们以获得如下所示的那些漂亮的图像:(http://www.whydomath.org/node/wavlets/images/Largetoplevelwt.gif)?如果我使用imshow(image,[])在Matlab中显示我的图像,那么我的输出如下所示:http://i.imgur.com/dNaYwEE.jpg.那么,我是否必须对子频段进行一些转换?如果是,有人可以指出我的解决方案或告诉我该怎么做?
在文献中,我有时看到子带是这样排序的:[LL LH; HL HH],有时也像这样:[LL HL; LH HH].后者,我看到的主要是当论文是关于JPEG2000时,也是我的算法产生的.但是在Matlab中,当使用lwt2函数时,它返回前一个布局.当我将输出与Matlab的输出进行比较时,我也看到了这一点.似乎LH和HL混在一起.怎么可能?有关系吗?是否必须使用提升而不是卷积来做某事?
如果先行然后是列,反之亦然,这实际上是否重要?我在切换订单时看到输出没有区别.唯一不同的是LH变为HL而HL变为LH.但是,这并不能解决我的第二个问题,因为输出是相同的.我猜它只是符号.那重要吗?我看到他们在那里做文章和他们做排队的其他人.两者都与JPEG2000有关.
非常感谢.如果有人能对我的问题有所了解,那么我将非常感激.
亲切的问候,马库斯
我有一个非常奇怪的问题,可能没有实际用途,但答案困扰了我很多.我今天尝试使用这个代码在数组中以及如何在内存中分配它们:(编译器Xcode 4顺便说一句,4字节整数)
int ***c;
int size_x = 0;
int size_y = 0;
int size_z = 0;
cout << "Enter x: " << endl;
cin >> size_x;
cout << "Enter y: " << endl;
cin >> size_y;
cout << "Enter z: " << endl;
cin >> size_z;
c = new int**[size_x];
for (int i = 0; i < size_x; ++i) {
*(c+i) = new int*[size_y];
for (int j = 0; j < size_y; ++j) {
*(*(c+i)+j) = new int[size_z];
}
} …Run Code Online (Sandbox Code Playgroud) 这里有人可以看看代码并告诉我它有什么问题吗?我基本上是试图构建一对夫妇的是对某些原始类型,如操作的通用功能Int,Float,Double等.
不幸的是我无法让它正常工作.这是(部分)工作的代码:
// http://stackoverflow.com/a/24047239/2282430
protocol SummableMultipliable: Equatable {
func +(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
}
extension Double: SummableMultipliable {}
func vec_dot<T where T: SummableMultipliable>(a : [T], b: [T]) -> Double {
assert(a.count == b.count, "vectors must be of same length")
var s : Double = 0.0
for var i = 0; i < a.count; ++i {
let x = (a[i] * b[i]) as Double
s = …Run Code Online (Sandbox Code Playgroud) 我有一个问题,你们这已经让我疯了2天了.也许是因为我错过了关于位移的基础知识,但不知怎的,我没有把它放到我脑海里.我想要的是一个简单的程序,它读入3个char或uint8_t,将它们存储到一个大的int中,然后再读出来.
这是我第一次尝试比特移位,不知怎的,我被卡住了.
这是代码:
int main (int argc, const char * argv[])
{
u_int8_t insert1;
u_int8_t insert2;
u_int8_t insert3;
int data;
printf("Please enter value1: ");
scanf("%d", &insert1);
printf("Please enter value2: ");
scanf("%d", &insert2);
printf("Please enter value3: ");
scanf("%d", &insert3);
data |= insert3<<16 | insert2<<8 | insert1;
printf("\nValue1: %d\n", data);
printf("Value2: %d\n", data>>8);
printf("Value3: %d\n", data>>16);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我进入
126 103 255
我得到:
值1:16711680值2:65280值3:255
哪个是完全错误的.我很确定该值存储正确存储到数据中,但我不知道如何读出.
非常感谢 :-)
我对我正在处理的问题有疑问.我必须按顺序随机播放视频,而不重复播放视频.每个视频仅允许每个播放列表播放一次.每个视频都有一个从0到max_video_count的唯一ID,该id在运行时确定(取决于服务器).
我现在做的是,我创建了一个链接列表,添加了每个视频的唯一ID.比我在0和max_video_count之间随机创建一个随机数,如果数字已经在链表中则进行线性搜索,如果是,我计算一个新数字..再次线性搜索..等等!!
显然,这不是很实用,有时需要很长时间才能找到一个元素.特别是当很多视频播放时.
所以我想,我实现了线性搜索而不是线性搜索,但这让我想到了我必须首先对列表进行排序的问题.所以,我的下一步是思考,我在插入新的unique_id时对列表进行排序,而不是二元搜索.
我知道二进制搜索是O(log n)与O(n)线性搜索相比,这是一个很大的进步.但排序列表也是O(n)因为找到正确的位置我将不得不再做线性搜索.....所以我来解决方案比二进制搜索将是O(log N*n)相比较O(n)线性搜索 - >快速线性搜索.是对的吗?也许我的整个方法都是错的......但我还是想出更好的东西......
我对算法很新,所以如果有人能在这里启发我会很好:-)
问候马库斯