<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Potato_10的博客]]></title><description><![CDATA[跬步至千里]]></description><link>https://blog.youkuaiyun.com/Potato_10</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Potato_10]]></copyright><item><title><![CDATA[并查集算法与应用]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119648242</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119648242</guid><author>Potato_10</author><pubDate>Fri, 13 Aug 2021 14:18:00 +0800</pubDate><description><![CDATA[相关概念：
并查集的最重要两个操作：
1、合并操作merge(x, y)。即合并两个原本不相交的集合，此所谓 “并”。
2、查找操作find(x)。即检索某一个元素属于哪个集合，此所谓 “查”。
并查集的朴素实现
只需要一个数组就能表示集合，我们用fset[i]表示元素i所在的集合编号。
1、初始化每个元素一个集合：fset[i] = i
2、查找x属于属于哪个集合，直接通过下标索引
3、合并x、y的操作，需要判断x、y是否相等

朴素算法实现中，合并操作的时间复杂度太高。如果有n次合并操作，那么总的时间复]]></description><category></category></item><item><title><![CDATA[最小生成树算法]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119647007</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119647007</guid><author>Potato_10</author><pubDate>Thu, 12 Aug 2021 16:37:58 +0800</pubDate><description><![CDATA[相关概念：
  连通图：在无向图中，任意两个顶点都有路径相连，则称为连通图。
  连通网：在连通图中，若图的边具有一定的意义，每一条边都对应着一个数，称为权；权代表着连接连个顶点的代价，称这种连通图叫做连通网。
  生成树：一个连通图的生成树是指一个连通子图，它含有图中全部n个顶点，但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边，如果生成树中再添加一条边，则必定成环。
  最小生成树：在连通网的所有生成树中，所有边的代价和最小的生成树，称为最小生成树。
实际问题描述：
  有一张]]></description><category></category></item><item><title><![CDATA[HTTP如何实现有状态协议]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119548369</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119548369</guid><author>Potato_10</author><pubDate>Mon, 09 Aug 2021 22:31:18 +0800</pubDate><description><![CDATA[  HTTP是一种无状态协议，即服务器不保留与客户交易时的任何状态。也就是说，上一次的请求对这次的请求没有任何影响，服务端也不会对客户端上一次的请求进行任何记录处理。
  带来的问题：用户登录后，切换到其他界面，进行操作，服务器端是无法判断是哪个用户登录的。 每次进行页面跳转的时候，得重新登录。
  两种用于保持HTTP状态的技术就应运而生了，一个是 Cookie，而另一个则是 Session。
一、Cookie的概念及实现
  Cookie 是客户端的存储空间，由浏览器来维持。
  具体来说 cookie]]></description><category></category></item><item><title><![CDATA[静态链接与动态链接、静态库与动态库、硬链接与软链接]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119212113</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119212113</guid><author>Potato_10</author><pubDate>Thu, 29 Jul 2021 15:56:28 +0800</pubDate><description><![CDATA[一、C++从代码到可执行程序经历了什么？
（1）预编译：主要处理源代码文件中的以“#”开头的预编译指令。（预编译后形成 .i 文件）
处理规则见下：
  删除所有的#define，展开所有的宏定义。
  处理所有的条件预编译指令，如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
  处理“#include”预编译指令，将文件内容替换到它的位置，这个过程是递归进行的，文件中包含其他文件。
  删除所有的注释，“//”和“/**/”。
（2）编译：把预编译之后生成的xxx.i或]]></description><category></category></item><item><title><![CDATA[高并发服务器的发展]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119211347</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119211347</guid><author>Potato_10</author><pubDate>Thu, 29 Jul 2021 15:05:17 +0800</pubDate><description><![CDATA[高并发高性能服务器是如何实现的？
一、多进程
  历史上最早出现也是最简单的一种并行处理多个请求的方法就是利用多进程。比如在Linux世界中，我们可以使用fork、exec等系统调用创建多个进程，我们可以在父进程中接收用户的连接请求，然后创建子进程去处理用户请求。

这种方法的优点就在于：
  编程简单，非常容易理解；
  由于各个进程的地址空间是相互隔离的，因此一个进程崩溃后并不会影响其它进程；
  充分利用多核资源。
多进程并行处理的优点很明显，但是缺点同样明显：
  各个进程地址空间相互隔离，这一优点]]></description><category></category></item><item><title><![CDATA[HTTP请求报文与响应报文]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119207015</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119207015</guid><author>Potato_10</author><pubDate>Thu, 29 Jul 2021 11:55:51 +0800</pubDate><description><![CDATA[一、HTTP的请求报文格式：
HTTP的请求报文内容包括：
  请求行(request line)、请求头部(header)、空行 和 请求数据(request data) 四个部分组成。

请求行主要包括：请求方法、URL、协议版本
请求头部包括：各类配置信息的key-value值

二、HTTP响应报文格式：
HTTP的响应报文内容包括：
  状态行、响应头、空行、数据（响应体）四个部分组成。

状态行主要包括：协议版本、状态码、状态值
响应头主要包括：各类配置信息的key-value值

三、响应报文]]></description><category></category></item><item><title><![CDATA[Web网页请求过程]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119206394</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119206394</guid><author>Potato_10</author><pubDate>Thu, 29 Jul 2021 11:06:14 +0800</pubDate><description><![CDATA[在浏览器中输入一个网址到获得一个页面，这个过程中有用到哪些协议？
  本地主机与服务器间的通信是两个进程间相互发送报文，而进程是通过 socket套接字发送和接收报文的，想要收发 socket，首先主机与服务器需要通过TCP三次握手建立τCP连接，连接建立之后，把请求报文放入套接字，然后经过传输层、网络层、数据链路层，层层封装，最终经过以太网路由转发给目的服务器；服务器收到请求后，返回响应报文，本地主机接收到响应报文之后，经由浏览器渲染展示。
一、DHCP动态主机配置协议
  需要一个IP地址，告诉网络我是]]></description><category></category></item><item><title><![CDATA[多线程、线程池技术及代码]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119086505</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119086505</guid><author>Potato_10</author><pubDate>Sun, 25 Jul 2021 20:27:48 +0800</pubDate><description><![CDATA[多线程、线程池技术及代码
一、线程池的概念：
  线程池是由服务器预先创建的一组子线程，线程池中的线程数量应该和 CPU 数量差不多。线程池中的所有子线程都运行着相同的代码。当有新的任务到来时，主线程将通过某种方式选择线程池中的某一个子线程来为之服务。相比与动态的创建子线程，选择一个已经存在的子线程的代价显然要小得多。
  主线程选择哪个子线程来为新任务服务，则有多种方式：

主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算法和 Round Robin（轮流选取）算法，但更优秀、更智能的算法]]></description><category></category></item><item><title><![CDATA[服务器编程事件处理模式]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119086091</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119086091</guid><author>Potato_10</author><pubDate>Sun, 25 Jul 2021 19:39:15 +0800</pubDate><description><![CDATA[一、服务器编程基本框架：
  服务器种类繁多，但基本框架一样，不同处在于逻辑处理。





模块
功能




I/O 处理单元
处理客户连接，读写网络数据


逻辑单元
业务进程或线程


网络存储单元
数据库、文件或缓存


请求队列
各单元之间的通信方式


  I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作：等待并接受新的客户连接，接收客户数据，将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行，也可能在逻辑单元中执行，具体在何处执行取决于事件处理模式。]]></description><category></category></item><item><title><![CDATA[阻塞与非阻塞、同步与异步]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119083733</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119083733</guid><author>Potato_10</author><pubDate>Sun, 25 Jul 2021 19:05:39 +0800</pubDate><description><![CDATA[阻塞与非阻塞、同步与异步
一个网络IO过程主要分两部分：数据准备（数据就绪）、数据读写。
一、数据准备阶段（数据就绪阶段）
  数据准备阶段分为两种情况：阻塞接收与非阻塞接收。
阻塞接收：调用IO方法的线程进入阻塞状态。
非阻塞接收：不会改变线程的状态，通过返回值判断。
二、数据读写阶段
  数据读写也分为两种方式：同步写和异步写。
同步写：应用程序自己负责读写过程。
异步写：操作系统负责读写，读写完毕通过通知的方式告知应用程序。
在处理IO的时候，阻塞和非阻塞都是同步IO，只有使用了特殊的API才是异步I]]></description><category></category></item><item><title><![CDATA[TCP可靠传输]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119025152</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119025152</guid><author>Potato_10</author><pubDate>Fri, 23 Jul 2021 10:37:27 +0800</pubDate><description><![CDATA[TCP可靠传输
  TCP协议保证数据传输可靠性的方式主要有：校验和、序列号与确认应答、超时重传、流量控制、拥塞控制.
一、校验和：
循环冗余检验（CRC）：
  收发双方约定一个生成式多项式G(x)，发送方基于带发送数据和生成式多项式计算出差错检测码（冗余码），添加到传输数据后一起传输，接收方通过生成式多项式计算收到数据是否产生了误码。
二、序列号与确认应答：
  序列号：TCP传输时将每个字节的数据都进行了编号，这就是序列号。
  确认应答：TCP传输的过程中，每次接收方收到数据后，都会对传输方进行确认]]></description><category></category></item><item><title><![CDATA[数据库事务]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119007750</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119007750</guid><author>Potato_10</author><pubDate>Thu, 22 Jul 2021 20:34:45 +0800</pubDate><description><![CDATA[一、事务的组成：
  事务可由一条非常简单的SQL语句组成，也可以由一组复杂的SQL语句组成。
  在事务中的操作，要么都执行修改，要么都不执行，这就是事务的目的，也是事务模型区别于文件系统的重要特征之一。
二、事务的四大特性：
A( atomicity)，原子性。
  原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功，整个事务的执行才算成功。事务中任何一个SQL语句执行失败，那么已经执行成功的SQL语句也必须撤销，数据库状态应该退回到执行事务前的状态。
C( consis]]></description><category></category></item><item><title><![CDATA[IO高并发模型]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119004408</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119004408</guid><author>Potato_10</author><pubDate>Thu, 22 Jul 2021 17:50:21 +0800</pubDate><description><![CDATA[一、IO概念
  IO (Input/Output，输入/输出)即数据的读取（接收）或写入（发送）操作。
  通常用户进程中的一个完整IO分为两阶段：
（1）设备空间（磁盘、网络等）  到   内核空间；
（2）内核空间   到    用户进程空间。
  IO有内存IO、网络IO和磁盘IO三种，通常我们说的IO指的是后两者。
  Linux中进程无法直接操作I/O设备，其必须通过系统调用来协助完成I/O动作；内核会为每个I/O设备维护一个缓冲区。
  对于一个输入操作来说，进程IO系统调用后，内核会先看缓冲]]></description><category></category></item><item><title><![CDATA[大小端问题]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/119003359</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/119003359</guid><author>Potato_10</author><pubDate>Thu, 22 Jul 2021 16:57:38 +0800</pubDate><description><![CDATA[一、大小端的概念
  小端模式：低有效字节储存在低的存储地址，小端一般为主机字节序。
  大端模式：高有效字节存储在低的储存地址，大端为网络字节序。
二、如何判断主机字节序是大端还是小端？
实现方式：
  使用强制类型转换。
代码实现：
#include&lt;iostream&gt;
using namespace std;
int main(){
	int a = 0x1234;
	//由于int和char的长度不同，借助int转换成char，只保留低地址部分
	char c = (char)a;
	i]]></description><category></category></item><item><title><![CDATA[进程相关问题]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/118968168</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/118968168</guid><author>Potato_10</author><pubDate>Wed, 21 Jul 2021 17:50:16 +0800</pubDate><description><![CDATA[进程通信方式：
  匿名管道、命名管道、信号量； 共享内存、消息队列、信号；socket
匿名管道：
管道是一种半双工的通信方式，数据只能单向流动，而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系
命名管道：
有名管道也是半双工的通信方式，但是允许在没有亲缘关系的进程之间使用，管道是先进先出的通信方式。
信号量：
信号量是一个计数器，可以用来控制多个进程对共享资源的访问。它常作为一种锁机制，实现进程、线程的对临界区的同步及互斥访问。
共享内存：
共享内存就是映射一段能被其他进程所访问]]></description><category></category></item><item><title><![CDATA[操作系统中的几种调度算法]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/118968772</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/118968772</guid><author>Potato_10</author><pubDate>Wed, 21 Jul 2021 16:53:05 +0800</pubDate><description><![CDATA[一、页面置换算法
1. 先进先出置换算法（FIFO）：
  每次选择淘汰的页面是最早进入内存的页面。
  实现方法：把调入内存的页面根据调入的先后顺序排成一个队列，需要换出页面时选择队头，页面队列的最大长度取决于系统为进程分配了多少个内存块。
  FIFO算法虽然实现简单，但是该算法与进程实际运行时的规律不适应，因为先进入的页面也有可能最经常被访问。
2. 最近最久未使用置换算法（LRU）：
  每次淘汰的页面是最近最久未使用的页面。
  当需要置换一页时，选择在最近一段时间里没有使用过的页面予以置换。
 ]]></description><category></category></item><item><title><![CDATA[页面置换算法]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/118966199</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/118966199</guid><author>Potato_10</author><pubDate>Wed, 21 Jul 2021 15:08:10 +0800</pubDate><description><![CDATA[一、虚拟内存与物理内存
首先说一下物理内存与虚拟内存：
物理内存：
  物理内存有四个层次：分别是寄存器、高速缓存、主存、磁盘。
  寄存器：速度最快、量少、价格贵。
  高速缓存：次之。
  主存：再次之。
  磁盘：速度最慢、量多、价格便宜。
  操作系统会对物理内存进行管理,有一个部分称为内存管理器( memory manager),主要工
作是有效的管理内存,记录哪些内存是正在使用的,在进程需要时分配内存以及在进程完成时回收
内存。
虛拟内存:
  操作系统为每一个进程分配一个独立的地址空间,但是虚]]></description><category></category></item><item><title><![CDATA[常用设计模式（C++版本）]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/118942892</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/118942892</guid><author>Potato_10</author><pubDate>Wed, 21 Jul 2021 11:59:30 +0800</pubDate><description><![CDATA[设计模式
一、单例模式：
  保证一个类仅有一个实例，该实例被所有的程序模块共享。
  该类不能被复制，该类不能被公开创造，构造函数为private，不能被外界实例化，只有一个实例。

懒汉式单例模式(第一次使用时初始化，单线程安全，多线程不安全)

class singleton{
private:
    singleton();
    static singleton* instance;
public:
    static singleton* get_instance(){
        i]]></description><category></category></item><item><title><![CDATA[排序算法的各类变形问题]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/118930104</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/118930104</guid><author>Potato_10</author><pubDate>Tue, 20 Jul 2021 19:31:53 +0800</pubDate><description><![CDATA[排序算法的各类变形
一、快速选择排序（top K问题）
1、快速排序算法：
  随便选择一个数字作为中间点，小于放在左边，大于放在右边。递归对左右两个部分排序。
  时间复杂度O(nlogn)，空间复杂度O(1)。
代码实现：
int partition(int a[], int left, int right){
    int pivot = a[left];                             //主元值
    int i = left;
	for (int j = left; ]]></description><category></category></item><item><title><![CDATA[排序算法及其应用（C++实现）]]></title><link>https://blog.youkuaiyun.com/Potato_10/article/details/118913533</link><guid>https://blog.youkuaiyun.com/Potato_10/article/details/118913533</guid><author>Potato_10</author><pubDate>Mon, 19 Jul 2021 22:28:20 +0800</pubDate><description><![CDATA[排序算法及其应用（C++实现）
一、 常见排序算法：
冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序…
冒泡排序：
  从第0号元素到第n-1号元素遍历，若前面一个元素大于后面一个元素，则交换两个元素，这样可将整个序列中最大的元素冒泡到最后。然后再从第0号到第n-2号遍历，如此往复，直到只剩一个元素。
void bubbleSort(int a[], int n){
    for(int i = 0; i &lt; n; ++i){
        for(int j = 0; j &lt; n]]></description><category></category></item></channel></rss>