3.12
计网
非对称加密:公钥加私钥,通信前建立联系
对称加密:通信过程中使用同一密钥(会话密钥?)
对称加密密钥不能泄露,思路:
密钥交换算法:采用非对称加密算法来保护对称加密密钥
RSA
RSA(服务器公钥)可加密pre-master,即客户端产生的第二个随机数的
思路就是服务器将公钥随着证书发给客户端,客户端用公钥加密然后发给服务器,服务器用私钥将信息解密得到密钥,双方再用密钥进行对称加密的信息传输
密码套件格式:
密钥交换算法+签名算法+对称加密算法+摘要算法
缺陷:不支持前向保密,如果服务器私钥泄露,之前的信息会被破解
DH
就是公钥是由私钥顺序算过来的,但你就算知道私钥和公式逆序你也找不到我嘿嘿
参考:Diffie-Hellman密钥交换算法| 公钥加密| DH算法| 密码学| 信息安全_哔哩哔哩_bilibili
数字证书具体过程:
CA将服务器公钥等一系列信息打包通过hash算法得到值哈希值
将哈希值通过CA私钥加密,也就是签名
将签名添加在文件证书上,形成数字证书
客户端用同样的hash算法得到值H2
客户端用浏览器或操作系统里的CA的公钥解密证书得到H1
比较H1 H2若一样说明可信
证书链
保证根证书的绝对安全性
论文
Phase interface effects in the total enthalpy-based lattice Boltzmann model for solid–liquid phase change
数值扩散:模拟介质表现出比真正介质较高扩散率的计算机模拟的一个难点
基于焓的格子玻尔兹曼固液相变模型:不用求解线性方程、避免迭代过程
因为固液物理性质(热导率、比热)的不同,提出了新颖的参考比热的概念,使热导率和比热能够解耦,由无量纲弛豫时间代表热导率,平衡态分布函数代表比热
减少数值扩散,采用多弛豫时间碰撞算子,引入了魔法值1/4,发现了双弛豫时间的好处
相界面位置难找,并且还有传热过程,外加固液性质不一样
三种:phase-field based; enthalpy-based;immersed-boundary前两者都是欧拉方法,后者在相界面上是拉格朗日坐标
enthalpy-based常用于宏观相变问题求解,忽略微观中的一些效应
液相率0、0~1、1分别对应着固相、糊状区、液相
相界面的确定靠解以下能量方程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ghSlnGW-1647092804382)(C:\Users\yzh\AppData\Roaming\Typora\typora-user-images\image-20220312145100267.png)]
当然方程可以简化,若是糊状区像固体一样,最后一项对流项可以忽略
可以用混合方法或者双分布函数方法来求解以上方程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myE75Jjb-1647092804386)(C:\Users\yzh\AppData\Roaming\Typora\typora-user-images\image-20220312152810770.png)]
H = CpT+Lfl
热导率和弛豫时间的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vd1aQ9Mn-1647092804388)(C:\Users\yzh\AppData\Roaming\Typora\typora-user-images\image-20220312153620732.png)]
参考比热值可以任意给,取固液中间值数值仿真比较稳定
操作系统
存储器的层次结构
断电,内存中数据就没啦,硬盘中还在
寄存器
32位大多数寄存器一次存储4字节,64位则是8字节
寄存器读写数据一般要求在半个时钟周期
CPU Cache
CPU Cache用的是一种静态随机存储器芯片(SRAM),存储一个比特需要6个晶体管:(26条消息) SRAM存储原理_osnet的博客-优快云博客_sram原理
L1高速缓存 | 2-4时钟周期 | 几十KB到几百KB | 数据缓存、指令缓存 | 每个CPU都有 |
L2高速缓存 | 10-20 | 几百KB到几MB | 每个CPU都有 | |
L3 | 20-60 | 几MB到几十MB | 通常为多CPU共用 |
内存
动态随机存储芯片,存储一个bit只需要一个晶体管和一个电容,但是因为电容漏电需要定时刷新电容,访问速度大概在200-300个时钟周期
SSD/HDD硬盘
前者访问速度比内存慢10-1000倍,后者慢10W倍
存储器的层次关系
每一级存储器只和它相邻的存储设备打交道,访问的时候也是从上往下依次访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woELHJyR-1647092804390)(E:/typora/3.12.assets/image-20220312161820696.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GIIWGwDC-1647092804392)(E:/typora/3.12.assets/image-20220312162027979.png)]
CPU的数据结构和读取过程是怎样的
cpu读取数据不是按一个元素一个元素读取的,它是一块一块读取的,读取的数据块叫做Cache line,即缓存块,可以通过/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size命令查看缓存块的大小,
如果缓存块是64个字节,而你访问array[0]的时候,cpu会把array[0]到[15]的数据都加载到cpu cache,那么下一次在需要读取0-15之间的数据时就不用到内存中去拿了,可以直接到高速缓存中拿
只有当缓存层没有命中时,才会去访问内存
直接索引为例:
一个内存的访问地址:
组标记:同一个缓存块可能对应不用的内存块,靠组标记加以区分
CPU Line索引:每个内存块对应一个缓存块,内存索引/缓存块数量然后取余
偏移量:CPU访问时不会访问缓存块所有数据,靠偏移量来访问具体的数据
cache line组成:
数据;有效位(判断数据是否有效,0-无效 1-有效,无效就去访问内存);cpu cache索引;组标记;
如何写出让CPU跑的更快的代码
等同于如何提高cpu缓存命中率
数据缓存
按照内存布局顺序读取数据,能够有效提高cpu cache带来的好处
指令缓存
先排序再操作优于先操作再排序
如何提升多核CPU命中率
将进程绑定在特定CPU上就好啦,linux命令sched_setaffinity
Leetcode
不同的二叉搜索树
class Solution {
public:
int numTrees(int n) {
vector<int>dp(n+1, 0);
dp[0]=dp[1]=1;
for(int i = 2 ; i < n + 1 ; i++){
for(int j = 0 ; j < i ; j++){
dp[i] += dp[j] * dp[i-j-1];
}
}
return dp[n];
}
};
组合(错误)
class Solution {
public:
vector<int>path;
vector<vector<int>>ans;
void backtrace(int n, int index, int _k){
if(path.size() == _k){
ans.push_back(path);
return;
}
for(int i = index ; i <= n ; i++){
path.push_back(i);
backtrace(n, index+1, _k);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtrace(n, 1, k);
return ans;
}
};
/*[[1,2],[1,3],[1,4],[2,2],[2,3],[2,4],[3,2],[3,3],[3,4],[4,2],[4,3],[4,4]]*/
组合(正确)
class Solution {
public:
vector<int>path;
vector<vector<int>>ans;
void backtrace(int n, int index, int _k){
if(path.size() == _k){
ans.push_back(path);
return;
}
for(int i = index ; i <= n ; i++){
path.push_back(i);
backtrace(n, i+1, _k);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtrace(n, 1, k);
return ans;
}
};
其他
大胆提高Re,怕锤子
无量纲长度太小,正比于长高比、反比于雷诺数、普朗特数
backtrace(n, i+1, _k);
path.pop_back();
}
}
vector<vector> combine(int n, int k) {
backtrace(n, 1, k);
return ans;
}
};
## 其他
大胆提高Re,怕锤子
无量纲长度太小,正比于长高比、反比于雷诺数、普朗特数
所以提高雷诺数时也应该提高长高比