读写锁优化
详细解析读写锁的功能与实现原理,包括读写锁的基本概念、加锁与解锁机制、读写锁的优化策略、读写锁的性能分析等。提供完整的C++代码示例,帮助开发者理解并在实际项目中应用读写锁。
详细解析读写锁的功能与实现原理,包括读写锁的基本概念、加锁与解锁机制、读写锁的优化策略、读写锁的性能分析等。提供完整的C++代码示例,帮助开发者理解并在实际项目中应用读写锁。
kv来描述一个数,一个整数4byte,两个整数8byte,20亿个整数需要16G内存。
数据结构存储:平衡二叉树map、散列表unordered_map。
分治:20亿个整数拆分成若干个范围,分别统计若干个范围中的次数多最大值,汇总若干个范围中的次数最大值,找出次数最大值对应的树。
逆向分析:
2GB = 2 * 2^10 * 2^10 * 2^10 B = 2^31 B,小范围的数字最多 2^31 / 8 = 2^28
有多少个小范围?整数4个字节共32bit,范围为-2^31~2^31,共2^32个整数,2^32/2^28 = 2^4
正向解决:
如果中序遍历为有序的话则为二叉搜索树,为了避免退化为单链表,加入平衡规则后保持平衡则为平衡二叉树,搜索的时间复杂度为O(lgn).
满二叉树、完全二叉树又推出最大堆、最小堆(堆排序、定时器)。平衡二叉树又推出avl、红黑树。
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
前序遍历:根->左->右,1>2>4>5>3>6>7,245这棵树是作为一个整体子树从根节点遍历,这就是递归的思想。
中序遍历:左->根->右,4>2>5>1>6>3>7,每次遍历到子树也是重新左->根->右进行遍历。
后序遍历:左->右->根,4>5>2>6>7>3>1
1 | void PreOrder(TreeNode *root) |
每个进程都有个umask,通过umask函数来设置的,当进程通过带某个mode参数的open函数来创建一个新文件时,文件的访问权限位被设置为mode & ~umask,也就是umask是程序设定的掩码,哪怕你open时mode为777,最后出来的权限有可能不是777了。
共享文件:
IO重定向:
游戏行业(可以让业务定制化,比如自定义重传策略,有些包可以不需要重发)、音视频通话(比如超过1s的包可以不重发)、出于资源的考虑,比如dns解析,手机定位获取隐私,嵌入式设备发送信息(用电池的设备,比如家里的消防传感器,一个电池用5年)、大块数据下载,不考虑网络拥塞。
tcp相比于udp,主要是重发导致的延迟。
tcp时流式传输,而udp是报文传输,发完的数据需要对端一次性读取完整,否则会造成数据丢失,所以一次性最多只能发送1500-20-8=1472的数据量(1500为网卡MTU的大小),避免拆包,加上PPPOE的协议头,一般发送1400就够了,在游戏领域,由于发送的数据量少,一般为572或者500就行了,如果发超过了,tcpdump可以看到会报bad length。
把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。
可以看出,漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。
1 | #include <iostream> |
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。
在 Linux 内核中,0 号进程(也称为 idle 进程)是系统中唯一一个没有被正常进程显式创建的进程,它是在内核启动时创建的,负责消耗 CPU 时间,以保证系统不会浪费 CPU 资源。
1 号进程(也称为 init 进程)是 Linux 系统启动后第一个被创建的进程,它是所有进程的祖先进程。init 进程负责启动系统上其他进程和服务,并在系统关闭时关闭这些进程和服务。
2 号进程(也称为 kthreadd 进程)是一个守护进程,它是内核中的一个主要线程。它是内核线程的创建者,也是唯一的内核线程,其主要职责是协调内核中的各种子系统,如内存管理、进程管理、文件系统等。
需要注意的是,0 号进程、1 号进程和 2 号进程是内核级别的进程,它们不同于普通进程,不会被用户显式创建、销毁或操纵。
进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。
缓存方案主要用于缓存用户定义的热点数据,用户可以通过缓存来获取数据,从而降低数据库的压力。
内存访问速度远大于磁盘访问速度,mysql缓存的数据跟业务无关,缓存的是最近操作的数据。mysql作为项目的主要数据库,缓存数据库只是辅助功能。
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最右边 节点的值。
假设二叉树中至少有一个节点。
完全二叉树的特点,即除了最后一层外,每一层都是满的,并且最后一层上的节点都集中在该层最左边的若干位置上。所以,如果我们按照层次遍历这个完全二叉树,最后遍历到的节点即为底层最右节点。
1 | #include <iostream> |