<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[天道酬勤]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weixin_43891021</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_43891021]]></copyright><item><title><![CDATA[c++的const用法]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114646302</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114646302</guid><author>weixin_43891021</author><pubDate>Wed, 10 Mar 2021 21:16:20 +0800</pubDate><description><![CDATA[c++与指针
顶层const
例子是这种
int * const a = &amp;b;

这种const是a是一个常指针，一旦创建后不能再指向其他变量。
底层const
const int *a = &amp;b;

这个说的是不能通过a这个指针来修改b的值，而b是可以自己改变的。
const与参数
用const修饰参数可以保证参数不会修改，起到保护作用。
const与成员函数
保证成员函数不能修改成员变量的值，也不能调用非const修饰的成员函数。
const修饰参数返回值
修饰返回的值，主要是指针类型]]></description><category></category></item><item><title><![CDATA[cookie 和 seesion 学习笔记-2]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114641004</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114641004</guid><author>weixin_43891021</author><pubDate>Wed, 10 Mar 2021 17:31:03 +0800</pubDate><description><![CDATA[Session
概念
cookie的使用会产生一些安全性和传输效率的问题。比如cookie存储了敏感信息可能被其他用户看到，或者cookie的内容太多影响传输效率。所以有了seesion会话。
session的使用
session就是存储键值对的一个东西，将cookie存在服务器的seesion中，给客户端返回jsessionid，下次访问时用jseesionid来访问就好。session有最大不访问时间，超过这个时间就会销毁存储在服务端的cookie信息。
session序列化
当服务器需要重启是将ses]]></description><category></category></item><item><title><![CDATA[cookie和seesion学习笔记]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114638984</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114638984</guid><author>weixin_43891021</author><pubDate>Wed, 10 Mar 2021 17:11:29 +0800</pubDate><description><![CDATA[cookie
概念
cookie也就是http cookie，因为http是无状态的协议，为了维持用户和跟踪用户信息，所以引用了cookie放在客户端。cookie最大是4K，如果超过4K调用时会返回一个空字符串。
cookie的获得与使用
客户端向服务端发送请求，服务端收到之后生成cookie，放在响应头的set-cookie当中，客户端获得后将获得的cookie放到请求头的cookie字段中使用。但是当浏览器关闭释放内存cookie就会消失。
cookie的持久
set-cookie字段有个expire]]></description><category></category></item><item><title><![CDATA[死锁笔记]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114637102</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114637102</guid><author>weixin_43891021</author><pubDate>Wed, 10 Mar 2021 16:01:31 +0800</pubDate><description><![CDATA[死锁是多个进程在运行过程中因竞争资源导致的一种僵局，如果没有外力作用它们都将无法推进。
产生死锁的四个必要条件
互斥条件：进程要求对所分配的资源进行排他性控制，一段时间内某资源仅为一个进程所占。
请求和保持条件：当进程因请求资源而阻塞时，对自己已经获得的资源保持不放。
不剥夺条件：进程的资源在未使用完前，不能剥夺，只能在使用完后自己释放。
环路等待条件：在发生死锁时必然有一个资源-进程形成环链。
解决死锁的基本方法
预防死锁：
一次性分配所有资源。（破坏请求条件）
只要有一个资源得不到分配，其他资源也不分配]]></description><category></category></item><item><title><![CDATA[集群负载均衡学习笔记]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114493743</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114493743</guid><author>weixin_43891021</author><pubDate>Sun, 07 Mar 2021 19:28:21 +0800</pubDate><description><![CDATA[集群的应用服务器节点通常会被设计成无状态，用户可以请求任何一个节点。
负载均衡器
负载均衡器根据每个服务器节点的负载情况将用户的请求转到合适的服务器上。
服务器运行的两个部分：
1.根据负载均衡算法得到合适转发的节点。
2.进行转发。
负载均衡器的作用：
实现高可用：当某个节点故障时，负载均衡器会将用户请求转发到另外的可用节点，保证服务持续可用。
实现伸缩性：根据系统的负载情况可用移出和添加节点。
负载均衡算法
轮询方法：
按序分配，将收到的请求依次转发到每个服务器。
缺点是如果服务器性能差异大，性能差的服]]></description><category></category></item><item><title><![CDATA[2-3平衡树学习笔记]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114434507</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114434507</guid><author>weixin_43891021</author><pubDate>Sat, 06 Mar 2021 11:34:11 +0800</pubDate><description><![CDATA[学习红黑树还是先学习一下2-3平衡树，有助于红黑树的理解和学习。
基本概念和性质
2-3平衡树的2和3也就是所说的阶，举个例子2阶就是一个节点存一个值有两个子树，其中左子树全部小于根节点，右子树全部大于根节点，3阶就是一个节点存两个值，有三个子树，左子树全小于根节点的a值，右子树全大于根节点b值，中间子树就a全都介于a和b之间。
查找
和二叉搜索树类似，根据所查的值与当前节点的值的关系进行搜索。
插入
在插入之前先做一次查询，如果查到这个值就不再插入，否则返回最后遍历到的节点。
当树为空：
直接创建一个新的]]></description><category></category></item><item><title><![CDATA[多人文档简单理解]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114417787</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114417787</guid><author>weixin_43891021</author><pubDate>Fri, 05 Mar 2021 22:48:11 +0800</pubDate><description><![CDATA[多人文档需要解决实时通讯和编辑冲突问题。
编辑锁
只要有人编辑这个文档，该文档就会被锁定，其他人无法编辑。这种方案实现简单所以应用最广，但是用户体验不好，并且也不能实时通讯。
GNU diff-patch
diff和patch是两个不同的命令，diff来找到两个版本不同的地方，patch来合并更新两个文件。
实现方法：
每个人都保持长连接，保持好当前的文档副本。
有人编辑时如果停顿5s（根据具体产品）将现有版本和副本diff，将结果传给服务端更新副本。
服务器更新文档，通过长连接发给其他用户，通过patch]]></description><category></category></item><item><title><![CDATA[操作系统锁机制-1]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114330953</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114330953</guid><author>weixin_43891021</author><pubDate>Wed, 03 Mar 2021 20:08:13 +0800</pubDate><description><![CDATA[互斥锁
互斥锁加锁失败时，线程会释放CPU给其他线程。
互斥锁是一种独占锁，当线程A加锁成功后此时互斥锁已经被线程A独占了，其他的线程枷锁就会失败。当线程枷锁失败后内核会将线程设为阻塞状态，锁被释放后内核会在合适的时机唤醒线程。互斥锁加锁失败会产生开销，两个进程的上下文切换。
自旋锁
自旋锁加锁失败后线程会进入忙等，直到它拿到锁。自旋锁开销小一般不会产生线程上线文切换。需要注意的是如果是单核CPU需要抢占式调度器，因为忙等进程不会放弃CPU。
读写锁
只读取公共资源用读锁加锁，要修改公共资源用写锁加锁。
当]]></description><category></category></item><item><title><![CDATA[TCP 常用知识笔记（简）-10]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114321172</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114321172</guid><author>weixin_43891021</author><pubDate>Wed, 03 Mar 2021 16:26:49 +0800</pubDate><description><![CDATA[TCP保障传输可靠
连接握手
可以防止历史连接，同步序列号。
校验和
发送方在发送数据之前计算一个16位的校验和，并且进行校验和填充。
接收方在接收到数据后计算校验和，用计算后的校验和与发送端比较。
序列号和确认应答
TCP传输数据时将每个字节数据进行编号，编号就是序列号。
确认应答就是告诉发送端接收到哪些数据和下次应该发送哪些数据。
可以保证数据有序接收且不会接受重复报文。
超时重传
如果超过计时器时间没收到ACK就会触发超时重传，保证不会因为网络的问题使报文丢失。
流量控制
使发送端的发送速度和接收端的]]></description><category></category></item><item><title><![CDATA[磁盘调度算法-1]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114316963</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114316963</guid><author>weixin_43891021</author><pubDate>Wed, 03 Mar 2021 15:27:14 +0800</pubDate><description><![CDATA[磁盘调度算法
调度磁盘的访问，提高磁盘的访问效率。
先来先服务
顾名思义先到的请求先被服务。先访问先提出访问的磁道。
最短寻道时间优先
先访问到磁头位置时间最短的磁道，但是这种算法会产生饥饿，磁头可能一直在一个小范围内移动。
扫描算法
规定磁头在一个方向上移动，访问所有未完成的请求，直到该方向上最后磁道才调换方向。也叫电梯算法。性能良好，但是中间磁道访问频率高，两遍访问频率低。
循环扫描算法
只在一个方向上扫描，到头后立即复位到起始边。
LOCK和C-LOCK
扫描算法和循环扫描算法的改良，不是访问到最后磁]]></description><category></category></item><item><title><![CDATA[页面置换算法-1]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114312391</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114312391</guid><author>weixin_43891021</author><pubDate>Wed, 03 Mar 2021 15:12:13 +0800</pubDate><description><![CDATA[页面置换算法
CPU访问的内容不在物理内存时就会产生缺页中断。
缺页中断处理的流程：
1.在CPU中访问某个页面，去页表查找这个页面。
2.如果该页表有效就直接使用，否则CPU发送缺页中断请求。
3.操作系统收到了缺页中断，操作系统执行缺页中断处理函数，先会查找该页面在磁盘中的位置。
4.找到磁盘中对应的页面，需要把页面放到物理内存中。在换入之前应该先找到空白页。
5.页面从磁盘换入内存后把页表状态位改为有效。
6.CPU重新执行导致缺页中断的指令。
页面置换算法就是发生在第四步找不到空白页面的情况。
页表]]></description><category></category></item><item><title><![CDATA[文件系统笔记 -7]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114295789</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114295789</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 22:08:14 +0800</pubDate><description><![CDATA[软链接和硬链接
软链接
软连接是创建一个文件，这个文件有自己的inode，但是这个文件的内容是另外一个文件的路径。目标文件删除，链接文件还在，只是找不到指向的文件了。
硬链接
多个目录项中的索引节点是同一个，只有删除所有硬链接和源文件文件才会被真正删除。

...]]></description><category></category></item><item><title><![CDATA[文件系统笔记 -6]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114295179</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114295179</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 21:35:07 +0800</pubDate><description><![CDATA[目录的存储
普通文件存储的是文件数据，而目录文件里面保存的是目录里面一项一项的文件信息。
目录文件最简单的保存方式就是列表，一项一项地将目录里的文件信息（文件名，文件inode，文件类型）列在表里。
但是列表查找费力，所以改成哈希表的形式，把文件名变成一个hash值，如果存在哈希值代表文件在该表中。

...]]></description><category></category></item><item><title><![CDATA[文件系统笔记 -5]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114294717</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114294717</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 21:23:30 +0800</pubDate><description><![CDATA[空闲空间管理
当我们存放一个文件的时候需要找一段空闲空间，所以对于空闲空间的管理也很重要。
空闲表法
把所有空闲空间信息建成一张表，表内容包含空闲区第一个块号和该空闲区块的个数。
当请求分配磁盘空间时，系统一次扫描空闲表里的内容，直到找到一个合适的空闲区域为止。当用户撤消一个文件时，系统回收文件空间，这时也需要扫描空闲表，寻找一个空闲表条目，并将释放空间的第一个物理块号和以及它占用的块数添加到这个表的条目中。
这种方法只对空闲区少的时候好用，空闲区大了查找效率低。这种方法比较适合建立连续空间文件。
空闲链表]]></description><category></category></item><item><title><![CDATA[文件系统笔记 -4]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114292067</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114292067</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 20:50:48 +0800</pubDate><description><![CDATA[文件的存储
文件的存储主要有以下两种：
连续空间存放
非连续空间存放
连续空间存放方式
顾名思义，文件存放在磁盘连续的物理空间中，这种存储方式的读取效率很高。存储时文件头里需要指定起始块的位置和长度。
缺点：有磁盘空间碎片、文件长度不易扩展。
非连续空间存储方式
非连续空间存储方式分为链表方式和索引方式。
链表方式
链表的方式存储是离散的、不连续的,因此可以消除磁盘碎片，同时文件的长度可以动态扩展。根据的实现的方式，分为隐式链表和显式链表。
隐式链表：实现方式是文件头要包含第一块和最后一块的位置，并且每个数]]></description><category></category></item><item><title><![CDATA[文件系统笔记 -3]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114290145</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114290145</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 18:43:38 +0800</pubDate><description><![CDATA[文件打开
打开一个文件之后，操作系统会跟踪进程打开的所有文件，会有一个打开文件表维护文件描述符。文件描述符是文件打开的标志。
文件描述符中有：
文件指针：系统跟踪上次读写位置作为当前文件的位置指针。对于打开文件的进程，此指针是唯一的。
文件打开计数器：记录打开该文件的进程个数，当计数器为0系统关闭文件，删除该条目。
文件的磁盘位置：记录文件磁盘位置，保存在内存中，加快访问。
访问权限：访问模式（只读，读写等）用来允许或接受I/O操作。
文件系统的基本操作单位是数据块。
当用户进程从文件读取 1 个字节大小的]]></description><category></category></item><item><title><![CDATA[文件系统笔记 -2]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114289159</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114289159</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 17:01:09 +0800</pubDate><description><![CDATA[虚拟文件系统VFS
文件系统有很多，但操作系统希望对用户提供一个统一的接口，于是在用户层和文件系统层引入了中间层，也就是虚拟文件系统。
VFS定义了一组所有文件系统都支持的数据结构和标准接口，这样程序员就不需要了解文件系统工作原理只需要了解VFS的接口即可。

...]]></description><category></category></item><item><title><![CDATA[文件系统笔记-1]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114280931</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114280931</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 11:31:15 +0800</pubDate><description><![CDATA[文件系统
以Linux为例
概念
文件系统的基本数据单位是文件，文件系统的作用是对磁盘上的文件进行组织管理。组织的方式不同就会形成不同的文件系统。
Linux系统为每个文件分配两个数据结构：索引节点（记录文件元信息），目录项（记录目录层次结构）
索引节点（inode）：用来纪录文件元信息，如inode编号，文件大小，各种日期，访问权限，以及在磁盘的位置等。
目录项（dentry）：用来纪录文件的名字，索引节点指针以及其他目录项的层级关系。目录项是内核维护的一个数据结构，不存放在磁盘而是缓存在内存。
目录项和]]></description><category></category></item><item><title><![CDATA[进程间通信笔记 - 2]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114276084</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114276084</guid><author>weixin_43891021</author><pubDate>Tue, 02 Mar 2021 10:58:44 +0800</pubDate><description><![CDATA[信号量
信号量一般配合其他方式一起使用，主要实现进程间的互斥与同步，而不是缓存数据。
信号量表示资源的数量，控制信号量的方式有两种原子操作：
P操作：将这个信号量减一，减一后如果信号量小于0代表资源已被占用进程需要阻塞等待。反之表明资源可用可以正常执行。
V操作：把信号量加一，加一后如果信号量大于等于0代表有阻塞的进程，于是会唤醒运行，反之代表没有阻塞的进程。
P操作用在进入共享资源之前，V操作用在进入共享资源之后，两个操作成对出现。
如果信号量初始为1代表互斥信号量，为0是同步信号量。

...]]></description><category></category></item><item><title><![CDATA[进程间通信笔记-1]]></title><link>https://blog.youkuaiyun.com/weixin_43891021/article/details/114273515</link><guid>https://blog.youkuaiyun.com/weixin_43891021/article/details/114273515</guid><author>weixin_43891021</author><pubDate>Mon, 01 Mar 2021 22:45:15 +0800</pubDate><description><![CDATA[进程间通信
每个进程的用户地址空间都是独立的，一般而言不能相互访问，所以进程通过内核进行通信。
管道通信
管道就是内核里的一串缓存，管道传输数据是无格式的流且大小受限，通讯数据遵守先进先出原则。
匿名管道的通信范围是父子进程，命名管道的范围是任意两个进程。
消息队列
管道效率低不适合频繁地交换数据。
消息队列是保存在内核中的消息链表。
发送的数据会被分成一个一个的数据单元，即消息体（数据块）。消息的发送方和接收方要先约定好消息体的数据类型。消息队列的生命周期跟随内核，如果没有释放消息队列或者关闭操作系统，消]]></description><category></category></item></channel></rss>