参考链接
monitoring-linux-networking-state-using-netlink
python重写
1 | import struct |
epoll的两种工作模式
LT(水平触发)
,ET(边缘触发)
LT模式
: 支持阻塞和非阻塞套接字ET模式
: 只支持非阻塞套接字
monitoring-linux-networking-state-using-netlink
1 | import struct |
LT(水平触发)
,ET(边缘触发)
LT模式
: 支持阻塞和非阻塞套接字ET模式
: 只支持非阻塞套接字
2022年对我来说真的是一个非常不平常的一年。悲伤应该是我今年的关键词。几乎大部分闲暇时间都是悲伤度过的。我有无数次想通过写博客来排毒。 对于这些种种的消极情绪,我知道不好,我也知道自己很naive。可是仿佛是控制不住似的,我也无力改变。so,我非常感谢我周围的朋友。没有这些朋友我可能真的会crash掉。
感情是一个非常珍贵的东西。两个人彼此相信,彼此宠溺,共同面对共同的未来。都是非常难得的事情。毕竟每个人成长的环境不同,接触到的教育信息不同,彼此相互兼容真的是很难的。或许是出于职业的天真,程序员天生是要修bug的,所以当我遇到问题的时候,都是在想这个问题,我能解,我可以单步调试,定位问题,解决问题。所以我自责,我焦虑,我后悔。
今年的有段时间非常喜欢这样的一句话:当你老了回顾一生就会发觉:何时出国读书、何时决定做第一份职业、何时选定了对象而恋爱、何时结婚,其实都是命运的巨变。只是当时站在三岔路口,眼见风云千樯,你作出抉择的那一日,在日记上,相当的沉闷和平凡,当时还以为是生命中普通的一天。 作为小镇错题家的我,是没有什么深谋远虑的规划,甚至还有好多不懂事的地方。所以我对于自己的好多决定都是基于贪心算法的。基于当时的定义域求一个局部的最优解。所以我从厦门到了深圳,又从深圳来了南京。而且当时做这些决定的时候,真的是无所畏惧。义无反顾。
在知乎上看到这样的观点:现代人的精神内耗非常严重。其中核心的原因是——焦虑源于无能,抑郁产自孤独。无能:照顾不好一个人(自己),照顾不好两个人(识人、脱单、经营亲密关系)… 孤独:和自己想法相似的人越来越少,能融入的圈子越来越少。
怎么才能解决这些精神内耗呢?我想肯定不是所谓的二舅。我认同的想法是——爱能治愈一切,做一个温柔且有力量的人。
sicp是一本好书,对我的编码能力提升了不少。让我更熟练的使用lambda表达式,理解dfs,体会抽象的作用。关于抽象,我想说两句。抽象是优雅的,举个例子,你无需详细了解http报文的细节。但你可以优雅的使用requests去做爬虫。你也可以优雅的使用flask去做web开发。这里也解释了什么是框架。
抽象也有evil的一面(个人观点)。对自学的小白是非常的不友好。因为小白不知道自己处在哪个抽象层,所以可能会产生盲目的浪费时间。当然抽象的东西太多的时候,对于初次接触框架代码的人,很容易产生畏难,劝退的情绪。csapp是一本好书,我也曾通宵去完成拆炸弹这个实验。jyy老师,是我目前接触到的国内最高质量计算机课程。
记录一下力扣今年的刷题情况,好像比我前几年的总刷题量都要多。
可是最近让我担心的是,我现在所处的环境需要我这么卷的去学这些东西吗?或者说我还有机会吗?毕竟一个人的命运,当然要靠自我奋斗,但也要考虑历史的进程。
时间很宝贵,我希望自己做些有用的事。提高姿(知)势(识)水平。一切都在进步,2023继续加油。
近期接触到一些事件处理,异步IO,HTTP请求相关的代码,例如samba的tevent和ceph的radosgw。自己对这块知识也是非常感兴趣。最终选择libevent作为切入点,学习一波相关知识。
1 | /* For sockaddr_in */ |
上面是一个简单的例子,我们用到的每个函数都是阻塞的。例如当我们调用connect(fd, (struct sockaddr*) &sin, sizeof(sin))
时,我们必须等待该函数返回结果,这样才能执行下一行语句。如果我们的需求就是简单的访问一下百度的主页,那么这样的代码是没有问题的。可是现实生活中,我们可以同时访问多个网页,我们肯定是不允许要等待前面的请求完成后,才能访问后边的网页。我想要的效果是并发的。
题外话:其实这个例子蛮有意思的。想象一下平时通过浏览器浏览网页的底层实现就是通过简单的socket连接,可以亲自动手读写HTTP请求。课本上枯燥的知识,可以得到实操。渐渐的理解计算机世界的一层层抽象。体会抽象的强大。当然也不难联想到真世界的产品,像windows,mac,ios,android,它们构建出了一层强大的抽象,让我们的生活更加便利,精彩。不然的话,如果想要浏览网页,必须掌握http报文格式,一个个字符输入终端。我想大多数人都是不允许这样糟糕的事情发生。
解释一下ROT13就是对读取到字符做一个简单的处理。
1 | /* For sockaddr_in */ |
体验一下阻塞的效果
我们可以看到只有第一个连接的client是可以正常得到服务的,另外的两个连接都是处于阻塞状态。这显然是不合理的。
1 | /* For sockaddr_in */ |
哇,我们可以同时处理多个请求啦。
同时我们还可以在server端还可以简单的分析一下fork_ROT13
的情况。
似乎多进程或多线程可以完美的解决问题。但是考虑到实际情况,显然是不合理的。细细想一下当面对成千上万的连接时,使用多进程或多线程的代价是非常昂贵的。这里涉及到操作系统层面的进程切换和线程切换。
1 | /* For sockaddr_in */ |
ok,似乎select就够了,但是select的性能是和fd的个数成正比的。所以当fd数量越来越多的时候,select()的性能损耗也就越大。
不同的操作系统提供了不同的替换函数,像poll(),epoll(), kqueue()等。不幸的是,没有一个有效的,通用的,普遍存在的接口。因此libevent封装了这些接口,提供了一个更好的抽象接口。
1 | $ sudo apt-get install libevent-dev |
1 | gcc demo_libevent.c -o demo_libevent -levent |
1 | /* For sockaddr_in */ |
1 | /* For sockaddr_in */ |
经过几番调试终于对radosgw部分的代码框架有了大致的了解,当然工作任务是顺利完成了。细细想来有下面的总结。
radosgw通过下面的代码,针对http不同请求(GET, POST, PUT, HEAD…)创建不同的对象,处理不同的业务需求。值得注意的是RSET(Representational state transfer)是一个表现层的协议。
1 | RGWOp* RGWHandler_REST::get_op(void) |
封装libcurl, 实现httpclient
代码src\rgw\rgw_http_client.cc
, 需要细细品。
读日志vs动态调试
不得不说当你对代码熟悉的时候,读日志比动态调试代码高效很多。我可以清晰地看到来自civetweb的报文信息,以及radosgw的各种处理。
valgrind
valgrind只是简单的用了下。
1 | class Solution: |
1 | class Solution: |
1 | from typing import * |
1 | import bisect |
ps 评论区有意思的东西
单调队列真是一种让人感到五味杂陈的数据结构,它的维护过程更是如此…..就拿此题来说,队头最大,往队尾方向单调……有机会站在队头的老大永远心狠手辣,当它从队尾杀进去的时候,如果它发现这里面没一个够自己打的,它会毫无人性地屠城,把原先队里的人头全部丢出去,转身建立起自己的政权,野心勃勃地准备开创一个新的王朝…..这时候,它的人格竟发生了一百八十度大反转,它变成了一位胸怀宽广的慈父!它热情地请那些新来的“小个子”们入住自己的王国……然而,这些小个子似乎天性都是一样的——嫉妒心强,倘若见到比自己还小的居然更早入住王国,它们会心狠手辣地找一个夜晚把它们通通干掉,好让自己享受更大的“蛋糕”;当然,遇到比自己强大的,它们也没辙,乖乖夹起尾巴做人。像这样的暗杀事件每天都在上演,虽然王国里日益笼罩上白色恐怖,但是好在没有后来者强大到足以干翻国王,江山还算能稳住。直到有一天,闯进来了一位真正厉害的角色,就像当年打江山的国王一样,手段狠辣,野心膨胀,于是又是大屠城……历史总是轮回的。
觉得现代官场更加能阐明这个基本道理。比如你这个倒霉蛋25岁二本毕业在机关当科员, 熬了十年后老处长退休, 你们科长升处长, 你升科长。你梦想着再熬10年处长退休·你接班。结果是赵家人不讲武德。直接空降一个25岁的付处。他比你先接班,你等他退休也没戏, 所以这一辈子和处长没关系,自然可以从queue里pop out, 不用排队。
10月过的好快啊。国庆七天,隔离七天。半个月就过去了。
写博客一直是我心心念的事情。虽然大学的时候有在CSDN写过一点博客,但是作为程序员的高傲,肯定是想自己搞一个网站搭建博客。
几经波折我最终选择了hexo+GitHub。
其实GitHub Actions和travis-ci都是属于持续集成(Continuous integration,简称CI)服务。网上了查了一下有很多的专业术语去描述这件事情。具体到我们搭建博客的过程就是:hexo只是我们用来写博客的(注意这里的博客是Markdown的文件格式),但是要想作为浏览器浏览的网页,那就必须通过一些系列操作,然后生成我们想要的html文件(运行命令hexo generate
)。那么这一系列操作便可以理解是持续集成服务的一部分。
1 | --- a/.github/workflows/pages.yml |
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment