06 2021 档案
发表于 2021-06-27 21:49阅读:11956评论:0推荐:4
摘要:题目来源: 1、中兴、华为、慧通、英华达、微软亚洲技术中心等中 外企业面试题目; 2、C 语言面试宝典(林锐《高质量编程第三版》)。 说明: 1、部分C 语言面试题中可能会参杂部分和C++ 相关的知 识,为了保持题目的灵活性故保留,但选题最终还是 会以C 语言题目为主体; 2、以上公司的面试题目已成
阅读全文 »
发表于 2021-06-25 18:20阅读:7029评论:0推荐:2
摘要:Linux网桥工作原理与实现 Linux 的 网桥 是一种虚拟设备(使用软件实现),可以将 Linux 内部多个网络接口连接起来,如下图所示: 而将网络接口连接起来的结果就是,一个网络接口接收到网络数据包后,会复制到其他网络接口中,如下图所示: 如上图所示,当网络接口A接收到数据包后,网桥 会将数据
阅读全文 »
发表于 2021-06-25 18:18阅读:1254评论:0推荐:0
摘要:TCP源码分析 - 三次握手之 connect 过程 本文主要分析 TCP 协议的实现,但由于 TCP 协议比较复杂,所以分几篇文章进行分析,这篇主要介绍 TCP 协议建立连接时的三次握手过程。 TCP 协议应该是 TCP/IP 协议栈中最为复杂的一个协议(没有之一),TCP 协议的复杂性来源于其面
阅读全文 »
发表于 2021-06-25 18:17阅读:1480评论:0推荐:1
摘要:ARP协议与邻居子系统剖析 学习过 TCP/IP 协议的同学都应该了解过 TCP/IP 五层网络模型,如下图: 从上图可以看出,ARP协议 位于 TCP/IP 五层网络模型的 网络层。那么,ARP协议 的用途是什么呢? ARP协议介绍 在局域网中(同一个路由器内),主机与主机之间需要通过 MAC 地
阅读全文 »
发表于 2021-06-25 18:16阅读:787评论:0推荐:0
摘要:LVS原理与实现 - 实现篇 在上一篇文章中,我们主要介绍了 LVS 的原理,接下来我们将会介绍 LVS 的代码实现。 本文使用的内核版本是:2.4.23,而 LVS 的代码在路径:/src/net/ipv4/ipvs 中。 Netfilter 在介绍 LVS 的实现前,我们需要了解以下 Netfi
阅读全文 »
发表于 2021-06-25 18:15阅读:439评论:0推荐:0
摘要:LVS原理与实现 - 原理篇 LVS,全称 Linux Virtual Server,是章文嵩博士发起的一个开源项目。在社区具有很大的热度,是一个基于四层、性能极高的反向代理服务器。至于什么是反向代理,这里就不作详细介绍了,如果不了解可以先去阅读反向代理相关的资料。 LVS工作原理 下面先介绍一下
阅读全文 »
发表于 2021-06-25 16:59阅读:1259评论:0推荐:0
摘要:UDP协议源码分析 UDP协议 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,位于 TCP/IP协议 模
阅读全文 »
发表于 2021-06-25 16:57阅读:699评论:0推荐:0
摘要:Unix Domain Sockets使用 上一章介绍了Socket接口层的实现,接下来我们将会介绍具体的协议层实现,这一章将会介绍用于进程间通信的 Unix Doamin Sockets 的实现。要使用 Unix Domain Sockets 需要在创建socket时为 family 参数传入 A
阅读全文 »
发表于 2021-06-25 16:56阅读:925评论:0推荐:0
摘要:Socket接口的分层 Socket的英文原本意思是 孔 或 插座。但在计算机科学中通常被称作为 套接字,主要用于相同机器的不同进程间或者不同机器间的通信。Socket的使用很多网络编程的书籍都有介绍,所以本文不打算介绍Socket的使用,只讨论Socket的具体实现,所以如果对Socket不太了解
阅读全文 »
发表于 2021-06-25 16:51阅读:1353评论:0推荐:0
摘要:IP协议源码分析 IP协议 是网络的最重要部分,毫不夸张地说,正是因为有 IP协议 才有了互联网。而 IP协议 最重要的是 IP地址,IP地址 就好像我们的家庭住址一样,用于其他人方便找到我们的位置。 当然,这篇文章并不是介绍 IP协议 的原理,有关 IP协议 的原理可以参考经典的书籍《TCP/IP
阅读全文 »
发表于 2021-06-25 10:47阅读:1268评论:0推荐:0
摘要:源码分析 int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) { /*套接字的网络层表示转换成INET套接字的表示*/ struct inet_sock *inet = inet_sk(sk); /*套接字的网络层表示转换
阅读全文 »
发表于 2021-06-24 09:55阅读:983评论:0推荐:0
摘要:包的格式 源端口 发送方进程所使用的端口号(1-65535) RFC768中规定:是否指定源端口可选,未指定是为0 linux中规定:如果未指定端口号,自动赋予一个非0的端口号 目的端口 目标系统中负责接收UDP包的那个应用端口 长度 包括包头和有效负荷 最小的udp包头8字节 最大UDP有效负荷为
阅读全文 »
发表于 2021-06-22 23:27阅读:4766评论:0推荐:0
摘要:计算机为了在 TCP/IP 网络中正常工作,需要获取相应的 IP 地址。获取 IP 地址的过程被称为地址分配。计算机获取 IP 地址的方式有 3 种,即静态分配、动态分配和零配置。下面依次讲解这 3 种方式。 静态分配IP地址 静态分配也称为手工分配。网络管理员在计算机中直接设置所使用的IP地址。在
阅读全文 »
发表于 2021-06-22 19:29阅读:2643评论:0推荐:0
摘要:计算机网络由哪些硬件设备组成? 网络是计算机或类似计算机的网络设备的集合,它们之间通过各种传输介质进行连接。无论设备之间如何连接,网络都是将来自于其中一台网络设备上的数据,通过传输介质传输到另外一台网络设备上。 本节将基于这个过程讲解网络的组成。 网卡 网卡也被称为网络适配器(Network Ada
阅读全文 »
发表于 2021-06-22 10:24阅读:1778评论:0推荐:0
摘要:引言 其实在我看来定义一个变量后再赋值和定义的时候直接初始化应该是一个意思,现在就来验证一下,之前貌似验证过是一致的,但是我需要留下证据。 code 类型 内容 定义时赋值 #include <stdio.h> int main(){ int a = 10; return 0;} 定义后赋值 #in
阅读全文 »
发表于 2021-06-18 19:54阅读:765评论:0推荐:0
摘要:前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下
阅读全文 »
发表于 2021-06-18 19:22阅读:178评论:0推荐:0
摘要:文本居中 <center>markdown居中文本</center> 字体颜色 <font color=#FF0000> 你的字体</font> 图片居中 <div align=center> <img src="图片地址" width="XXX" height="XXX" /> </div> 表格
阅读全文 »
发表于 2021-06-18 17:46阅读:1199评论:0推荐:0
摘要:前言 我们知道,变量是有数据类型的,用以说明它占用多大的内存空间,可以进行什么样的操作。 除了数据类型,变量还有一个属性,称为“存储类别”。存储类别就是变量在内存中的存放区域。在进程的地址空间中, 常量区、全局数据区和栈区可以用来存放变量的值。 常量区和全局数据区的内存在程序启动时就已经由操作系统分
阅读全文 »
发表于 2021-06-18 17:44阅读:1949评论:0推荐:0
摘要:内存泄漏 使用 malloc()、calloc()、realloc() 动态分配的内存,如果没有指针指向它,就无法进行任何操作,这段内存会一直被程序占用,直到程序运行结束由操作系统回收。 请看下面的代码: #include <stdio.h> #include <stdlib.h> int main
阅读全文 »
发表于 2021-06-18 17:43阅读:1136评论:0推荐:0
摘要:###野指针 如果一个指针指向的内存没有访问权限,或者指向一块已经释放掉的内存,那么就无法对该指针进行操作,这样的指针称为野指针(Wild Pointer)。 指向没有访问权限的内存 请看下面的代码: #include <stdio.h> int main(){ char *str; gets(st
阅读全文 »
发表于 2021-06-18 17:42阅读:2440评论:0推荐:0
摘要:引言 相对于栈而言,堆这片内存面临着一个稍微复杂的行为模式:在任意时刻,程序可能发出请求,要么申请一段内存,要么释放一段已经申请过的内存,而且申请的大小从几个字节到几个GB都有可能,我们不能假设程序一次申请多少堆空间,因此,堆的管理显得较为复杂。 那么,使用 malloc() 在堆上分配内存到底是如
阅读全文 »
发表于 2021-06-18 17:40阅读:1878评论:0推荐:0
摘要:例子1 我们先来看下面的一个例子: #include <stdio.h> int main(){ char str[10] = {0}; gets(str); printf("str: %s\n", str); return 0; } 在 main() 函数内部定义一个字符数组,并通过 gets()
阅读全文 »
发表于 2021-06-18 17:39阅读:1260评论:0推荐:0
摘要:静态内存分配 在进程的地址空间中,代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,它们大小固定,不能由程序员分配和释放,只能等到程序运行结束由操作系统回收。这称为静态内存分配。 动态内存分配 栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在程序刚启动时就备足所有内存。这
阅读全文 »
发表于 2021-06-18 17:38阅读:1918评论:0推荐:0
摘要:debug 前面我们只是讲解了一个函数的活动记录是什么样子的,相信大家对函数的详细调用过程的认识还不是太清晰,这节我们就以 VS2010 Debug 模式为例来深入分析一下。 请看下面的代码: void func(int a, int b){ int p =12, q = 345; } int ma
阅读全文 »
发表于 2021-06-18 17:36阅读:733评论:0推荐:0
摘要:函数调用 我们知道,一个C程序由若干个函数组成,C程序的执行实际上就是函数之间的相互调用。请看下面的代码: #include <stdio.h> void funcA(int m, int n){ printf("funcA被调用\n"); } void funcB(float a, float b
阅读全文 »
发表于 2021-06-18 17:30阅读:1670评论:0推荐:2
摘要:引言 函数的调用和栈是分不开的,没有栈就没有函数调用,本节就来讲解函数在栈上是如何被调用的。 栈帧/活动记录 当发生函数调用时,会将函数运行需要的信息全部压入栈中,这常常被称为栈帧(Stack Frame)或活动记录(Activate Record)。活动记录一般包括以下几个方面的内容: 1) 函数
阅读全文 »
发表于 2021-06-18 17:27阅读:4289评论:0推荐:1
摘要:引言 在《Linux下C语言程序的内存布局(内存模型)》中我们讲到,程序的虚拟地址空间分为多个区域,栈(Stack)是其中地址较高的一个区域。栈(Stack)可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,它的用途就是完成函数的调用。 栈内存由系统自动分配和释放:发生函数调用时就为函
阅读全文 »
发表于 2021-06-18 17:25阅读:953评论:0推荐:0
摘要:引言 首先我们要解释一个概念——进程(Process)。简单来说,一个可执行程序就是一个进程,前面我们使用C语言编译生成的程序,运行后就是一个进程。进程最显著的特点就是拥有独立的地址空间。 严格来说,程序是存储在磁盘上的一个文件,是指令和数据的集合,是一个静态的概念;进程是程序加载到内存运行后一些列
阅读全文 »
发表于 2021-06-18 17:24阅读:1348评论:0推荐:0
摘要:引言 在32位环境下,Windows 默认会将高地址的 2GB 空间分配给内核(也可以配置为1GB),而将剩下的 2GB 空间分配给用户程序。 内存分布 不像 Linux,Windows 是闭源的,有版权保护,资料较少,不好深入研究每一个细节,至今仍有一些内部原理不被大家知晓。关于 Windows
阅读全文 »
发表于 2021-06-18 17:23阅读:1981评论:0推荐:1
摘要:引言 在《虚拟地址空间以及编译模式》一节中讲到,虚拟地址空间在32位环境下的大小为 4GB,在64位环境下的大小为 256TB,那么,一个C语言程序的内存在整个地址空间中是如何分布的呢?数据在哪里?代码在哪里?为什么要这样分布?这些就是本节要讲解的内容。 内存模型 程序内存在地址空间中的分布情况称为
阅读全文 »
发表于 2021-06-18 17:18阅读:1447评论:0推荐:1
摘要:引言 通过页表完成虚拟地址和物理地址的映射时,要经过多次转换,还要进行计算,如果由操作系统来完成这项工作,那将会成倍降低程序的性能,得不偿失,所以这种方式是不现实的。 MMU 在CPU内部,有一个部件叫做MMU(Memory Management Unit,内存管理单元),由它来负责将虚拟地址映射为
阅读全文 »
发表于 2021-06-18 17:17阅读:2070评论:0推荐:0
摘要:分页 现代操作系统都使用分页机制来管理内存,这使得每个程序都拥有自己的地址空间。每当程序使用虚拟地址进行读写时,都必须转换为实际的物理地址,才能真正在内存条上定位数据。如下图所示: 内存地址的转换是通过一种叫做页表(Page Table)的机制来完成的,这是本节要讲解的重点,即: 页表是什么? 为什
阅读全文 »
发表于 2021-06-18 17:15阅读:1175评论:0推荐:0
摘要:关于虚拟地址和物理地址的映射有很多思路,我们可以假设以程序为单位,把一段与程序运行所需要的同等大小的虚拟空间映射到某段物理空间。 例如程序A需要 10MB 内存,虚拟地址的范围是从 0X00000000 到 0X00A00000,假设它被映射到一段同等大小的物理内存,地址范围从 0X00100000
阅读全文 »
发表于 2021-06-18 17:13阅读:1360评论:0推荐:1
摘要:计算机内存是以字节(Byte)为单位划分的,理论上CPU可以访问任意编号的字节,但实际情况并非如此。 CPU 通过地址总线来访问内存,一次能处理几个字节的数据,就命令地址总线读取几个字节的数据。32 位的 CPU 一次可以处理4个字节的数据,那么每次就从内存读取4个字节的数据;少了浪费主频,多了没有
阅读全文 »
发表于 2021-06-18 17:10阅读:1358评论:0推荐:1
摘要:虚拟地址 所谓虚拟地址空间,就是程序可以使用的虚拟地址的有效范围。虚拟地址和物理地址的映射关系由操作系统决定,相应地,虚拟地址空间的大小也由操作系统决定,但还会受到编译模式的影响。这节我们先讲解CPU,再讲解编译模式,让大家了解编译器是如何配合CPU来提高程序运行速度的。 CPU的数据处理能力 CP
阅读全文 »
发表于 2021-06-18 17:08阅读:1178评论:0推荐:0
摘要:地址是假的? 在C语言中,指针变量的值就是一个内存地址,&运算符的作用也是取变量的内存地址,请看下面的代码: #include <stdio.h> #include <stdlib.h> int a = 1, b = 255; int main(){ int *pa = &a; printf("pa
阅读全文 »
发表于 2021-06-18 17:06阅读:1668评论:0推荐:1
摘要:从内存中读取数据 程序是保存在硬盘中的,要载入内存才能运行,CPU也被设计为只能从内存中读取数据和指令。 对于CPU来说,内存仅仅是一个存放指令和数据的地方,并不能在内存中完成计算功能,例如要计算 a = b + c,必须将 a、b、c 都读取到CPU内部才能进行加法运算。为了了解具体的运算过程,我
阅读全文 »
发表于 2021-06-18 17:01阅读:1283评论:0推荐:0
摘要:如果你的电脑上安装了QQ,你希望和好友聊天,会双击QQ图标,打开QQ软件,输入账号和密码,然后登录就可以了。 那么,QQ是怎么运行起来的呢? 首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。 双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件
阅读全文 »
发表于 2021-06-18 11:27阅读:2668评论:2推荐:0
摘要:实时时间10:727 海康摄像头时间:10:359 海康流转换后播放时间:10:559 vlc播放时间:9:443 海康浏览器的延时在200(本次:167ms)毫秒左右 流转换后延时在200(本次:200ms)毫秒左右 vlc延时在1秒(本次:916ms)左右 应用框架WasmVideoPlayer
阅读全文 »
发表于 2021-06-17 09:53阅读:1070评论:0推荐:0
摘要:####通过域名查询ip 打开网页 https://www.ipaddress.com/ ####获取github.com的IPv4地址 github.com ####获取assets-cdn.github.com的IPv4地址 assets-cdn.github.com ####获取github.
阅读全文 »
发表于 2021-06-15 20:42阅读:519评论:0推荐:0
摘要:Os中一共包含11个方法,看上去有点没啥用,也就时间函数和execute用的多一点 ####os.clock () 返回程序使用的按秒计 CPU 时间的近似值。表示程序运行了多久 ####os.date ([format [, time]]) 返回一个包含日期及时刻的字符串或表。 格式化方法取决于所
阅读全文 »
发表于 2021-06-14 16:29阅读:263评论:0推荐:0
摘要:项目中有遇到不同服务器中的数据需要合并,但是发现id重复,正常方法导入id就会出问题。 因为赶时间,没有找到比较好的方法,暂时用最简单的逻辑。 步骤 1.将服务器1中的表导出。 2.记录服务器2中该表的最大id数值 3.使用python脚本修改服务器1中导出的表数据 4.将服务器1中的表导入到服务器
阅读全文 »
发表于 2021-06-04 18:13阅读:124评论:0推荐:0
摘要:####table.concat(list, sep, start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。 ####ta
阅读全文 »
发表于 2021-06-02 20:01阅读:99评论:0推荐:0
摘要:####assert(condition) condition为nil或false,报错。反之正常执行。 ####collectgarbage(opt, ...) 手动这类GC是一件不太理想的事情,不管什么语言都是这样的,除非设计缺陷万不得已 "collect" # 做一次完整的垃圾收集循环。 "s
阅读全文 »