12 2021 档案

摘要:一、秒杀业务为什么难做 1)im系统,例如qq或者微博,每个人都读自己的数据(好友列表、群列表、个人信息);2)微博系统,每个人读你关注的人的数据,一个人读多个人的数据;3)秒杀系统,库存只有一份,所有人会在集中的时间读和写这些数据,多个人读一个数据。例如:小米手机每周二的秒杀,可能手机只有1万部, 阅读全文
posted @ 2021-12-29 11:52 Clovran-Wong 阅读(251) 评论(0) 推荐(0) 编辑
摘要:1.代码 Debug Xcode调试工具Instruments 2.网络方面: 网络接口调试--Postman Postman 就是一种模拟 http 请求的工具,同时也可以进行网络抓包。我们可以用来很方便的模拟 get 或者 post 或者其他方式的请求来调试接口。 网络拦截-- Charles 阅读全文
posted @ 2021-12-25 19:47 Clovran-Wong 阅读(122) 评论(0) 推荐(0) 编辑
摘要:1.什么是事务? 事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。 2.事务四大特性(ACID) 原子性(Atomicity) ·  阅读全文
posted @ 2021-12-25 18:54 Clovran-Wong 阅读(210) 评论(0) 推荐(0) 编辑
摘要:1.编译预处理 读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理, 伪指令主要包括以下四个方面 (1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量 阅读全文
posted @ 2021-12-25 17:20 Clovran-Wong 阅读(263) 评论(0) 推荐(0) 编辑
摘要:C++20 的编译器支持 适应新特性的最简单方法是试用它们。那么接下来我们就面临着这个问题:哪些编译器支持 C++20 的哪些特性?一般来说,http://cppreference.com/compiler_support_能提供在核心语言和库方面的答案。 简单来说,全新的 GCC、Clang 和 阅读全文
posted @ 2021-12-24 14:50 Clovran-Wong 阅读(222) 评论(0) 推荐(0) 编辑
摘要:在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等。一切的函数调用都要将不同的数据、地址压入或者弹出栈。因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么工作的。 栈是什么? 简单来说,栈是一种LIFO形式的数据结构,所有的数据都是后进先出。这种形式的数 阅读全文
posted @ 2021-12-24 14:42 Clovran-Wong 阅读(5055) 评论(0) 推荐(3) 编辑
摘要:加锁或消耗资源,会造成线程阻塞。 那在并发处理中,有没有不加锁的方式,来达到线程安全的? 1. 什么是CAS原子操作 在研究无锁之前,我们需要首先了解一下CAS原子操作——Compare & Swap ,现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的是 CMPXCHG 汇编指令。 操 阅读全文
posted @ 2021-12-23 22:43 Clovran-Wong 阅读(1005) 评论(0) 推荐(0) 编辑
摘要:临界区(Critical section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任何时候只允许一个线程访问共享资源,如果有多个线程访问,那么当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并且等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占 阅读全文
posted @ 2021-12-22 19:24 Clovran-Wong 阅读(171) 评论(0) 推荐(0) 编辑
摘要:一致性Hash是一种特殊的Hash算法,由于其均衡性、持久性的映射特点,被广泛的应用于负载均衡领域。 非常简单的Hash算法Group = Key % N来实现请求的负载均衡,通过对集群数量 N 取模,得到该 key 应该查找、存储的服务器节点 问题1:当缓存服务器数量发生变化时,会引起缓存的雪崩, 阅读全文
posted @ 2021-12-21 18:11 Clovran-Wong 阅读(80) 评论(0) 推荐(0) 编辑
摘要:BFS 典型搜索树示意图 // 计算从起点 start 到终点 target 的最近距离 int BFS(Node start, Node target) { std::queue<Node> q; // 核心数据结构 std::set<Node> visited; // 避免走回头路 q.push 阅读全文
posted @ 2021-12-21 01:38 Clovran-Wong 阅读(36) 评论(0) 推荐(0) 编辑
摘要:一、左值和右值 左值: 一般来说,能在内存中取得其地址, 即是左值。比如正常的某个变量,有变量名,有相应的内存空间。 右值:在内存在无取得其地址的,或者说没有变量名的,即是右值。比如函数传参时,拷贝出来的临时变量,比如 a = b+c 中的 (b+c)结果。 左值对应变量的存储位置,而右值对应变量的 阅读全文
posted @ 2021-12-20 21:47 Clovran-Wong 阅读(237) 评论(0) 推荐(0) 编辑
摘要:在服务端中,listen() 只是让套接字进入监听状态,并没有真正接收客户端请求,listen() 后面的代码会继续执行,直到遇到 accept()。accept() 会阻塞程序执行,直到有新的请求到来。 socket结构体不仅仅记录了本地的IP和端口号,还记录了目的IP和端口。 服务器端使用 ac 阅读全文
posted @ 2021-12-19 20:32 Clovran-Wong 阅读(29) 评论(0) 推荐(0) 编辑
摘要:常见 I/O 模型 同步阻塞IO(Blocking IO):用户线程通过调用系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接受的数据拷贝到用户空间,完成read操作。整个IO请求过程,用户线程都是被阻塞的,对CPU利用率不够 同步非阻塞IO(Non-blocki 阅读全文
posted @ 2021-12-19 19:34 Clovran-Wong 阅读(212) 评论(0) 推荐(0) 编辑
摘要:new & delete 过程 当我们使用关键字 new 在堆上动态创建一个对象A时,比如 A* p = new A() ,它实际上做了三件事: 1.向堆上申请一块内存空间(做够容纳对象A大小的数据)( operator new ) 2.使用 static_cast 进行类型转换 3.调用构造函数 阅读全文
posted @ 2021-12-19 17:07 Clovran-Wong 阅读(370) 评论(0) 推荐(0) 编辑
摘要:TCP 包头信息 16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序 32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。 32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。 阅读全文
posted @ 2021-12-17 14:41 Clovran-Wong 阅读(222) 评论(0) 推荐(0) 编辑
摘要:Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请失败返回NULL。默认情况下,Linux内核使用“乐观的”分配内存策略,首先粗略估计系统可使用的内存数,然后分配内存,但是在使用的时候才真正把这块分配的内存给你。这样一来,即使用malloc申请内 阅读全文
posted @ 2021-12-15 15:51 Clovran-Wong 阅读(289) 评论(0) 推荐(0) 编辑
摘要:说法 1: 局部变量是在程序运行时由栈分配,对于没有初始化的局部变量,VC的DEBUG版会把未初始化的变量value,初始化为sizeof(value)个0xCC。所以我们会看到未初始化的整型的值始终是-858993460,而不是任意值。有意思的是汉字“烫”的编码恰好就是11001100110011 阅读全文
posted @ 2021-12-15 15:28 Clovran-Wong 阅读(1039) 评论(0) 推荐(0) 编辑
摘要:树结构 1.二叉搜索树 typedef int DataType; struct TreeNode { DataType data; std::shared_ptr<TreeNode> left_node; std::shared_ptr<TreeNode> right_node; TreeNode 阅读全文
posted @ 2021-12-14 18:23 Clovran-Wong 阅读(100) 评论(0) 推荐(0) 编辑
摘要:直观对比 物理内存:也就是安装在计算机中的内存条,比如安装了 2GB 大小的内存条,那么物理内存地址的范围就是 0 ~ 2GB。这也是CPU可以直接进行寻址的内存空间大小 虚拟内存:虚拟的内存地址。由于 CPU 只能使用物理内存地址,所以需要将虚拟内存地址转换为物理内存地址才能被 CPU 使用,这个 阅读全文
posted @ 2021-12-14 18:09 Clovran-Wong 阅读(700) 评论(0) 推荐(0) 编辑
摘要:进程 VS 线程 进程是资源分配的最小单位,线程是程序执行CPU 调度的最小单位。这个太老生常谈了。 在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。 任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位。 进程有自己的独立地址空间 阅读全文
posted @ 2021-12-14 18:06 Clovran-Wong 阅读(45) 评论(0) 推荐(0) 编辑
摘要:1.Static Static 最大的作用是限定作用域。 1.面向对象的 静态成员变量 静态成员变量是该类的所有对象所共有的。对于普通成员变量,每个类对象都有自己的一份拷贝。整个运行过程中,静态成员变量一共就一份,只分配一次内存,由该类的所有对象共享访问。所以,静态数据成员的值对每个对象都是一样的, 阅读全文
posted @ 2021-12-14 17:46 Clovran-Wong 阅读(123) 评论(0) 推荐(0) 编辑
摘要:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communicati 阅读全文
posted @ 2021-12-14 15:28 Clovran-Wong 阅读(167) 评论(0) 推荐(0) 编辑
摘要:单例模式 #pragma once template<typename T> class Singleton { public: Singleton() = default; ~Singleton() = default; Singleton(const Singleton&) = delete; 阅读全文
posted @ 2021-12-14 00:04 Clovran-Wong 阅读(39) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示