Cache对代码的影响
问题背景
代码片段一
12345int array[10][128];for (i = 0; i < 10; i++) for (j = 0; j < 128; j++) array[i][j] = 1;
代码片段二
12345int array[10][128];for (i = 0; i < 128; i++) for (j = 0; j < 10; j++) array[j][i] = 1;
我们假设使用的L1 Cache Line大小是64字节,采用写分配及写回策略。继续假设数组 array 内存首地址是64字节对齐。
问题分析
在有了以上背景假设后,我们先分析下片段1导致的Cache Miss / Hit情况。
当执行 array[0][0] = 1 时,Cache 控制器发现 array[0][0] 的值不在Cache中,此时发生一次 Cache Miss。然后从主存中读取 array[0][0] 到 array[0][15] 的内存值到 Cache 中。
当执行访问 array[0][1] = 1 ...
进程、线程、协程之间的区别
简述进程、线程、协程的概念进程
保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,不同进程间可以进行进程间通信,上级挂靠单位是操作系统。一个应用程序相当于一个进程,操作系统会以进程为单位,分配系统资源(CPU 时间片、内存等资源),进程是资源分配的最小单位。
线程
线程从属于进程,也被称为轻量级进程,是程序的实际执行者。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条- 线程并行执行不同的任务。一个线程只有一个进程。
每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
协程
协程是伴随着主线程一起运行的一段程序。
协程与协程之间是并行执行,与主线程也是并行执行,同一时间只能执行一个协程提起协程,自然是要想到线程,因为协程的定义就是 ...
碎玉零珠————计算机网络
OSI 七层模型
理论上的网络通信模型
应用层:最靠近用户的层,负责处理特定的应用程序细节。这一层提供了网络服务与用户应用软件之间的接口。例如,Web 浏览器、FTP 客户端和服务器、电子邮件客户端等。
表示层:确保从一个系统发送的信息可以被另一个系统的应用层读取。它负责数据的转换、压缩和加密。例如,确保数据从一种编码格式转换为另一种,如 ASCII 到 EBCDIC。
会话层:管理用户的会话,控制网络上两节点间的对话和数据交换的管理。它负责建立、维护和终止会话。例如,建立一个会话令牌,以便在网络上的两个节点之间传递。
传输层:提供端到端的通信服务,保证数据的完整性和正确顺序。这一层包括 TCP 和 UDP 等。
网络层:负责在多个网络之间进行数据传输,确保数据能够在复杂的网络结构中找到从源到目的地的最佳路径。这层使用的是 IP(Internet Protocol)协议。
数据链路层:在物理连接中提供可靠的传输,负责建立和维护两个相邻节点间的链路。包括帧同步、MAC(媒体访问控制)。
物理层:负责在物理媒介上实现原始的数据传输,比如电缆、光纤和无线信号传输。涉及的内容包括电压、接口、针 ...
局域网中的主机之间通信
局域网中的主机之间通信
局域网中的主机间通信分为 2 种:
两台主机处于同一网段
两台主机之间处于不同网段
局域网中处于同一网段中的主机通信
假如:主机 A 要和主机 B 通信,主机 A 知道主机 B 的 IP 地址。知道 IP 地址是通信的前提。首先,要通进行通信,IP 地址和 MAC 地址是必不可少的,IP 地址已经知道了,那么主机 A 必须要知道主机 B 的 MAC 地址,先在 ARP 表中查看有无该 IP 地址,如果有,就找出对应的硬件 MAC 地址,如果没有,主机 A 广播发送 ARP 请求来获取目的 MAC 地址,说 who is 192.168.1.102 ?
当 IP 地址是 192.168.1.102 的主机 B 收到后,会回复主机 A ,说 “我是 192.168.1.102 ,我的 MAC 地址是:xx-xx-xx-xx-xx-xx”(ARP应答)。这样一来,主机 A 就知道主机 B 的 MAC 地址了,当然,由于主机 A 在广播发送的 ARP 报文时,主机 A 的 MAC 地址被作为源 MAC 地址而封装在 MAC 帧中,所以主机 B 收到广播报文后 ...
Cache的基本原理
为什么需要Cache程序是如何运行起来的
程序是运行在 RAM(随机存储器) 之中,我们称之为 main memory(主存)。当我们需要运行一个进程的时候,首先会从磁盘设备(例如,eMMC、UFS、SSD等)中将可执行程序load到主存中,然后开始执行。
在CPU内部存在一堆的通用寄存器(register)。如果 CPU 需要将一个变量(假设地址是A)加1,一般分为以下3个步骤:
CPU 从主存中读取地址 A 的数据到内部通用寄存器 x0(ARM64架构的通用寄存器之一)。
通用寄存器 x0 加1。
CPU 将通用寄存器 x0 的值写入主存。
其实现实中,CPU通用寄存器的速度(< 1ns)和主存(~ 65ns)之间存在着太大的差异。
因此,上面举例的3个步骤中,步骤1和步骤3实际上速度很慢。当CPU试图从主存中 Load / Store 操作时,由于主存的速度限制,CPU不得不等待这漫长的65ns时间。
如果我们采用更快材料制作更快速度的主存,并且拥有几乎差不多的容量, 其成本将会大幅度上升。我们试图提升主存的速度和容量,又期望其成本很低,这就有点难为人了。
因此, ...
三次握手,四次挥手
三次握手
第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN)
发起连接:客户端发送一个 TCP 报文段到服务器。这个报文段的头部中,SYN 位被设置为 1,表明这是一个连接请求。同时,客户端会随机选择一个序列号(Sequence Number),假设为 x,发送给服务器。
目的:客户端通知服务器它希望建立连接,并告知服务器自己的初始序列号。
状态:客户端进入 SYN_SENT 状态。
第二次握手:SYN + ACK
确认并应答:服务器收到客户端的连接请求后,如果同意建立连接,它会发送一个应答 TCP 报文段给客户端。在这个报文段中,SYN 位和 ACK 位都被设置为 1。服务器也会选择自己的一个随机序列号,假设为 y,并将客户端的序列号加 1(即 x+1)作为确认号(Acknowledgment Number),发送给客户端。
目的:服务器告诉客户端,它的连接请求被接受了,并通知客户端自己的初始序列号。
状态:服务器进入 SYN_RCVD 状态。
第三次握手:ACK
最终确认:客户端收到服务器的应答后,还需要向服务器发送一个确认。这个 TCP 报文段的 ...
TCP 长连接和短连接
TCP 长连接和短连接什么是长连接和短连接
长连接(long connnection),指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
短连接(short connnection),是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时才去建立一个连接,数据发送完成后则断开此连接,即每次连接只完成一项业务的发送。
TCP 长短连接的优势TCP 短连接
模拟一下TCP短连接的情况:client 向 server 发起连接请求,server 接到请求,然后双方建立连接。client 向 server 发送消息,server 回应 client ,然后一次读写就完成了,这时候双方任何一个都可以发起 close 操作,不过一般都是 client 先发起 close 操作。
从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作。
短连接优点:管理起来方便,存在的连接都是有效的连接,不需要额外的控制手段。
TCP 长连接
模拟一下TCP长连接的情况,client 向 server 发起连接,serve ...











