操作起来 3.21

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

时间过的飞快,探究时间本身是不是无意义的事情呢 ,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值