Simon's | Blog

Why so serious?

Linux系统寻址过程详解

"Linux系统寻址过程详解"

“Better code, better life. ” 这几天面了次字节跳动,中间被问到一个问题–“Linux系统下,进程是如何访问内存的?” 当时只说了“虚拟内存,页表,两次寻址,页置换”等内容,但是后续面试官追问的两个问题没有回答的特别好,所以今天准备系统的学习一下这方面内容。 Linux内存结构 物理内存(Physical Memory)和虚拟内存(Virtual M...

IO多路复用函数的比较

"IO多路复用的原理"

“Better code, better life. ” 前面我们讨论了select、poll和epoll三组I/O复用系统调用,这3组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集、最大支持文件描述符数、工作模式和具体实现等四个...

为什么多路复用函数可以同时监听多个Socket?

"IO多路复用的原理"

“Better code, better life. ” 之前写了三篇博客讲Linux系统的网络IO,分别是: Linux网络数据包接受过程 poll函数源码解析 epoll函数源码解析 从第一篇,我们基本知道了Linux系统下网络数据包是如何从网卡到达应用程序的,后面两篇讲了多路复用函数两兄弟的源码,今天我们来看一下IO多路复用的设计原理。 系统如何同时监听多个sock...

C++中的编译器常量和模板元编程

"C++中的编译器常量和模板元编程"

“Better code, better life. ” 前几天看了眼C++20的新特性,从20起开始支持虚函数的constexpr了,今天我们就来研究下所谓的constexpr是个什么东西、编译期常量和constexpr的关系、它能解决什么问题。 编译器常量 想要用编译期常量就要首先知道它们是什么,一般出现在哪里和运行期常量有什么区别。 编译期常量(Compile-time...

epoll函数源码解析

"epoll函数源码解析"

“Better code, better life. ” epoll函数源码解析 之前写过一篇poll函数源码解析,今天来介绍三兄弟里的老大哥epoll函数。 基本用法 epoll有三个常用方法: epoll_create() /*创建epoll_fd*/ epoll_ctl() /*操作文件描述符*/ epoll_wait() /*poll*/ 定义在头文件sys/e...

深入理解内存屏障

"深入理解内存屏障"

“Better code, better life. ” 从cache miss说起 现在CPU基本都可以做到一个周期内执行十数条指令,但是往往一个读内存的操作就超过了十个CPU周期,所以,现代CPU的主要矛盾已经编程CPU速度太快而现在内存速度太慢的矛盾。 自然而然,CPU增加了自己的缓存。数据需要在CPU中计算的话需要先从内存中读取到cache才能被CPU访问,然后cach...

class类型作为另一个类的成员

"更优雅的多态"

“Better code, better life. ” class类型作为另一个类的成员 最近在写的一个需求,在网络通信时,有多种消息类型需要被创建,于是想着用继承的方式把代码写的优雅一些,这让我想到了之前写python的时候的一种语法,现在尝试用C++来实现一下。 在python里,一个类(class)可以作为另一个类的成员,从而实现运行时多态,来看一段代码: class...

OSI七层模型和TCP-IP四层模型的关系

"OSI七层模型和TCP-IP四层模型的关系"

“Better code, better life. ” OSI七层模型和TCP-IP四层模型的区别与联系 这是一个困扰我一段时间的高频面试题,今天彻底给他搞明白 OSI七层模型 所谓OSI即开放式系统互联(Open System Interconnect),是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 OSI定义了网络互连的七层框架(物理层、数据...

TCP连接保活

"TCP连接保活"

“Better code, better life. ” TCP连接保活 对于一个TCP长连接的保活又两种方式,一种在应用层发心跳包,一种是在传输层,通过SO_Keeplive实现。 保活的必要性 现在的网络编程大多使用长连接,对于一个TCP长连接,服务端为维持每一个客户端的连接都需要一定的资源,这就需要服务端每隔一段时间将不活跃的连接剔除调,这样就面临下面两问题: ...

结构体sockaddr、sockaddr_in、sockaddr_in6探究

"跨平台网络库编写"

“Better code, better life. ” 结构体sockaddr、sockaddr_in、sockaddr_in6探究 最近在写一个跨平台网络库,发现一些网络编程的系统调用的参数在不同平台上各不相同,令人头大。今天把sockaddr、sockaddr_in、sockaddr_in6这三个结构体放到一起,从源码的层面做一次研究。 Linux环境 话不多说,直接贴...