3.21
操作系统
内存管理
虚拟内存
单片机没有操作系统,并且直接操纵内存
操作系统是怎么做的呢?
操作系统为每一个进程分配一块虚拟空间,并且能够将不同的虚拟空间和不同的物理内存映射起来(内存管理单元MMU)
如何管理虚拟地址和内存地址间的关系
内存分段
虚拟地址:段选择因子 + 段内偏移量;段选择因子:段号+特权等标志位
段表通过段号找到段内描述符(段基地址+段界限+特权级DPL)再结合段内偏移量就能找到物理内存地址
即通过段表映射
虚拟地址在内存分段机制下分为了4个段:栈、堆、数据段、代码段
存在的问题
内存碎片
外部内存碎片:产生了多个不连续的小物理内存,导致程序无法被装载
解决方案:内存交换,将内存与硬盘进行交换,使得物理内存有很好的连贯性
内部内存碎片:程序所有内存被装载进了物理内存中,但程序中部分内存很少被使用
内存交换效率低
主要就是内存交换,造成性能瓶颈,硬盘读写数据速度远小于内存,如果交换的是一大段内存,机器甚至会有明显的卡顿
内存分页
思路:使产生内存碎片的概率更小;内存交换的效率更高(交换小内存)
分页是把虚拟和物理空间切割成固定的尺寸大小,在linux下,一页为4kb
物理地址和虚拟地址之间通过页表来映射
当进程访问的虚拟空间在页表中找不到时,会返回一个缺页异常,系统重新分配内存,更新进程页表
内存分页释放的内存都是以页为单位释放的,不会产生无法给进程使用的小内存
如果内存空间不够,操作系统会将程序中很少使用的内存先交换出去,内存交换也是以页为单位,不会有大的内存的交换
更进一步,分页方式使得我们在加载程序时,不再需要一次性将程序加载到内存中去,只是在运行时用到再加载
虚拟物理映射规则
虚拟地址:虚拟页号(MMU --物理页号)+页偏移
问题
页表庞大
32位操作系统下,一个虚拟地址空间4GB,假设一个页大小4kb,那么需要多少页呢 1024*1024。一个表项4个字节,2^22 = 4 Mb,假如100个进程就是400Mb;64位操作系统页表就更大了
多级页表
现象是一个程序往往用不到4GB的内存,但是我们的页表又要完美覆盖到所有的内存,所以可以搞个一级页表覆盖所有内存,二级页表需要时再创建,这样不使用到的或者长时间空闲的内存第一时间就不需要创建页表,节约空间。但与此同时也带来了访问速度、效率的问题
TLB(translation lookaside buffer)
将最常访问到的页表缓存到芯片上的TLB cache中 提高访问速度
段页式内存管理
内存分段+内存分页
段号 + 段内页号 + 页内偏移
段表 + 页表
Linux内存管理
intel处理器发展史
内存分段 --------- 内存分段 + 内存分页
逻辑地址(程序使用的地址) ---- 线性地址(也叫虚拟地址, 段式内存转换后的地址) ------ 物理地址(页式内存管理映射的地址)
linux
上有政策,下有对策。
绕过CPU限制,忽略段内存分配机制。每个段都是从0地址开始的整个4GB虚拟空间,即linux上的程序代码面对的都是虚拟地址,避开了逻辑地址。段只用来访问控制和内存保护
虚拟地址组成:内核空间1G + 用户空间3G(0X0 — 0XFFFFFFFF)
每个虚拟空间的内核空间,映射到的都是相同的物理地址
组成(从下往上):
程序文件段:二进制执行代码
已初始化段:包括静态常量
未初始化段(BSS):包括未初始化的静态常量
堆:动态内存分配,从低地址到高地址
文件映射:包括动态库、共享内存
栈:从高地址到低地址,包括局部变量和函数调用的上下文,一般是8Mb
内核
计网
为什么客户端、服务端的初始化isn不同
如果一个失效的连接被重用了,但是该就连接的历史报文还残留在网络中,如果序列号相同,就无法区分出该报文是否为历史报文,如果历史报文被新的连接接收了,则会产生数据错乱
为了通信双方将不属于自己的报文段丢弃
安全性考虑,防止黑客伪造相同的序列号的TCP被对方接收
isn初始化
ISN = M + F
M每4ms加1, F是一个hash算法,根据目标地址、目标端口、源ip、源端口随机生成的数
为什么有了IP分片,还需要TCP分片
MTU >= MSS + IP头部 + TCP头部
因为IP若有一个分片丢失(MTU),会重传所有分片【没有超时重传机制】,而TCP只会重传丢失的分片(MSS)
SYN攻击
服务器接收到SYN报文就会处于syn-recv状态,若是攻击者一直发放syn报文但是不回应服务器的syn-ack报文,服务器的syn接收队列就会被占满,无法接受正常用户的syn报文
避免SYN方法:
1 修改内核参数,控制队列大小和队列满时的操作,例如处理不了的直接丢弃
增加 SYN 连接,也就是增加半连接队列的容量。
减少 SYN + ACK 重试次数,避免大量的超时重发。
利用 SYN Cookie技术,在服务端接收到SYN后不立即分配连接资源,而是根据这个SYN计算出一个Cookie,连同第二次握手回复给客户端,在客户端回复ACK的时候带上这个Cookie值,服务端验证Cookie 合法之后才分配连接资源。
————————————————
版权声明:本文为优快云博主「HearLing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_41147507/article/details/109600713
C++
提示不明确时可能时变量名与内置的重合了
Leetcode
复原IP
class Solution {
public:
vector<string>ans;
int count = 0;
bool isvalid(string s, int start, int end){
if(start > end) return false;
long long nums = 0;
if(start + 1 <= end && s[start] == '0') return false;
for(int i = start; i <= end; i++){
if(s[i] > '9' || s[i] < '0') return false;
nums = nums*10 + (s[i] - '0');
}
if(nums > 255) return false;
return true;
}
void bt(string s, int startindex){
if(count == 3){
if(isvalid(s, startindex, s.size()-1)) ans.push_back(s);
return;
}
for(int i = startindex; i < s.size(); i++){
if(isvalid(s, startindex, i)){
s.insert(s.begin() + i + 1, '.');
count++;
bt(s, i+2);
count--;
s.erase(s.begin() + i + 1);
}
}
}
vector<string> restoreIpAddresses(string s) {
bt(s, 0);
return ans;
}
};
其他
线性与非线性:叠加原理 / (可加性+齐次性)
看了mohamad的书,见微通道.md
时间过的飞快,探究时间本身是不是无意义的事情呢 ,