Socket/multi Thread
turkeyzhou
某互联网公司,从事服务器后台开发。
展开
-
epoll精髓
在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __原创 2010-10-05 14:25:00 · 1308 阅读 · 0 评论 -
内存池技术介绍
看到一篇关于内存池技术的介绍文章,受益匪浅,转贴至此。 原贴地址:http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html 6.1 自定义内存池性能优化的原理 如前所述,读者原创 2011-09-09 19:57:11 · 1108 阅读 · 0 评论 -
JAVA的并发你不得不知道的
1. 同步方法或同步代码块?您可能偶尔会思考是否要同步化这个方法调用,还是只同步化该方法的线程安全子集。在这些情况下,知道 Java 编译器何时将源代码转化为字节代码会很有用,它处理同步方法和同步代码块的方式完全不同。当 JVM 执行一个同步方法时,执行中的线程识原创 2011-09-09 21:27:57 · 2833 阅读 · 1 评论 -
LInux Tcp 延迟确认问题
案例一:同事随手写个压力测试程序,其实现逻辑为:每秒钟先连续发N个132字节的包,然后连续收N个由后台服务回显回来的132字节包。其代码简化如下:char sndBuf[132];char rcvBuf[132];while (1) { fo原创 2011-09-09 17:01:40 · 20684 阅读 · 0 评论 -
网站加速--服务器编写篇
优化你的网卡, 这一节有些关于大流量网卡的优化方法,值得学习借鉴。原文请移步http://blog.sina.com.cn/s/blog_466c66400100bi2n.html--------------------以下为正文---------------------原创 2011-09-09 20:20:32 · 1353 阅读 · 0 评论 -
Linux服务器性能评估和优化
转载:http://www.517sou.net/Article/104.aspx 一、影响Linux服务器性能的因素 1. 操作系统级 Ø CPU Ø 内存Ø 磁盘I/O带宽Ø 网络I/O带宽原创 2011-09-09 19:51:31 · 1336 阅读 · 0 评论 -
Linux下高并发Tcp需要突破的限制
1、修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的 限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一原创 2011-09-09 19:36:54 · 1930 阅读 · 0 评论 -
Java 的线程dump
Java 的线程dump以及jstack的使用转载 2011-04-06 00:33:00 · 1271 阅读 · 0 评论 -
关注性能:等待泄漏
某些类型的 bug 经常落到性能调优师手中来进行修复,虽然严格地讲,它们算不上是性能问题。通常由对象泄漏造成的内存不足就是这类 bug 中的一个。(在本专栏前面的一期中介绍过如何在“垃圾对话(Trash talk)”中处理这些问题,请参阅 参考资料。)另外一类经常落到性能调优师手上修补的 bug 就是线程死锁和其他线程方面的问题,例如竟态条件,因为这些问题一般只在对程序进行负载测试时才会表现出来。 将这些 bug 交到性能调优师手中通常有很好的理由:识别和清除性能及内存瓶颈所需要的工具,与识别对象泄转载 2011-04-06 00:43:00 · 808 阅读 · 0 评论 -
重温TCP状态变迁
<br /><br />状态:描述<br />CLOSED:无连接是活动的或正在进行<br />LISTEN:服务器在等待进入呼叫<br />SYN_RECV:一个连接请求已经到达,等待确认<br />SYN_SENT:应用已经开始,打开一个连接<br />ESTABLISHED:正常数据传输状态<br />FIN_WAIT1:应用说它已经完成<br />FIN_WAIT2:另一边已同意释放<br />ITMED_WAIT:等待所有分组死掉<br />CLOSING:两边同时尝试关闭<br />TIME_W原创 2011-01-02 23:45:00 · 1918 阅读 · 0 评论 -
MMORPG服务器架构雏形猜测
MMORPG服务器架构雏形猜测原创 2010-10-23 09:52:00 · 986 阅读 · 0 评论 -
Nagle算法
根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。Nagle算法,由Ford Aerospace And Communications Corporation Congestion Control in IP/TCP internetworks(IETF RFC 896)(1984)定义,最初是用于缓冲Ford的私有TCP/IP网络拥塞情况,不过被广泛传播开来。转载 2010-10-15 01:57:00 · 907 阅读 · 0 评论 -
并发处理模型, 从 Reactor 到 Coproc
http://randomtaste.appspot.com/view/page/coproc简介本文介绍一个正在开发的 C++ 服务框架 coproc 在并发处理模型上的设计思路. coproc 基于 libevent 和基本的 Reacto原创 2011-09-09 20:17:21 · 3429 阅读 · 0 评论 -
网络IO模型
最基本的网络IO1 文件描述符-socket(int domain, int type, int protocol);-bind(int sockfd, struct sockaddr *my_addr, int addrlen); 2 服务端-listen(原创 2011-09-09 20:18:26 · 5016 阅读 · 0 评论 -
Redis内存使用优化与存储
作者田琪 转载自www.infoq.com/cnRedis最为常用的数据类型主要有以下五种:StringHashListSetSorted set在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的:首先原创 2011-08-21 08:41:51 · 2202 阅读 · 0 评论 -
makefile函数集锦
Makefile 常用函数表一、字符串处理函数1.$(subst FROM,TO,TEXT)函数名称:字符串替换函数—subst。函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”。返回值:替换后的新字符串。2.$(patsubst PATTERN,REPLACEMENT,TEXT)函数名称:模式替换函数—patsubst。函数功能:搜索“TEXT”中原创 2013-02-26 11:10:47 · 1746 阅读 · 0 评论 -
linux信号锁的封装与实现
信号量的值与相应资源的使用情况有关,当它的值大于 0 时,表示当前可用的资源数的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变。 在 Linux 下,PV 操作通过调用semop函数来实现。该函数定义在头文件 sys/sem.h中,原型如下: int semop(int semid,struct原创 2013-02-25 17:15:10 · 2765 阅读 · 0 评论 -
linux select 多路复用机制
函数作用:系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、原创 2013-02-25 14:18:45 · 38442 阅读 · 8 评论 -
LINUX 共享内存越界
shmget的时候,我们能指定共享内存的size,当size越界的时候,会如何呢?如下:/* * ShareMem.h * * Created on: 2013-2-25 * Author: coreycui */#ifndef SHAREMEM_H_#define SHAREMEM_H_#include #include #include原创 2013-02-25 11:07:56 · 2696 阅读 · 0 评论 -
linux共享内存
共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。一、应用共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()转载 2013-02-25 10:52:30 · 1043 阅读 · 0 评论 -
mutex和cond为何需要配合使用
pthread_cond_wait总和一个互斥锁结合使用。在调用pthread_cond_wait前要先获取锁。pthread_cond_wait函数执行时先自动释放指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量重新锁住。int pthread_cond_signal(pthread_cond_t * cond);pthread_cond_signal通过原创 2013-02-23 19:32:23 · 6485 阅读 · 0 评论 -
linux文件锁实现
linux文件锁是默认的劝告锁。以下证实两点:1)读写锁分别的排他性。2)当文件上锁区域交叉时的锁竞争关系。FIleMutex.h:class FileMutex {public: FileMutex(const string& filename); virtual ~FileMutex(); int lockR(int offset,int len);原创 2013-02-24 23:38:14 · 1672 阅读 · 0 评论 -
Linux 2.6 中的文件锁
在多任务操作系统环境中,如果一个进程尝试对正在被其他进程读取的文件进行写操作,可能会导致正在进行读操作的进程读取到一些被破坏或者不完整的数据;如果两个进程并发对同一个文件进行写操作,可能会导致该文件遭到破坏。因此,为了避免发生这种问题,必须要采用某种机制来解决多个进程并发访问同一个文件时所面临的同步问题,由此而产生了文件加锁方面的技术。早期的 UNIX 系统只支持对整个文件进行加锁,因此无转载 2013-02-24 13:31:42 · 861 阅读 · 0 评论 -
C++线程锁封装
C++线程锁的封装,主要提供lock,unlock,require等操作,需要注意的是线程重复获取锁的问题,设置了一个count的计数器,该计算器之所以不考虑++,--的原子操作的问题,是因为该计数器本身就在lock与unlock中,所以本身是线程安全的。另外mutable count是将count的变化操作防止在const方法中,保证方法语义。class TC_T原创 2013-02-22 18:20:21 · 2951 阅读 · 0 评论 -
在避免死锁的同时确保线程继续
C/C++ Users Journal October, 2004锁无关的(Lock-Free)数据结构在避免死锁的同时确保线程继续 Andrei Alexandrescu刘未鹏 译Andrei Alexandrescu是华盛顿大学计算机科学系的在读研究生,也是《Modern C++ Design》一书的作者。他的邮箱是 andrei@metalanguage.com。转载 2013-01-15 16:55:04 · 1845 阅读 · 0 评论 -
无锁的 ( lock-free ) 线程安全算法
Lock-free 算法的基础是 CAS (Compareand-Swap) 原子操作。当某个地址的原始值等于某个比较值时,把值改成新值,无论有否修改,返回这个地址的原始值。目前的cpu 支持最多64位的CAS。并且指针 p 必须对齐。 注:原子操作指一个cpu时钟周期内就可以完成的操作,不会被其他线程干扰。一般的 CAS 使用方式是:假设有指针 p, 它指向一个 32 位或者64原创 2013-01-15 16:39:21 · 1054 阅读 · 0 评论 -
epoll的适应场景
epoll的适应场景原创 2010-10-10 09:02:00 · 1269 阅读 · 0 评论 -
数据库和海量数据
一些经验的总结,看到了深有同感,转载一下。转载 2010-10-03 14:32:00 · 1021 阅读 · 0 评论 -
epoll和select/poll的区别
epoll和select/poll的区别转载 2010-10-05 12:50:00 · 709 阅读 · 0 评论 -
CountDownLatch同步调用,可用于单机版MapReduce
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。 CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLa原创 2010-07-16 21:37:00 · 969 阅读 · 0 评论 -
JAVA多线程CyclicBarrier应用
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。转载 2010-07-14 08:20:00 · 4122 阅读 · 1 评论 -
Tomcat 系统架构与设计模式,第 1 部分: 工作原理
这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式。本文是第 1 部分,将主要从 Tomcat 如何分发请求、如何处理多用户同时请求,还有它的多级容器是如何协调工作的角度来分析 Tomcat 的工作原理,这也是一个 Web 服务器首要解决的关键问题。转载 2010-06-27 23:46:00 · 1447 阅读 · 0 评论 -
Comet:基于 HTTP 长连接的“服务器推”技术
文档选项 将此页作为电子邮件发送级别: 中级周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室2007 年 8 月 31 日很多应用譬如监控、即时通信、即时报价系统都需要转载 2010-04-27 09:09:00 · 1538 阅读 · 0 评论 -
记一次HTTP 服务实战
1. 引子今日来,由于手机终端需要通过CMWAP HTTP访问服务器,服务器这边必须解析HTTP请求,并且进行协议解析,进行业务操作,将结果反馈至手机终端。 由于手机终端机遇WTK,采用HttpConnection,故服务器必须能够读取http request body中的信息进行协议解析; 2. 解析Request下面是从firebug中抓原创 2010-04-26 16:12:00 · 1917 阅读 · 0 评论 -
实战WEB 服务器(JAVA编写WEB服务器)
一、超文本传输协议 1.1 HTTP请求 1.2 HTTP应答 二、Socket类 三、ServerSocket类 四、Web服务器实例 4.1 HttpServer类 4.2 Request类 4.3 Response类 五、编译和运行 =================== 正文: ===================原创 2010-04-21 17:09:00 · 25004 阅读 · 28 评论 -
JAVA socket 关于DNS 缓存
在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作。在Java中为了缓解这个问题,提供了DNS缓存。当InetAddress类第一次使用某个域名(如www.csdn.net)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中。当下一次InetAddress类再使原创 2010-04-21 13:06:00 · 6651 阅读 · 1 评论 -
SO参数
最近在用Socket做一个文件传输系统,遇到一个奇怪的现象,接收端到了最后总是接收不到发送端的数据。经过一番努力,还是找到了原因。Socke的SO_SNDBUF默认为8K,尽管关闭了TCP_NODELAY,但还是要达到8K才发送出去。 转载一篇Socket类选项的说明文章: http://java.chinaitlab.com/net/786337.html 二、用于获得和设置Socket转载 2010-04-21 01:34:00 · 2935 阅读 · 0 评论 -
Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制
新的锁定类提高了同步性 —— 但还不能现在就抛弃 synchronized文档选项打印本页将此页作为电子邮件发送级别: 初级Brian Goetz (b原创 2009-12-21 16:14:00 · 610 阅读 · 0 评论 -
JAVA Socket用法详解
本篇文章观点和例子来自 《Java网络编程精解》, 作者为孙卫琴, 出版社为电子工业出版社。 在客户/服务器通信模式中, 服务器端需要创建监听端口的 ServerSocket, ServerSocket 负责接收客户连接请求. 本章首先介绍 ServerSocket 类的各个构造方法, 以及成员的用法, 接着介绍服务器如何用多线程来处理与多个客户的通信任务. 本章提供线转载 2009-12-14 23:42:00 · 11793 阅读 · 1 评论 -
socket使用代理连接以及传输对象
如何通过socket代理来访问服务端:String proxyHost = "192.168.204.212"; String proxyPort = "1080"; //通知Java要通过代理进行连接。 System.getProperties().put("socksProxySet","true"); //指定代理所在的机器转载 2009-12-16 08:49:00 · 2224 阅读 · 1 评论