<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[chansoncc的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/chansoncc</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chansoncc]]></copyright><item><title><![CDATA[5G基站 — CU和DU分离]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/121850871</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/121850871</guid><author>chansoncc</author><pubDate>Fri, 10 Dec 2021 10:43:42 +0800</pubDate><description><![CDATA[CU的全称是Centralized Unit，顾名思义就是集中单元；DU的全称是Distributed Unit，含义自然就是分布单元了。

坦白说，CU和DU这两个名称是云里雾里，除了集中和分布这两个含义之外，没有提供更多的信息。


	为什么CU和DU要分离？
	
	
	CU和CU分离了到底有什么好处？
	
	
	现在开始部署的5G基站都是基于CU和DU分离架构的吗？
	
	
	01

	—

	为什么CU和DU要分离？

	

	我们先来看看4G和5G无线接入网部分的架构有什么不同：

...]]></description><category></category></item><item><title><![CDATA[HT1621驱动原理详解]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/90753755</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/90753755</guid><author>chansoncc</author><pubDate>Mon, 03 Jun 2019 16:11:01 +0800</pubDate><description><![CDATA[介绍码屏的一般结构、原理、驱动方法和使用HT1621驱动段码屏的方法。



一、  段码屏的显示原理和驱动方法



一般段码屏有段电极和公共极，就像在图 2中，SEG1~SEG5为段电极，COM为公共极。段码屏中的每个段，都填充了一种特殊的液态晶体。在电场的作用下，晶体的排列方向会发生扭转，因而改变其透光性，从而可以看到显示的内容。一般电场电压就加在段电极和公共极的两端。



但...]]></description><category></category></item><item><title><![CDATA[C++ 多态详解]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/88186519</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/88186519</guid><author>chansoncc</author><pubDate>Tue, 05 Mar 2019 16:09:22 +0800</pubDate><description><![CDATA[前几天在网上看到这样的一个问题：

多态现在一般的用法，就是拿一个父类的指针去调用子类中被重写的方法。但我搞不懂为什么要那么做，我们直接在子类中写一个同名的成员函数，从而隐藏父类的函数不就行了么？

然后有人这样回答：

将父类比喻为电脑的外设接口，子类比喻为外设，现在我有移动硬盘、U盘以及MP3，它们3个都是可以作为存储但是也各不相同。如果我在写驱动的时候，我用个父类表示外设接口，然后在子类中重...]]></description><category></category></item><item><title><![CDATA[C++11的原子量与内存序浅析]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/88186350</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/88186350</guid><author>chansoncc</author><pubDate>Tue, 05 Mar 2019 16:05:57 +0800</pubDate><description><![CDATA[C++11的原子量与内存序浅析

一、多线程下共享变量的问题

在多线程编程中经常需要在不同线程之间共享一些变量，然而对于共享变量操作却经常造成一些莫名奇妙的错误，除非老老实实加锁对访问保护，否则经常出现一些（看起来）匪夷所思的情况。比如下面便是两种比较“喜闻乐见”的情况。

(a) i++问题

在多线程编程中，最常拿来举例的问题便是著名的i++ 问题，即：多个线程对同一个共享变量i执行i++ ...]]></description><category></category></item><item><title><![CDATA[利用C++11原子量atomic实现自旋锁详解]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/85067071</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/85067071</guid><author>chansoncc</author><pubDate>Tue, 18 Dec 2018 15:48:54 +0800</pubDate><description><![CDATA[一、自旋锁

自旋锁是一种基础的同步原语，用于保障对共享数据的互斥访问。与互斥锁的相比，在获取锁失败的时候不会使得线程阻塞而是一直自旋尝试获取锁。当线程等待自旋锁的时候，CPU不能做其他事情，而是一直处于轮询忙等的状态。自旋锁主要适用于被持有时间短，线程不希望在重新调度上花过多时间的情况。实际上许多其他类型的锁在底层使用了自旋锁实现，例如多数互斥锁在试图获取锁的时候会先自旋一小段时间，然后才会休眠...]]></description><category></category></item><item><title><![CDATA[C++11 CAS无锁函数compare_exchange_weak的使用]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/85067014</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/85067014</guid><author>chansoncc</author><pubDate>Tue, 18 Dec 2018 15:42:28 +0800</pubDate><description><![CDATA[对compare_exchange_weak这个C++11用来实现CAS无锁算法函数的理解。
可以先看一下cplusplus给出的用这个函数实现无锁链表的例子:


// atomic::compare_exchange_weak example:
#include &amp;lt;iostream&amp;gt;       // std::cout
#include &amp;lt;atomic&amp;gt;       ...]]></description><category></category></item><item><title><![CDATA[C++ 11 Lambda表达式]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/84858985</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/84858985</guid><author>chansoncc</author><pubDate>Thu, 06 Dec 2018 16:14:00 +0800</pubDate><description><![CDATA[C++ 11 Lambda表达式

C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式，可以方便的定义和创建匿名函数。对于C++这门语言来说来说，“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥，但很多高级语言在很早以前就已经提供了Lambda表达式的功能，如C#，Python等。今天，我们就来简单介绍一下C++中Lambda表达式的简单使用。

声明Lambda...]]></description><category></category></item><item><title><![CDATA[无锁同步-C++11之Atomic和CAS;如何理解C ++ 11中的std :: atomic :: compare_exchange_weak]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/84838742</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/84838742</guid><author>chansoncc</author><pubDate>Wed, 05 Dec 2018 16:35:14 +0800</pubDate><description><![CDATA[1、概要

      本文是无锁同步系列文章的第一篇，主要探讨C++11中的Atomic。

      我们知道在C++11中引入了mutex和方便优雅的lock_guard。但是有时候我们想要的是性能更高的无锁实现，下面我们来讨论C++11中新增的原子操作类Atomic，我们可以利用它巧妙地实现无锁同步。

2、传统的线程同步

 


 #include &amp;lt;thread&amp;gt;
#i...]]></description><category></category></item><item><title><![CDATA[理解WebSocket心跳及重连机制（五）]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656559</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656559</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:46:24 +0800</pubDate><description><![CDATA[在使用websocket的过程中，有时候会遇到网络断开的情况，但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有：服务器会继续向客户端发送多余的链接，并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了websocket的心跳了。还有心跳，说明还活着，没有心跳说明已经挂掉了。

1. 为什么叫心跳包呢？
它就像心跳一样每隔固定的时间发一次...]]></description><category></category></item><item><title><![CDATA[WebSocket原理与实践(四)--生成数据帧]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656521</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656521</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:44:54 +0800</pubDate><description><![CDATA[从服务器发往客户端的数据也是同样的数据帧，但是从服务器发送到客户端的数据帧不需要掩码的。我们自己需要去生成数据帧，解析数据帧的时候我们需要分片。

消息分片：
   有时候数据需要分成多个数据包发送，需要使用到分片，也就是说多个数据帧来传输一个数据。比如将大数据分成多个数据包传输，分片的目的是允许发送未知长度的消息。这样做的好处是：
  1. 大数据的传输可以分片传输，不用考虑到数据大小导致的长度...]]></description><category></category></item><item><title><![CDATA[WebSocket原理与实践(三)--解析数据帧]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656474</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656474</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:43:08 +0800</pubDate><description><![CDATA[1-1 理解数据帧的含义：
   在WebSocket协议中，数据是通过帧序列来传输的。为了数据安全原因，客户端必须掩码(mask)它发送到服务器的所有帧，当它收到一个
没有掩码的帧时，服务器必须关闭连接。不过服务器端给客户端发送的所有帧都不是掩码的，如果客户端检测到掩码的帧时，也一样必须关闭连接。
当帧被关闭的时候，可能发送状态码1002(协议错误)。

基本帧协议如下：

 


  0   ...]]></description><category></category></item><item><title><![CDATA[WebSocket原理与实践(二)---WebSocket协议]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656440</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656440</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:41:52 +0800</pubDate><description><![CDATA[WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的。协议定义ws和wss协议，分别为普通请求和基于SSL的安全传输， ws端口是80，wss的端口为443.

WebSocket协议由两部分组成，握手和数据传输。

2-1 握手
WS的握手使用HTTP来实现的。客户端的握手消息是一个普通的，带有Upgrade头的，HTTP Request的消息。
先来看看如...]]></description><category></category></item><item><title><![CDATA[WebSockets通信]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656378</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656378</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:38:02 +0800</pubDate><description><![CDATA[1. websocket是什么？
WebSocket是一种网络通信协议。2. 为什么需要websocket?
我们有http协议，为什么还需要websocket协议呢？
因为http协议有一个缺陷，通信只能是客户端发起请求的，服务器端返回查询结果。比如说 我想知道一个实时新闻，那么每次新闻更新后，我都要刷新页面
，发起客户端请求，服务器端返回结果。不能做到服务器端推送消息给客户端，当然我们可以使用...]]></description><category></category></item><item><title><![CDATA[WebSocket原理与实践(一)---基本原理]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656311</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656311</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:35:12 +0800</pubDate><description><![CDATA[一：为什么要使用WebSocket?1. 了解现有的HTTP的架构模式：
Http是客户端/服务器模式中请求-响应所用的协议，在这种模式中，客户端(一般是web浏览器)向服务器提交HTTP请求，服务器响应请求的资源
(例如HTML页面)和关于页面的附加信息。

1-1. HTTP的特点是：
HTTP是半双工协议，也就是说，在同一时刻流量只能单向流动，客户端向服务器发送请求(单向的)，然后服务器响应...]]></description><category></category></item><item><title><![CDATA[WebSocket协议解析]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83656196</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83656196</guid><author>chansoncc</author><pubDate>Fri, 02 Nov 2018 15:32:26 +0800</pubDate><description><![CDATA[一、协议简介

WebSocket protocol 是HTML5一种新的协议，它是实现了浏览器与服务器全双工通信，本文主要介绍WebSocket协议格式。

WebSocket通信过程分为两步：握手请求和数据传输。

二、握手请求

1、客户端在连接请求时候发送的内容

GET / HTTP/1.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:nu...]]></description><category></category></item><item><title><![CDATA[weak_ptr这个智能指针有什么用？]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83183758</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83183758</guid><author>chansoncc</author><pubDate>Fri, 19 Oct 2018 15:57:52 +0800</pubDate><description><![CDATA[转自: https://segmentfault.com/q/1010000004078858

c++primer：


通过使用weak_ptr，不会影响一个给定的strblob所指向的vector的生存期。但是，可以阻止用户访问一个不再存在的vector的企图。


书上说的作用就这一个，我想不通的是，阻止用户访问一个不再存在的vector，难道就不能通过检测strblob的shared_p...]]></description><category></category></item><item><title><![CDATA[C++ 11 创建和使用共享 weak_ptr]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83183047</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83183047</guid><author>chansoncc</author><pubDate>Fri, 19 Oct 2018 15:25:02 +0800</pubDate><description><![CDATA[1、为什么需要weak_ptr？

在正式介绍weak_ptr之前，我们先来回忆一下shared_ptr的一些知识。我们知道shared_ptr是采用引用计数的智能指针，多个shared_ptr实例可以指向同一个动态对象，并维护了一个共享的引用计数器。对于引用计数法实现的计数，总是避免不了循环引用（或环形引用）的问题，shared_ptr也不例外。

我们先来看看下面这个例子：

#include...]]></description><category></category></item><item><title><![CDATA[Shared_from_this 几个值得注意的地方]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83182020</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83182020</guid><author>chansoncc</author><pubDate>Fri, 19 Oct 2018 14:28:50 +0800</pubDate><description><![CDATA[shared_from_this()是enable_shared_from_this&amp;lt;T&amp;gt;的成员 函数，返回shared_ptr&amp;lt;T&amp;gt;。首先需要注意的是，这个函数仅在shared_ptr&amp;lt;T&amp;gt;的构造函数被调用之后才能使 用。原因是enable_shared_from_this::weak_ptr并不在构造函数中设置，而是在shared_ptr&amp;lt;T&amp;gt;的...]]></description><category></category></item><item><title><![CDATA[信号量 互斥锁 条件变量的区别]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/83113517</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/83113517</guid><author>chansoncc</author><pubDate>Wed, 17 Oct 2018 16:56:21 +0800</pubDate><description><![CDATA[信号量用在多线程多任务同步的，一个线程完成了某一个动作就通过信号量告诉别的线程，别的线程再进行某些动作（大家都在semtake的时候，就阻塞在哪里）。而互斥锁是用在多线程多任务互斥的，一个线程占用了某一个资源，那么别的线程就无法访问，直到这个线程unlock，其他的线程才开始可以利用这个资源。比如对全局变量的访问，有时要加锁，操作完了，在解锁。有的时候锁和信号量会同时使用的”
也就是说，信号量不一...]]></description><category></category></item><item><title><![CDATA[我用C++的理由——关于C和C++的选择]]></title><link>https://blog.youkuaiyun.com/chansoncc/article/details/82982955</link><guid>https://blog.youkuaiyun.com/chansoncc/article/details/82982955</guid><author>chansoncc</author><pubDate>Tue, 09 Oct 2018 15:22:07 +0800</pubDate><description><![CDATA[摘自：http://www.xue163.com/32/6/325715.html，作者：王可。整理的很好！


首先，我不会使用Java或C#，能力上不会，主观上也不会，因为两点原因：1，他们都属于解释型的语言，这有很多问题是我无法容忍的，程序的速度和封装的安全性；2，他们都不够底层，没有指针，却加载了内存管理器，对我来说这些都是麻烦和束缚，对我而言他们都不是足够自由的语言。或者说，我无法接受他...]]></description><category></category></item></channel></rss>