<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[WilliamCode的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/WilliamCode</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; WilliamCode]]></copyright><item><title><![CDATA[Linux下使用HugePage减少TLB-Miss，以及使用HugePage创建共享内存]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/130403896</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/130403896</guid><author>WilliamCode</author><pubDate>Thu, 27 Apr 2023 12:49:08 +0800</pubDate><description><![CDATA[TLB miss是导致程序内存访问延迟的一大原因。特别是使用大量内存时TLB会变得异常拥挤。一个常见的TLB miss导致的内存延迟的现象是：访问一个连续数组，每4KB出现一次较大的访问延迟。因此使用HugePage（巨页）能够改善内存访问延迟。本文主要介绍在共享内存IPC场景下使用HugePage的方法。单进程访问内存的方式会更简单。]]></description><category></category></item><item><title><![CDATA[epoll socket编程中的错误处理]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/127245220</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/127245220</guid><author>WilliamCode</author><pubDate>Mon, 10 Oct 2022 15:14:04 +0800</pubDate><description><![CDATA[epoll socket编程中的错误处理]]></description><category></category></item><item><title><![CDATA[C++Atomic与内存序]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/126139289</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/126139289</guid><author>WilliamCode</author><pubDate>Wed, 03 Aug 2022 15:03:14 +0800</pubDate><description><![CDATA[C++ 内存模型]]></description><category></category></item><item><title><![CDATA[Windows和Linux下使用共享内存在C++和Python之间共享DataFrame]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/124557454</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/124557454</guid><author>WilliamCode</author><pubDate>Tue, 03 May 2022 18:18:43 +0800</pubDate><description><![CDATA[参考资料

windows api: https://docs.microsoft.com/en-us/windows/win32/api/
《Linux-UNIX系统编程手册》
Python Doc: https://docs.python.org/3/library/mmap.html
Linux manual: https://man7.org/linux/man-pages/man2/mmap.2.html

实现（windows）
主要功能
用C++创建共享内存，用Python进行读取，用csv格]]></description><category></category></item><item><title><![CDATA[C++线程池（固定线程数，条件变量通知，future返回）]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/124557300</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/124557300</guid><author>WilliamCode</author><pubDate>Tue, 03 May 2022 16:38:36 +0800</pubDate><description><![CDATA[参考资料：

《C++并发编程实战》
https://en.cppreference.com

代码下载
https://github.com/541380000/csdn_share/tree/main/threadpool_cpp
实现(见注释)
#pragma once
#include &lt;vector&gt;
#include &lt;queue&gt;
#include &lt;thread&gt;
#include &lt;atomic&gt;
#include &lt;condition]]></description><category></category></item><item><title><![CDATA[手写一个 RPC 远程调用(C++)]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/123131347</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/123131347</guid><author>WilliamCode</author><pubDate>Fri, 25 Feb 2022 13:53:58 +0800</pubDate><description><![CDATA[手写一个 RPC 远程调用(C++)]]></description><category></category></item><item><title><![CDATA[一些常用的Linux命令]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/120726619</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/120726619</guid><author>WilliamCode</author><pubDate>Tue, 12 Oct 2021 16:43:41 +0800</pubDate><description><![CDATA[1.查找文件 find ./ -name "name.txt" (精准匹配)

2.去掉文件夹下，所有文件的prefix_前缀，比如prefix_text.txt -&gt; text.txt

for f in `ls`; do mv $f `echo $f | sed "s/^prefix_//g"`; done

3.给文件夹下所有文件加一个前缀prefix_

for f in `ls`; do mv $f "prefix_$f"; done


...]]></description><category></category></item><item><title><![CDATA[Libevent基础之 Reactor模式]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/120675690</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/120675690</guid><author>WilliamCode</author><pubDate>Sat, 09 Oct 2021 17:28:22 +0800</pubDate><description><![CDATA[个人作品，未经允许禁止转载！

该代码意在说明reactor的原理，没有深究细节。

详见注释


#include&lt;stdio.h&gt;
#include &lt;sys/epoll.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;ctime&gt;
#include &lt;netinet/in.h&gt;
#include &lt;cerrno&gt;
#include &lt;cstdlib&]]></description><category></category></item><item><title><![CDATA[Epoll编程笔记]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/120668914</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/120668914</guid><author>WilliamCode</author><pubDate>Sat, 09 Oct 2021 14:57:42 +0800</pubDate><description><![CDATA[个人作品，未经允许禁止转载！！！

解决IO问题的编程模型及特点

1.阻塞等待

缺点：一个fd等待时，其他fd无法被监听

2.多线程阻塞等待

缺点：一个fd占用一个线程，线程过多，效率很低

3.非阻塞、忙轮询

缺点：无效轮询占用大量CPU时间

4.Select

缺点：能够打开的fd数量受内核限制，如需修改，需要编译内核。效率较低，每次需要遍历fd数组，复杂度和最大fd数量相同

5.Epoll

优点：用红黑树管理fd，每次返回可以读写或者发生其他事件的fd，大部分情况下效率高于select]]></description><category></category></item><item><title><![CDATA[Libevent安装]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/120668819</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/120668819</guid><author>WilliamCode</author><pubDate>Sat, 09 Oct 2021 12:58:08 +0800</pubDate><description><![CDATA[最近在学习libevent，记录一下安装过程，方便日后查看。

首先，安装openssl

1.下载openssl源码:/source/index.html (openssl.org)


wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz

2.解压


tar -zxvf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l/

3.编译安装


./config
make -j16
sudo make inst.]]></description><category></category></item><item><title><![CDATA[【设计模式】]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/110533132</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/110533132</guid><author>WilliamCode</author><pubDate>Thu, 03 Dec 2020 18:10:09 +0800</pubDate><description><![CDATA[软件设计的6大基本原则SOLID

1、Single单一性原则

一个类只负责一类方法的封装，一个方法只负责单一的功能的封装。

该原则是高内聚，低耦合的基础。高内聚指功能相同的方法内聚在同一个类中，共同完成一个功能的代码块聚合在一个方法中；低耦合指一个类之间的方法尽量少的相互调用，修改一个方法不会或者很少的影响另外一个方法。

2、Open&amp;Close 开闭原则

对扩展开放，对修改关闭。由于旧代码已经经过测试和实践检验，不能对旧代码进行修改，而是只能在旧代码基础上进行扩展，添加新的代码，而非修改]]></description><category></category></item><item><title><![CDATA[Mybatis 自动类型转换]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/109178385</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/109178385</guid><author>WilliamCode</author><pubDate>Tue, 20 Oct 2020 11:57:43 +0800</pubDate><description><![CDATA[1、新建类xxxTypeHandler，实现TypeHandler接口 或 继承 BaseTypeHandler类


package com.william.typehandler;

import com.william.mapper.IdCardType;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
impor]]></description><category></category></item><item><title><![CDATA[Mybatis 插入并获取自增主键]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/109176999</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/109176999</guid><author>WilliamCode</author><pubDate>Tue, 20 Oct 2020 11:00:12 +0800</pubDate><description><![CDATA[1、编写select


&lt;insert id="insertUserTestAutoIncrement" parameterType="Student" useGeneratedKeys="true" keyProperty="id"&gt;
    insert into students(password,age,salary,name) values (#{st.password}, #{st.age}, #{st.salary}, #{st.name});
  &lt;/insert&gt;]]></description><category></category></item><item><title><![CDATA[Mybatis联合查询]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/109167962</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/109167962</guid><author>WilliamCode</author><pubDate>Mon, 19 Oct 2020 20:12:07 +0800</pubDate><description><![CDATA[一对一联合查询

查询student表和pwd表的一对一

1、写resultMap


&lt;resultMap id="OneToOneResultMap" type="Student"&gt;
    &lt;id column="id" jdbcType="INTEGER" property="id" /&gt;
    &lt;result column="password" jdbcType="VARCHAR" property="password" /&gt;
    &lt;result ]]></description><category></category></item><item><title><![CDATA[Mybatis批量插入方式比较]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/109166933</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/109166933</guid><author>WilliamCode</author><pubDate>Mon, 19 Oct 2020 19:25:14 +0800</pubDate><description><![CDATA[效率：普通for循环 &lt; BATCH方式获取mapper &lt; foreach标签拼接sql

主函数代码：


package com.william;

import com.william.mapper.Student;
import com.william.mapper.StudentExample;
import com.william.mapper.StudentMapper;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
]]></description><category></category></item><item><title><![CDATA[使用MybatisGenerator]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/109159299</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/109159299</guid><author>WilliamCode</author><pubDate>Mon, 19 Oct 2020 13:53:07 +0800</pubDate><description><![CDATA[1、向pom.xml添加依赖项


&lt;dependency&gt;
            &lt;groupId&gt;mysql&lt;/groupId&gt;
            &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
            &lt;version&gt;8.0.22&lt;/version&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
          ]]></description><category></category></item><item><title><![CDATA[Java多线程的3种实现方法:Thread,Runnable,Callable]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/109149814</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/109149814</guid><author>WilliamCode</author><pubDate>Sun, 18 Oct 2020 20:59:00 +0800</pubDate><description><![CDATA[1、继承Thread类，重写run方法


public class Main {
    static public void main(String[] args){
        Thread thread = new Thread(){
            public void run(){
                System.out.println("正在执行的线程名:" + Thread.currentThread().getName());
            }
   ]]></description><category></category></item><item><title><![CDATA[Mysql安装]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/104630060</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/104630060</guid><author>WilliamCode</author><pubDate>Tue, 03 Mar 2020 12:57:34 +0800</pubDate><description><![CDATA[1、下载安装包（8.0.19版本）：

链接：https://pan.baidu.com/s/1vORXjeap7US2bdWDZA6pNQ
提取码：cu79

2、解压到d盘的任意目录下，但是要知道解压到了哪。比如解压到D:\MySQL，得到新的文件夹mysql-8.0.19-winx64

3、将D:\MySQL\mysql-8.0.19-winx64\bin，加入系统环境变量PATH

4...]]></description><category></category></item><item><title><![CDATA[【Java】基于敏捷开发的简易Web服务器（附下载）]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/104467098</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/104467098</guid><author>WilliamCode</author><pubDate>Sun, 23 Feb 2020 21:20:07 +0800</pubDate><description><![CDATA[这是一款简易的Web服务器，使用JavaSE的基本工具，实现了主页、404页面、登录、注册、动态页面等最原始的功能。

github地址：https://github.com/541380000/Easy-Web-Server-Java

    通过敏捷开发的方式，14个小版本快速更迭，能够看到代码的快速变化与结构调整。

    项目实现的具体功能有：

1、对Http请求的解...]]></description><category></category></item><item><title><![CDATA[【Java课程设计】仿QQ多人聊天室（基于TCP协议与JavaSwing）附下载]]></title><link>https://blog.youkuaiyun.com/WilliamCode/article/details/104362321</link><guid>https://blog.youkuaiyun.com/WilliamCode/article/details/104362321</guid><author>WilliamCode</author><pubDate>Mon, 17 Feb 2020 18:32:22 +0800</pubDate><description><![CDATA[仿QQ多人聊天室

下载地址：链接：https://pan.baidu.com/s/1dLFjSxwTA4gL5lI0B4UGuQ
提取码：2qs0

有两个项目，分别是服务器chatterServer和客户端chatter，先开启服务器，再开启客户端，默认8888端口。

先上图（回环测试，即自己和自己聊天）：



实现的主要功能：

1、一对一聊天：连接到服务器的所有客户端和另一个客户端“...]]></description><category></category></item></channel></rss>