- 博客(75)
- 资源 (8)
- 收藏
- 关注
原创 图像检索服务器编写问题记录——回忆历次版本更改
版本版本简述放弃理由1多进程:一个任务对应一个连接,一个连接对应一个进程。所有进程都需与特征库中所有特征计算相似度。特征库应共享,但多进程进程间共享困难。2多线程:一个任务对应一个连接,一个连接对应一个线程。文件描述符太多,需要统一管理。3多线程:ep
2017-05-14 17:13:19
557
原创 图像检索服务器编写问题记录——关于任务队列的思考
任务队列底层容器的选择: 现在使用的是包装stl::queue后的自定义struct。std::queue可以使用deque(双端队列)作为底层容器(queue q);也可以使用list作为底层容器(queue > q)。 若底层容器使用list,每个节点除任务信息外,均含一个指向下个节点的next指针索引。虽然相对于以deque为底层容器的队列,更能利用分
2017-05-14 16:14:38
681
原创 图像检索服务器编写问题记录——服务端的任务队列线程分配的反思
这个图像检索服务器在服务端的工作:1.接收客户端发来的图片+2.计算图片特征向量,匹配特征库图像+3.发回topK的相似图片。上版的做法:一个eopll主线程循环检测是否有连接进来==》检测到连接,装填读任务队列==》读任务调度线程循环检测是否有读任务==》检测到读任务,分派工作线程去处理==》工作线程读完客户端发来的图片,装填计算图片片特征向量,匹配特征库图像队列===》计算队列调度
2017-05-09 21:51:28
648
原创 图像检索服务器编写问题记录——用单例模式确保log类、server类只返回一个实例
2.22思考:作为持有读写日志文件的指针的log类以及持有任务队列的server类,他们应该做成单例模式。
2017-02-22 15:59:49
605
原创 图像检索服务器编写问题记录——TCP粘包了!!!
服务器端在选出匹配度高的图片后,将多个图片发送给客户端,结果客户端除了第一个图片正常外,其余都是乱码;运气好时,能有两个是正确的。打印客户端接收数据如下136199�������l~,s8�[��:��<���zӓNjxn% �펿*% N��K��A�pGS�����[�`7�aC��������94H�&2�;��2�1��MS';f�J�6�4C��s�EHLȈLr
2017-02-14 19:28:57
957
原创 图像检索服务器编写问题记录——特征库的存储问题
【1】SIFT特征没有自己编写,使用了opencv的SIFT特征提取、匹配函数。【2】centos6.8装opencv3.0有问题,系统更换成了ubuntu14.04.4。opencv3已将sift库去掉,需要自己在git上下载编译,但是编译出来错误很多,诸多不顺,最终换成了老版本。opencv2.4.9,系统ubuntu14.04.4,很顺利。【3】opencv特征库的描述子提取出来是c
2017-02-14 10:38:29
845
转载 图像检索服务器编写问题记录——MSER最大稳定极值区域检测
参考:http://blog.csdn.net/pirlck/article/details/52846550http://blog.csdn.net/zhaocj/article/details/40742191SIFT提取的特征具有旋转不变性(视角差异带来的物体内容旋转)和尺度不变性(拍摄差异带来的物体内容的模糊、清晰),但是不具备仿射不变性(无法应对视角差异带来的
2017-01-30 19:49:41
1301
原创 图像检索服务器编写问题记录——SIFT尺度不变特征变换匹配算法学习
SIFT解决的问题及其思路SIFT之前更加传统的匹配图像的方法是使用颜色、灰度等全局特征来描述整张图像,进而用这些全局特征去匹配图像。这样拍摄的光照、角度等因素对图像匹配的影响巨大。解决的问题:1.图像匹配时,两张相同图像,因为拍摄远近、模糊不同,导致匹配不出来。2.图像匹配时,两张相同图像,因为拍摄角度、方向不同,导致匹配不出来。3.图像匹配时,两张相同图像,
2016-12-29 13:35:10
753
原创 centos学习笔记--github初步使用部分
安装git【配置获取rsa-key,使本机上可以使用github】0.github的使用,需要在添加本机地rsa-key。1.生成rsa key:ssh-keygen -t rsa -b 4096 -C "XXXXX@yeah.net"出现: Enter file in which to save the key (/root/.ssh/id_rsa):
2016-12-28 22:04:17
972
原创 图像检索服务器编写问题记录——添加线程池
出的问题,本机同时开两个客户端,发送数据给服务器,服务器只处理其中一个后发现:是两个客户端都用了同个端口号。导致其中一个线程都空了所有数据,另一个就没有数据可读了。简易线程池的实现:pool_init中初始化number个线程,这些线程全部调用pool_route函数,pool_route则不断的从任务队列中摘取任务执行(任务即回调函数指针和回调函数的参数)。用户需要做
2016-12-23 15:12:04
432
原创 图像检索服务器编写问题记录——加入信号安装后的问题
问题描述:在main中加入了捕捉【硬件错误引起的SIGBUS等信号】的代码,然后图片无法传输了。解决问题步骤描述:通过 数次的注释信号安装sigaction,发现问题是由该代码引起。用fprintf打印函数执行情况,发现卡在了loadimge,的log_DEBUG中,于是gdb打印线程栈嗯,果然死锁了,但是为什么卡的锁不一样,但所有线程都锁了呢?于是先注释掉了【开线程写
2016-12-18 13:30:01
436
原创 图像检索服务器编写问题记录——线程中信号的处理方式思考
【信号的分类】:1.SIGKILL、SIGSTOP这两个信号单独一类,这两个信号不能被捕捉、忽略和阻塞。表示杀死进程和暂停进程,它们为root提供了一种一定可以杀死或暂停进程的方法。2.SIGBUS、SIGFPE、SIGSEGV这类由硬件引起的硬件故障、段错误、除0错误等信号只会发送给引起该硬件错误的线程。3.SIGCHLD、SIGALRM、SIGUSR1等等普通信号【信号
2016-12-15 16:29:55
456
原创 图像检索服务器编写问题记录——服务器端模型再思考
1.32bit系统,4G寻址空间,按线程栈10M来算(ulimit -a 查看stack size 默认为8192KB,即8M),系统最多支持400个线程。按原先的做法,将accept的套接字的缓冲区交由epoll监听,epoll监听到有数据之后,开新线程来处理。这样做有个两个大问题:【1】即使监听到了有新数据,由于新线程开不出来,还是没法处理数据,且因为EPOLLONESHOT的原因,再也没法收到读的信号,数据会一直卡在缓冲区中。【2】图
2016-12-14 10:34:43
721
原创 图像检索服务器编写问题记录——日志定时写回
上回写的日志系统,我发现在ctrl+\使服务器突然断开后,产生的日志并没有及时地写入到磁盘文件中,磁盘中的日志还是空白的,这样无法应对服务器异常崩溃地情况。于是在LOG类中,添加了writeback的方法。起先writeback中只是简单的调用fclose,然后在fopen日志文件,重定位到文件尾部。【结果】:文件是空白的。是的,fclose只是将文件在用户缓冲区的内容写入到了内核缓冲
2016-12-13 15:28:21
562
原创 图像检索服务器编写问题记录——拒绝可恶的编译器优化
今早将原先sever的纯c代码,改写成C++类,一运行,昨天好好的,改完之后就跑不起来了。于是查啊查,查了一早上,最终定位到LOG的MUTEX这边。非常奇怪的是当我在MUTEX的构造,析构函数中加入fprintf打印输出时,serv运行正常,但当我将fprintf注释掉后,serv就卡在那儿,下不去了。百试百灵,这还能忍?!!!谁干的坏事儿?,于是我将makefile中的-O2,编
2016-12-12 12:20:30
447
原创 图像检索服务器编写问题记录——日志系统问题记录
线程安全的日志系统主要利用的是c++对象生命周期来管理log,使得各个线程可以同步的在server_log文本文件中输出。LOG log定义成所有线程共享的变量,log有一把mutex,提供互斥的写server_log文件。使用MUTEX类可以很好的避免重复释放mutex,忘记释放mutex等等问题。明天得把原先的代码全改成class的。
2016-12-11 22:10:30
428
原创 图像检索服务器编写问题记录——epoll+多线程传输图片时的问题
上节在图片传输中,在主线程main中加入了epoll,结果和上上节的图片传输一结合,各种问题。【问题】:将套接字设置成非阻塞,然后在epoll检测到sockfd有新数据时创建线程进行处理。然后问题来了,小图片第一次传输成功,第二次传输不成功;大图片一次传输都不成功;服务端图片size第一次打印正常 ,第二次打印乱码。【解决步骤1】:于是将图片换成内容全是1和全是2的文本文件,来帮助检测。果
2016-12-11 15:30:42
747
1
原创 图像检索服务器编写问题记录——服务器端模型选择+epoll和非阻塞IO
0.服务器端模型选择大体思路是:在主线程中使用epoll承受高并发连接,在主线程中开辟工作线程用来处理就绪的描述符。嗯,这个原来有官名,叫反应者模式。事件驱动编程。另外工作线程处理的就绪的文件描述符最好是非阻塞的。
2016-12-09 22:24:44
422
原创 图像检索服务器编写问题记录——用socket传输图片
1.用readn代替read的原因为避免频繁的调用read。read调用系统调用,系统调用需要在用户态和核心态转换,需要保存上下文,频繁调用read,会使系统性能下降,in指标上升。为避免频繁调用read,我们在用户空间创建用户缓冲区,将套接字的缓冲区的内容全部读入用户缓冲区后,一次性把用户缓冲区的内容用read写入内核缓冲区。这样可以提高效率。相同的writen也是这个原因。ss
2016-12-08 22:17:49
554
原创 centos学习笔记--gdb调试部分
=======================================================================GDB调试部分=======================================================================-----调试普通程序------------------------------
2016-12-08 21:41:34
3022
原创 centos学习笔记--VIM学习部分
============================================================================VIM学习篇============================================================================------------
2016-12-05 22:08:00
341
原创 centos学习笔记--资源查看部分
===================================================================================资源查看部分===================================================================================
2016-12-05 22:00:20
847
原创 centos学习笔记--软件安装部分
==========================================================================================软件安装部分==========================================================================================--------
2016-12-05 21:52:06
322
原创 effective c++-资源管理
条款13:以对象管理资源(一)使用RAIIa) 使用RAII(resource acquisition is initialization)(资源获取时机就是初始化时机),即在构造函数中获取资源,在析构函数中释放资源。自己编写资源管理类时,要加上引用计数,引用计数不为0时,不能释放对象,不加引用计数在多线程下会产生析构的竞态。(二)C++ RAII应用实例:用于管理资源的三个智
2016-11-10 22:12:09
358
原创 effective c++-构造/析构/赋值运算
条款05:了解c++默默编写并调用哪些函数(一)c++默认产生a) 当程序员没有明确编写以下四个函数时。C++编译器会自动添加构造函数、复制构造函数、析构函数、赋值运算操作四个默认函数。这四个函数均是public的inline型的。若自己已经编写了上面四个中的某几个,那么编写的那几个,编译器就不会再自动生成了。(二)四个函数的调用时机a) 构
2016-11-10 11:35:49
395
原创 effective c++-让自己习惯c++
02:尽量用const,enum,inline替换define(一)【忠告】a) 对于常量,用const和enum代替defineb) 对于形似函数,用inline代替define(二)尽量替换掉define的原因:a) define A 1.63出错时,报1.63出错;const int A=1.63出错时,报A出错。显然报变量名出错更加容易调试
2016-11-09 16:52:50
319
原创 unix环境高级编程--进程环境与进程控制
1.进程环境a) 终止i. 进程终止1. 正常终止:return+exit、_exit系a) 【exit与_exit的区别】:exit退出时按atexit注册的相反顺序调用注册过的函数,对打开的流调用fclose将缓冲区的数据写到文件上(刷新缓冲区)。_exit没有b) 【exit与自然返回return的区别】:ret
2016-11-04 11:16:50
337
原创 unix环境高级编程--进程关系与守护进程
1.进程间关系与守护进程 1.进程,进程组,会话,终端之间的关系a) 进程一定在一个进程组之中,一个会话可以包括多个进程组。一个会话对应一个控制终端。b) 进程组存在理由:有了进程组id,就可以一下子kill一片的进程,方便管理c) 会话存在的理由:linux是一个多用户多任务的分时操作系统,必须要支持多个用户登录同一个操作系统,当一个用户登录一次终端时就会
2016-11-04 11:11:49
378
原创 unix网络编程--服务器模型选择
服务器编程模型1.单核多线程和多核多线程a) 单核多线程,在单个处理器上跑多个线程i. 无阻塞时,单核多线程并没什么效用,反而会因为多次切换上下文降低速度。相当于一个人边切苹果,边切梨,频繁切换。ii. 有IO阻塞时,充分利用。相当于一个人边切苹果,边烧水。b) 多核多线程,在多个处理器上跑多个线程i. 无阻塞时,很有
2016-11-02 20:32:19
372
原创 unix环境高级编程--线程同步
线程同步手段a) 概要i. 包括互斥量、读写锁、条件变量、自旋锁、屏障。ii. 上述锁都可以通过各自的属性对象设置锁的属性,并且都具有进程共享属性。所谓进程共享属性:也即进程们通过nmap享有一块共享内存。当需要对共享内存中的东西进行同步时,就需要锁,开启锁们的进程共享属性,就可以在共享内存中分配锁,从而达到同步多进程访问共享内存的某个东西的效果。iii. 进阶
2016-11-01 17:38:25
471
原创 unix环境高级编程--进程间通信机制
1.进程间通信机制a) 管道(管道引用结束,管道中内容全部删除)【读写内核缓冲区】i. 缺点:只能承载无格式字节流;缓冲区大小受限ii. 匿名管道(数据通过内核流通、双向流通需要两条管道(或popen,pclose))1. 半双工、只能在具有血缘关系的进程之间使用2. 匿名管道会在关闭两端之后由系统自动
2016-11-01 17:26:26
490
原创 unix环境高级编程--IO
1.IO模型a) IO操作分为两步:1.等待数据(可以复制了);2.从内核复制准备好的数据b) 【同步IO】包括【阻塞式IO】、【非阻塞式IO】、【IO复用】和【信号驱动式IO】。这四种IO的区别在于第一阶段——等待数据。阻塞式IO是一直傻等,非阻塞式IO如果数据未准备好,那么返回错误。IO复用打包一众非阻塞式描述字,大家一块儿等,直到有一个描述字准备好了。信号驱动式IO,安装
2016-11-01 17:17:10
428
转载 五子棋(人机)-只算杀棋
电脑只走杀棋,如果没有杀棋,就走优先级最高的空子。玩家搜索白子、黑子的所有杀招,根据优先级,可以通过自己走杀招的方式迫使电脑防守,放弃杀招;也可以占电脑杀招的空子,来破解对方杀招。参考:http://blog.csdn.net/lihongxun945/article/details/50730231这种解法:在没有杀招的时候,取优先级最高的子了事。有杀招的情况下,针对杀招向后推算,直
2016-09-22 21:21:53
2505
原创 五子棋(人机)-空子产生的序列的优化
大量参考:http://blog.csdn.net/lihongxun945/article/details/50668622alpha-beta剪枝极其依赖于空子的序列。如果先搜索到极小的alpha,那么后面很多分支也就都可以剪掉了。相反,如果极小的alpha是最后遇到,其他子也几乎是逆序,那么alpha剪枝基本就没剪。所以此处博文作者提出,需要对空子的产生序列进行优化,以达到剪枝最好的
2016-09-22 11:57:43
1036
原创 leetcode解题总结(持续更新)
树型:DFS或BFS(不够+状态存储,缩短时间)(如数位DP,就是DFS+状态存储)链表:多用two pointer无序数组:hash映射(O(1),map,set等),并查集,字典树tire有序数组:二分查找棋牌类游戏博弈树:极大极小值算法,alpha-beta剪枝
2016-09-21 20:53:27
1369
原创 五子棋(人机)-alpha-beta剪枝
alpha:表示目前为止找到的最小数beta:表示目前为止找到的最大数1.极大层的上一层是极小层。一方面极大层找的是自己的子节点中的最大值,另一方面极大层的上一层找的是极大层们提供的节点中的最小一个。2.如果极大层已经遍历完整一个子树,得到子节点值为tmp,那么就表示该极大层向上提供的节点值至少大于等于tmp(因为极大层向上返回的是孩子中的最大值)3.如果tmp已经大于了极大层上一
2016-09-21 18:36:17
10520
原创 五子棋(人机)-极大极小值搜索算法
从人落子开始到出现胜负或者和局,之间所落的子,构成了一个解。而解空间就是一个树,解就是这解空间中的一条路径。只不过这个解空间是电脑的选择和人的选择共同构成的(奇数层是电脑(因为轮到电脑落子么),偶数层是人)。极大极小值搜索算法,来搜索(回溯)这个解空间:它假设人和电脑都是极其聪明的,他们都会选择出最优的一步。但是搜索整棵树是不现实的,16*16!指数级,所以只回溯n步,即这个AI考虑的是N
2016-09-20 22:11:15
16146
3
原创 五子棋(人机)-粗暴版AI
根据五子棋黑白子的摆法,大致分为下列几种情况:A为黑(白)子,X为空格成五:AAAAA活四:XAAAAX死四:XAAAA或AAAAX活三:XAAAX死三:XAAA或AAAX活二:XAAX死二:XAA或AAX活一:A死一:XA或AX-----------------------------------------------------------------------
2016-09-20 21:24:21
12940
3
原创 object model-关于对象
c++对象模型1.对象的存储模型a) 对象的构成i. 类中包含static、nostatic成员变量和static、nostatic、virtual成员函数。在对象中仅仅存放【nostatic成员变量】和指向virtual成员函数的表的【虚表指针】以及一个【type_info对象实际类型】,static成员自然存储在全局静态区,而普通成员函数,则会以Point::float x()
2016-08-16 16:34:29
709
原创 c++ base-操作符重载
操作符重载包括两种形式类成员函数实现操作符重载和友元函数实现操作符重载之所以是这两种,是因为只有类的成员函数和友元函数才能访问类的私有变量,而显然操作符重载时,需要操作类的成员数据,如果成员数据是私有的,那么要么重载方法是类的成员函数,要么是类的友元函数,要么专门写一堆操作成员函数来实现(非成员函数非友元函数的重载操作符函数)来访问类的私有变量。a.类成员函数实现操作符重载
2016-08-15 09:59:29
481
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人