- 博客(13)
- 收藏
- 关注
原创 Linux高性能服务器编程9-3ET和LT模式区别
LT(水平模式):事件如果没有被处理完会多次触发。ET(边沿模式):事件只会触发一次。可以看到,ET只触发了一次。
2024-01-25 09:50:19 365
原创 Linux高性能服务器第八章总结
现在假如你是领导,需要找人干活,需要一个人去写本子,一个人去跑腿取外卖,现在找了一个助理,你告诉他需要写本子和取外卖,他就把材料收集好放到需要写本子的人的办公室,告诉他写本子,并把外卖送进你的办公室,通知你吃外卖。因此模拟的Proactor就是使用线程注册完事件后,当需要读写数据时,主线程去读写,并将封装好的数据发送给工作进程进行处理,这样对于工作进程来说,注册的就是完成事件。这种是高效的半同步/半异步模型,主线程直接对工作线程分发连接套接字,工作线程被主线程唤醒工作,这样不需要竞争请求队列了。
2024-01-24 19:36:18 329
原创 Linux高性能服务器编程8-3自动状态机:HTTP请求的读取和分析
主状态机第一个状态是请求行。请求行需要首先判断是否是GET,其次判断URL是不是正确的(即http://开头,同时后面有一个’/‘),最后判断HTTP版本是不是HTTP/1.1。随后处理头部字段,头部字段每个都是一行(这个HTTP请求示例是空格,我说怎么和服务器处理逻辑对不上…如果是"\0",代表整个请求处理结束(这点很坑,在处理行时需要额外判断,否则会卡住,搞了半天…由于我们一边需要处理HTTP请求,一边还要判断请求是否正确,所以设置两个状态机,一个状态机负责HTTP的状态,一个状态机负责请求行的状态。
2024-01-24 17:24:59 832
原创 Linux高性能服务器第六章高级IO总结
dup可以用来实现对终端的输出,因为终端的标准文件描述符值为1,将其关闭,再复制一个文件描述符,即可将终端的输入输出与该文件描述符联系起来。其中输入的文件描述符必须为一个有实际值的文件描述符,不能是管道和套接字,输出的文件描述符必须是socket。专门用于操作文件描述符属性的函数。dup用来复制一个文件描述符,会选择当前最小的文件描述符作为当前文件描述符的复制。管道的内存容量有限,如果管道满了,写操作将阻塞,如果管道空了,读操作将阻塞。值得注意,dup复制的文件描述符不继承原有的文件描述符属性。
2024-01-23 10:47:58 409 1
原创 Linux高性能服务器编程6-5tee函数
书中给了一个同时输出到文件和终端的案例。tee就像是粘合剂,将两个管道口粘在了一起。splice更像是管道和文件描述符的粘合剂,tee是两个管道专用粘合剂。如果没有粘合剂,就没法从管道向外零拷贝输送消息。tee函数可以实现在两个管道描述符间零拷贝复制数据。
2024-01-23 10:33:28 381 1
原创 Linux高性能服务器编程6-4splice回射服务器
回射服务器使用一个管道,管道的两端全连接到客户端的文件描述符,这样客户端输出的数据直接从管道再流回去。1.如果输入的文件描述符是管道,则偏移量必须为NULL。2.splice的输入和输出中必有一个文件描述符是管道。spilce可以实现在两个文件描述符间零拷贝。服务器没什么显示效果就不放了。
2024-01-23 10:11:03 665 1
原创 Linux高性能服务器编程6-3sendfile
sendfile发送数据可以不用从内核空间到用户空间,再从用户空间发送给客户端;直接从文件中读取后发送,也就是说在代码中不需要读取到一个char数组,再发送char数组(代码48行)。同时,sendfile还有两个特性是输出文件描述符必须是socket,输入描述符不能是socket,必须是一个指向实体的文件描述符。本节使用sendfile从服务器向客户端发送数据。客户端代码直接使用6-2的即可。
2024-01-23 09:30:32 332 1
原创 Linux高性能服务器编程6-1简单CGI实现
主要思路是关闭服务器端的标准输出,同时使用dup复制一个客户端的连接文件描述符占用值为1的文件描述符,printf就会直接输出到客户端。书中的代码我感觉少关闭了dup复制的文件描述符,所以代码中补充了一行close操作。
2024-01-22 22:22:02 607
原创 Linux高性能服务器编程 14.8.2 14-3代码
子进程会复制父进程的数据,包括锁的状态,调用fork时父进程的mutex已经上锁了,这时调用fork子进程会复制另一把已经上锁的锁(不是mutex,假设为mutex2),因此,子进程试图给mutex2再次上锁,但是mutex2已经是处于上锁状态了,因此子进程会阻塞。互斥锁可能被加锁了,但不是调用的哪个线程锁住的。按照逻辑来说,create创建完another子线程之后,another线程会先获得锁,随后fork得到的子进程也执行进去获得锁但是阻塞住,随后another释放锁,子进程获得锁,休眠后解锁。
2024-01-09 00:01:18 340
原创 JAVA自带的binarySearch方法详解
总结:1.如果目标在数组中存在,则返回一个下标(如果是多个,则我们不知返回哪个下标,但是一定是其中一个)。2.如果目标在数组中不存在,假设应该插入的位置为x,则返回-(x+1);也就是如果返回的值是y,y是负值,则正确的插入位置为-y-1;在上图中,数值0的搜索值为0下标,数值1的搜索值为1下标,都正确指向了相应的下标。但是其中数值2的搜索值为-3,如果要插入的话,也就是插入到-(-3)-...
2020-01-10 21:44:58 391
原创 图论算法部分总结
1.拓扑排序Ⅰ基于BFS:算法步骤简述:1.找到所有入度为0的点,放入队列。2.将队列中的元素出对一个,令其相邻节点中除了入度为0的节点,剩余节点入度减一,如果减为0,则加入队列。3.重复直到结束。无解的判断:如果队列已经为空,还有节点的入度不为0,则不是有向无环图DAG,不存在拓扑排序。Ⅱ基于DFS:算法步骤简述:1.遍历所有节点,对没有走过的且入度为0的点进行dfs。2.d...
2019-12-23 20:55:27 409
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人