linux网络编程
文章平均质量分 61
一直在路上25
热爱技术,坚持才是硬道理
展开
-
epoll多线程惊群
epoll在多进程下产生的“惊群”现象_如何避免_多进程因为文件描述符继承问题导致 问题: 有一个单进程的linux epoll服务器程序,近来希望将它改写成多进程版本, 主要原因有: 1、在服务高峰期间 并发的 网络请求非常大,目前的单进程版本的支撑不了:单进程时只有一个循环先后处理ep转载 2014-08-28 09:26:03 · 2633 阅读 · 0 评论 -
epoll小结
epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。一、epoll的优点支持一个进程打开大数目的socket描述符。IO效率不随FD数目增加而线性下降。内核微调。二、epoll的使用epoll有2种工作方转载 2014-07-23 15:51:36 · 545 阅读 · 0 评论 -
僵尸线程
pthread_join():使一个线程等待另一个线程结束pthread_self():获得自身的线程号pthread_create():创建一个新的线程pthread_detach():设置线程为可分离状态,pthread有两种状态joinable状态和unjoinable状态pthread_exit():通过自身来结束线程,并释放资源pthread_ca转载 2014-05-21 16:35:43 · 8328 阅读 · 3 评论 -
一个线程池的简单的实现
线程池实现:用于执行大量相对短暂的任务当任务增加的时候能够动态的增加线程池中线程的数量直到达到一个阈值。当任务执行完毕的时候,能够动态的销毁线程池中的线程该线程池的实现本质上也是生产者与消费模型的应用。生产者线程向任务队列中添加任务,一旦队列有任务到来,如果有等待线程就唤醒来执行任务,如果没有等待线程并且线程数没有达到阈值,就创建新线程来执行任务。原创 2014-05-28 16:54:16 · 1169 阅读 · 0 评论 -
POSIX条件变量
当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。原创 2014-05-27 22:31:22 · 781 阅读 · 0 评论 -
线程基础知识
什么是线程:原创 2014-05-21 13:02:54 · 834 阅读 · 0 评论 -
POSIX 共享内存
POSIX共享内存相关函数:shm_open函数功能:用来创建或打开一个共享内存对象原型int shm_open(const char *name, int oflag, mode_t mode); 参数name:共享内存对象的名字oflag:与open函数类似,可以是O_RDONLY、O_RDWR,还可以按位或上O_CREAT、O_EXCL、O_T原创 2014-05-20 18:53:42 · 987 阅读 · 0 评论 -
POSIX信号量与互斥锁
POSIX信号量相关函数:sem_opensem_closesem_unlinksem_initsem_destroysem_waitsem_postPOSIX互斥锁pthread_mutex_initpthreaad_mutex_lockpthread_mutex_unlockpthread_mutex_原创 2014-05-27 20:46:11 · 888 阅读 · 0 评论 -
Epoll VS IOCP
1 Epoll vs. IOCPEpoll 和 IOCP 都是为高性能网络服务器而设计的高效 I/O 模型;都是基于事件驱动的。事件驱动有个著名的好莱坞原则(“不要打电话给我们,我们会打电话给你”)。 不同之处在于:1. Epoll 用于 Linux 系统;而 IOCP 则是用于 Windows ;(啊,好大的鸡蛋 … ) 2. Epoll 是当事件资源满足时发出可处理通知转载 2014-07-21 11:17:13 · 897 阅读 · 0 评论 -
linux epoll解析
1. Epoll是何方神圣?Epoll可是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select相似,其实都I/O多路复用技术而已,并没有什么神秘的。其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnecti转载 2014-07-21 11:13:39 · 498 阅读 · 0 评论 -
epoll底层细节
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢? 先简单回顾下如何使用C库封装的3个epoll系统调用吧。转载 2014-07-26 16:47:10 · 1537 阅读 · 0 评论 -
libevent的使用
这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的函数(或接口)并向系统注册,然后在需要的时候只向系统提交读写的请求之后就继续做自己的事情,实际的读写操作由系统在合适的时候调用我们程序注册的接口进行。异步编程会给一些程序猿带来一些理解和编写上的困难,转载 2014-08-01 14:37:05 · 727 阅读 · 0 评论 -
linux中select的用法
Select可以监控多个文件句柄,监控文件内容的变化,比如可读可写状态的改变,利用select可以实现非阻塞而不会让线程挂起,提高系统的运行效率。比如可以同时 监控 键盘输入和鼠标输入,如果键盘有信号,可以去操作键盘,如果鼠标有信号,去处理鼠标事件,如果都没有信号,则可以不让线程挂起而继续向下执行。1、 所需头文件:#include #include转载 2014-07-10 16:03:03 · 721 阅读 · 0 评论 -
未初始化和非法的指针
下面这个代码说明了一个极为常见的错误:int *a;...*a = 12;jin原创 2014-08-28 16:45:41 · 2080 阅读 · 0 评论 -
epoll实例
服务端调试:[test@cs2 epoll]$ g++ epoll_server.cpp -o epoll_server -lpthread[test@cs2 epoll]$ ./epoll_serverconnec_ from >> 0.0.0.0reading!read from client: 1reading!Client close connect转载 2014-08-22 14:43:16 · 632 阅读 · 0 评论 -
互斥量的使用
几个重要的函数:#include int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr); //初始化mutexint pthread_mutex_destroy(pthread_mutex_t *mutex); //如果mutex是动转载 2014-08-07 19:47:38 · 594 阅读 · 0 评论 -
select详解
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式原创 2014-08-21 16:37:52 · 692 阅读 · 0 评论 -
套接字如何发送整形数据
服务器端:send(fd,(char*)&data_size,4,0);std::cout客户端原创 2014-07-31 15:29:45 · 798 阅读 · 0 评论 -
写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别
当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。《 IO - 同步,异步,阻塞,非阻塞 》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的那篇link 。写完之后发现很多人都很喜欢,我还是非常开心的,也说明这个问题确实困扰了很多人。随着学习的深入,渐渐的感觉原来的理解有些偏差,但是还是没引起自己的重视,觉着都是一些小错误,无伤大雅。直到转载 2014-07-30 17:58:24 · 5846 阅读 · 2 评论 -
条件变量的使用
1.初始化条件变量pthread_cond_init#include int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的转载 2014-08-04 20:47:31 · 1025 阅读 · 0 评论 -
linux下多线程编程
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们转载 2014-08-04 19:59:38 · 501 阅读 · 0 评论 -
select模型的使用
阻塞和非阻塞 阻塞函数在完成其指定的任务以前不允许程序调用另一个函数。例如,程序执行一个读数据的函数调用时,在此函数完成读操作以前将不会执行下一程序语句。 当服务器运行到accept语句时,而没有客户连接服务请求到来,服务器就会停止在accept语句上等待连接服务请求的到来。这种情况称为阻塞 (blocking)。而非阻塞操作则可以立即完成。比如,如果你希望服务器仅仅注意检查是否有客户在等待转载 2014-07-30 19:52:32 · 673 阅读 · 0 评论 -
POSIX线程(2)
线程属性初始化与销毁属性int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);获取与设置分离属性int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachsta原创 2014-05-23 08:46:31 · 861 阅读 · 0 评论 -
POSIX线程(1)
POSIX线程库:与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的要使用这些函数库,要通过引入头文链接这些线程函数库时要使用编译器命令的“-lpthread”选项pthread_create函数功能:创建一个新的线程原型int pthread_create(pthread_t *thread, cons原创 2014-05-21 19:54:17 · 1024 阅读 · 0 评论 -
共享内存区
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。mmap函数功能:将文件或者设备空间映射到共享内存区。原型void *mmap(void *addr, size_t len, int prot, int flags, in原创 2014-05-18 14:24:51 · 996 阅读 · 0 评论 -
进程间通信的介绍
顺序程序特征顺序性q封闭性:(运行环境的封闭性)q确定性q可再现性q并发程序特征q共享性q并发性q随机性原创 2014-05-17 09:05:14 · 678 阅读 · 0 评论 -
System V信号量(1)
信号量和P、V原语由Dijkstra(迪杰斯特拉)提出信号量互斥:P、V在同一个进程中同步:P、V在不同进程中信号量值含义S>0:S表示可用资源的个数S=0:表示无可用资源,无等待进程S信号量struct semaphore{int value;pointer_PCB queue;}P原语P(s)原创 2014-05-19 09:43:41 · 979 阅读 · 0 评论 -
socket编程中recv与send函数
recv函数会将套接字缓冲区中的内容读出,但不清空,与read函数的区别在此。此函数有一个flag标志位,设为MSG_PEEK。send函数会将缓冲区中的内容写入到套接字,也不清空,与write函数的区别在此。用这两个函数可以先接收或发送缓冲区中的内容,然后再用readn(此时缓冲区中的内容依然存在)与write函数去继续判断换行符/n,对缓冲区内容实现换行输出。echocli.c原创 2014-05-11 19:17:15 · 2101 阅读 · 0 评论 -
SIGPIPE信号
往一个已经接收FIN的套接中写是允许的,接收到FIN仅仅代表对方不再发送数据。在收到RST段之后,如果再调用write就会产生SIGPIPE信号,对于这个信号的处理我们通常忽略即可。signal(SIGPIPE, SIG_IGN);转载 2014-05-11 19:16:53 · 1083 阅读 · 0 评论 -
UNIX域协议
echocli.c#include #include #include #include #include #include #include #include #define ERR_EXIT(m) \ do \ { \ perror(m); \ exi原创 2014-05-15 16:20:19 · 945 阅读 · 0 评论 -
UDP编程
套接口具有两个属性:本地地址 get远程地址原创 2014-05-15 09:56:48 · 770 阅读 · 0 评论 -
UNIX进程之间传递文件描述符recvmsg与sendmsg
sendfd.c#include #include #include #include #include #include #include #include #include #define ERR_EXIT(m) \ do \ { \ perror(m); \原创 2014-05-15 22:12:35 · 1418 阅读 · 0 评论 -
UDP聊天室
实现的一个UDP聊天室原创 2014-05-15 16:17:16 · 1197 阅读 · 2 评论 -
System V共享内存
shmread.c#include #include #include #include #include #include #include #include #include #include #include #define ERR_EXIT(m) \ do \ { \原创 2014-05-18 16:42:14 · 682 阅读 · 0 评论 -
System V消息队列(2)
msgsnd函数原创 2014-05-18 09:58:54 · 706 阅读 · 0 评论 -
System V的消息队列(1)
消息队列:消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)原创 2014-05-18 09:30:33 · 791 阅读 · 0 评论 -
POSIX 消息队列
POSIX消息队列相关函数:mq_open函数功能:用来创建和访问一个消息队列原型mqd_t mq_open(const char *name, int oflag);mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);参数name: 某个消息队列原创 2014-05-20 18:53:29 · 1037 阅读 · 0 评论 -
select在并发中的两点限制与poll函数的使用
用select实现的并发服务器,能达到的并发数,受两方面限制一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。select中的fd_set集合容量的限制(FD_SETSIZE) ,这需要重新编译内核。原创 2014-05-13 19:44:08 · 1239 阅读 · 0 评论 -
用信号量解决生产者消费者问题
用信号量解决生产者消费者问题:ipc.h#ifndef _IPC_H_#define _IPC_H_#include #include #include #include #include #include #include #include #include #define ERR_EXIT(m) \ do \原创 2014-05-19 19:22:42 · 2925 阅读 · 0 评论 -
System V信号量(3)
用System V信号量解决哲学家就餐问题:#include #include #include #include #include #include #include #include #include #include #include #include #include union semun {int原创 2014-05-19 14:52:44 · 920 阅读 · 0 评论