总结
2019年马上就要过去了,回顾总结一下自己今年究竟干了什么。
总的来说,今年是非常幸运的一年,春招实习也好,暑假转正答辩也好,毕设开题也好,诸事顺利:)
每个月做了什么
对于每个月,自己简单描述一下做了啥……
2019年马上就要过去了,回顾总结一下自己今年究竟干了什么。
总的来说,今年是非常幸运的一年,春招实习也好,暑假转正答辩也好,毕设开题也好,诸事顺利:)
对于每个月,自己简单描述一下做了啥……
前几天学校图书馆进了一批新书,看了下,刚好有《Effective Modern C++》这本书,这本书一直想看,于是借来看了下。(PS:总共三本,一开始还是借不到的,只能预约,蛮意外的,原来我们学校有这么多人学C++吗,毕竟班里其他人都学的是Java……
献给爱犬,嗯,不过这次少了张图。关于C++11/14,在我之前写一个项目里用过并熟悉了下,所以这本书除了并发那里基础知识都没什么问题,那么来看看C++11/14又有什么坑呢?
推导,这一听就是模板了,虽然日常编码中模板用得是比较少的,不过看一看还是很有意思的:
栈是很重要的一种数据结构,调用函数,创建局部变量都会压栈,函数究竟是怎么调用的呢,通常是将函数参数压栈,将下一条指令地址压栈,然后跳转到函数体内执行,函数体内大概是这样:
1 | push ebp // 保存ebp |
但,函数调用还有一些问题:被调用函数是怎么知道函数参数的位置的?这些函数参数由谁负责清理?这需要一些约定,而这个约定就是函数调用惯例。通常来说,函数调用惯例包括下面几个方面:
几种常见的调用惯例:
从操作系统角度来看,进程的装载大概是:
ELF分为链接视图和执行视图,链接视图就是静态链接那里讲的,但我们知道,现在操作系统都是以页机制管理内存的,如果一个section一页,太浪费内存,因此需要把相同权限(RWX)的section当做一个segment进行虚拟地址映射,这就是ELF的两种视图。
至于空间分布,大概如图:
可以cat /proc/pid/maps来查看。
ELF是Linux下的文件格式,可分为:
ELF文件结构:ELF文件头,各种section(.text, .data, .bss等),各种表(section表、symbol表、string表等)。文件头里存放了各种元数据,比如ELF类型、入口地址、表偏移、段数量等;各种section即为代码和数据;section表存放的是各section的信息,比如类型、名字、偏移、大小等;string表里存放着ELF中的字符串;rel表和symbol表是链接中很重要的结构,因为链接本质就是”填空”,在哪里填空,怎么填空,都依赖于这两张表。
在链接中,函数和变量统称为符号,因此可知,每个目标文件都可以定义符号或引用符号。从链接角度来看,符号也有很多类型,局部符号(static)、全局符号(全局变量、函数)、外部符号(引用的外部符号)、特殊符号(ld根据链接脚本添加)。关于名字,符号名通常与变量、函数名不一致,这称为符号修饰,这也是extern “C”的原因。
强符号和弱符号:默认的,函数和初始化全局变量为强符号,未初始化全局变量为弱符号,规则如下:
服务器端创建一个socket,然后listen之后sleep,如果在sleep期间,有客户端connect服务器,服务器是否会醒来?或者怎样?
让我们来做个实验,代码如下(使用windz网络库):
1 | // server.cpp |
项目地址:Crystalwindz/windz
经过一个半月的努力,windz库终于写完了。起初只是想做个Web服务器交课设,但这服务器越写越偏,越来越像一个网络库,于是就想,索性就写成网络库吧,都说C++程序员都喜欢造轮子,也许我也是。
一开始写Web服务器时,我也只是看过APUE、UNP,简单了解网络编程的人,实际写起来C++网络程序,也是相当困难,无从下手。万事开头难嘛,于是尝试在github上找找别人写的Web服务器,阅读源码来学习一下,有幸看到了linyacool/WebServer,readme写的相当详细,并大力推荐了陈硕的chenshuo/muduo和他的Linux多线程服务端编程,我看到后当即就去学校图书馆借了一本。借来这本书,看到目录和书背上的一些问题,感觉无比痛快,我的疑问大部分都在上面有了详细的解答,上一次看书这么爽还是看Effective C++的时候。
于是便读了书,跟着书中的指引和源码,一步一步地把windz这个库写完了,通过读书和写这个库,我学到了太多太多: