随笔分类 - 网络编程
摘要:考虑以下这种情形: 目前有若干个消费者,一个生产者,现在流水线队列中已满,生产者在: 生产者在notFull.wait()中陷入阻塞。 此时某个消费者拿走了一个产品,并通过notFull.notify()通知生产者队列未满,可以生产。 生产者从wait中醒来,再次竞争锁。 但很不幸,这个锁再次被另外
阅读全文
摘要:EPOLLSHOT的作用主要用于多线程中 epoll在某次循环中唤醒一个事件,并用某个工作进程去处理该fd,此后如果不注册EPOLLSHOT,在该fd时间如果工作线程处理的不及时,主线程仍会唤醒这个时间,并另派线程池中另一个线程也来处理这个fd。 为了避免这种情况,需要在注册时间时加上EPOLLSH
阅读全文
摘要:首先看UnassignGuard类的结构: 可以看到UnassignGuard类中成员只有一把锁,接口只有一个构造函数和一个析构函数。 构造函数的特点是对该锁的持有者清0,析构函数的特点是设置该锁的持有者线程。 关于UnassignGuard,它是配合条件变量来使用的。 首先我们看下条件变量,一般使
阅读全文
摘要:https://yq.aliyun.com/articles/495842?spm=a2c4e.11153940.0.0.61cf4d40BBz2x2 首先上转帖,这篇文章讲的很透彻了。 ET与LT触发的区别: 红线:fd状态改变是才会触发。那么什么情况会导致fd状态的改变呢? 对于读取操作: (1
阅读全文
摘要:首先关于条件变量的引入: 假想在这样的情况下,多个线程需要等待某个条件才能继续工作(如生产者消费者模型中,消费者需要等待流水线上有产品后才能消费),如果只使用互拆锁,则多个线程要不停的查询流水线是否为空这个状态,并且查询这个操作需要加入临界区,因为流水线不仅同时有多个消费者,还有生产者在生产,不加锁
阅读全文
摘要:https://www.cnblogs.com/doit8791/p/7461479.html https://www.jianshu.com/p/7e023dd5fb79
阅读全文
摘要:多进程版本相对也很简单,父进程负责接收和转换套接字,接收后Fork出子进程去处理页面请求和返回所需求的页面。 首先是父进程: 父进程Accept后不对请求进行处理,而是直接关闭所连接的套接字 这是因为for后,父子进程间的文件描述符只是拷贝,他们都指向同一个套接字,对父进程来说,这个主动套接字是多余
阅读全文
摘要:rio: rio是一个结构体,rio结构体的作用是提供一个自己设置的IO缓冲区,从sockfd表示的文件中的接收缓冲区中读取数据到rio中,rio相当于一个中转站,获得对端写到sockfd中的数据时,首先将数据读取到rio维护的缓冲区中,然后再从rio维护的缓冲区读取到用户空间指定的区域中。 这个过
阅读全文
摘要:UNP中第72~73页中将read函数封装为了readn与readline函数。 readn用于读取n个字节到vptr中,readline用于读取一行数据到vptr中。 为什么要将read函数封装为readn与readline呢? 这是因为在文件类型为socket文件时,使用read和write进行
阅读全文
摘要:三次握手: 第一次握手: 客户端:首先客户端发起连接,在TCP层封装的包内设置标志位SYN,同时产生一个随机32位序号(举例为1000),发送给服务器端。 服务端:服务器端接受后,首先检测标志位SYN是否为1,若为1则说明接受成功。 第二次握手: 服务端:服务端也往回发送一个包,在包的TCP层设置标
阅读全文