- 博客(128)
- 资源 (4)
- 收藏
- 关注
原创 dij最短路径算法
Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径。本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1。
2024-03-22 11:43:49 126
原创 定时器实现数据结构比较
大小堆:大小堆的插入和删除操作相对简单,主要涉及上浮(向上调整)和下沉(向下调整)操作,以维护堆的性质。1. 红黑树获得最小值的时间复杂度是O(h), 最小堆的是O(1),因为最小值永远是根节点.红黑树:红黑树的插入和删除操作相对复杂,需要根据红黑树的性质进行调整和旋转,以保持平衡性。2.红黑树相同的时间定时任务,后面需要挂一个桶 类似mutilmap。
2024-01-22 16:28:53 438 1
原创 全球同服方案
数据集中和逻辑分布, 每个区一套游戏服,数据中心固定在某一地区,如global,,适用于游戏玩法上尽量是同区域玩家间互动,并且对网络延迟要求较高的游戏类型。但需要多区域部署,跨区域玩家互动时会有一方玩家网络延迟变大,需要有完善的脏数据回写机制以保证数据一致性。集中部署,跨区域地区做网络优化,如加入udp,或者gate转发, 适用于游戏服务器架构不适合作分布式部署、而运营发行方期望覆盖尽量多的区域,同时游戏网络延迟在200ms以内的游戏。该架构部署简单,主要覆盖区域的玩家游戏体验较好,没有数据一致性问题。
2024-01-11 17:13:35 436
原创 地图移动逻辑
之前经常发生进行同步的时候,第三方客户端上的角色最终停止的位置会比主客户端多走了几步的问题,这时因为对最后一个同步坐标也做了预测的缘故。做预测, 在没有收到下一个同步点的时候,客户端自己做一个位移预测,让角色保持位移的状态,客户端简单地认为角色会保持当前的位移方向和速度继续运动(事实上也确实是保持运动状态的情况居多,变化居少)会有收到最后一个点的时候,角色已经做了预测,并且走超了的情况,这种情况只能按照终点坐标做一个会拉的操作了,或者客户端设定了预测上限,在偏差值不大的情况下允许这种偏差存在也可以。
2024-01-10 20:08:43 439
原创 stl容器
std::stack 和 std::queue: 它们是容器适配器,实际上依赖于其他容器实现(例如 vector, deque, 或 list),因此其 size 复杂度与底层容器的 size()` 复杂度相同。std::forward_list: 时间复杂度为 O(N),其中 N 是容器中的元素数。std::map 和 std::multimap: 时间复杂度为 O(1)(C++11 及以后的版本)。std::set 和 std::multiset: 时间复杂度为 O(1)(C++11 及以后的版本)。
2023-12-08 15:31:34 379
原创 linux api daemon,后台运行进程
函数将当前进程转变为守护进程。在守护进程中,可以执行需要在后台运行的任务。在示例中,守护进程会打印一条消息,然后睡眠10秒,最后打印另一条消息。函数仅适用于Unix/Linux系统,不适用于所有操作系统。在其他操作系统上实现守护进程可能需要使用不同的方法和函数。函数是一个标准的Unix/Linux系统调用,用于将当前进程转变为守护进程。函数可以简化将进程转变为守护进程的过程。例如,下面的代码演示了如何使用。函数的返回值为0表示成功,返回-1表示失败。在Linux系统中,确实有一个名为。
2023-11-29 16:11:42 448
原创 gcc编译优化
thinLTO是GCC引入的一种折衷方案,它结合了整个程序模式和LTRANS模式的优点. 在链接阶段,链接器可以使用这些索引文件来进行全局的优化和代码生成。总体而言,LTRANS和ThinLTO都是有效的链接时优化方式,但根据项目的规模、编译时间和优化需求来选择适合的模式。O3在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
2023-11-24 12:28:40 495
原创 eventfd
flags:eventfd文件描述符的标志,可由三种选项组成:EFD_CLOEXEC、EFD_NONBLOCK和EFD_SEMAPHORE。EFD_CLOEXEC:表示返回的eventfd文件描述符在fork后exec其他程序时会自动关闭这个文件描述符;EFD_SEMAPHORE表:表示将eventfd作为一个信号量来使用。initval:创建eventfd时它所对应的64位计数器的初始值;EFD_NONBLOCK:设置返回的eventfd非阻塞;一个消费者,多个生产的时候,一个消费者,一个生产者。
2023-10-12 20:42:30 657 1
原创 信号驱动io
免去了select的阻塞与轮询,当有活跃套接字时,再由注册的handler 处理, 无需进程主动去check活跃的socket,把检查工作交给内核,进程只需要确定合适处理拷贝即可。不过可以对TCP监听套接字可以使用SIGIO,因为对于监听套接字,产生SIGIO信号的唯一条件是某个新连接完成了。当套接口上有可用数据时,内核将发送SIGIO信号给进程,此时信号处理程序将被调用,并且可以执行相应的操作。这么多条件都会触发SIGIO信号,导致应用进程对该信号一头雾水,没法确定套接字具体发生了什么事情。
2023-09-26 20:38:15 111
原创 nginx
[nginX-1.7.2] worker进程的诞生: ngx_start_worker_processes-PCliangtao-ChinaUnix博客
2023-09-26 17:07:45 83
原创 docker
7. docker run -it -v /root/ceshi:/root centos /bin/bash docker 启动一个centos并且挂载到ceshi目录。docker exec -it 88d23bcbe1f2 /bin/bash , 进入不停止容器。4.docker run -it centos /bin/bash 启动并进入容器。docker rm -f $(docker ps -aq) 删除全部容器。docker attach 容器id , 进入不停止容器。
2023-09-11 17:27:36 185
转载 内存序atomic
截止到此,分析了memory_order_acquire&memory_order_acquire组合以及memory_order_release&memory_order_consume组合的对重排的影响:当对读操作使用memory_order_acquire标记的时候,对于写操作来说,写操作之前的所有读写都不能重排到写操作之后,对于读操作来说,读操作之后的所有读写不能重排到读操作之前;在未进行任何同步的条件下,即使线程A先执行,线程B后执行,线程B读取到的x的值也不一定是最新的值。
2023-09-11 09:49:59 44
原创 真伪随机数
算法生成随机数,比如c++中的 mt19937梅森旋转算法即为一种软件层面的随机数生成算法算法。如果知道了seed和算法的具体实现,别人就可以知道你生成的随机数序列。不是跨平台的,依赖于硬件具体的实现,C++标准没有严格要求,编译器可能会偷懒,用伪随机数糊弄你(特指mingw),而。,原理是用某个仪器一直探测环境中的物理量,将该物理量作为随机数,比如 Intel 和 AMD CPU指令集中的。指令,C++ 中random_device就是利用RDRAND实现的。
2023-08-31 20:43:14 120
原创 gdbserver
B 主机gdb -q Document/trunk/runtime/game/game。A主机 gdbserver :9101 game_2。这时候a主机已经跑来了。其他使用和方法一一样。
2023-07-21 16:16:13 62
原创 条件变量笔记
如果此时存在一个低优先级的线程在等待锁,那么一旦锁被释放,那么这个锁就会被低优先级的线程争抢去,而不会被wait的线程得到,导致wait线程阻塞,无法返回。, 只有本线程和要唤醒的线程,竞争这把锁的时候,,,,就不会存在这种情况.因为唤醒线程和解锁,都是需要再内核态完成的,而先解锁,再唤醒,内核会一次将这两个操作完成,这样就减少了用户态和内核态切换的次数,从而节省了资源。:唤醒后的线程在等待为该互斥锁加锁,一旦锁被释放,wait线程就会立即加锁,而不会发生上述,锁被抢占额度情况。
2023-06-21 17:46:19 389
原创 c++11 atomic 内存序
5.test_and_set() 函数检查 std::atomic_flag 标志,如果 std::atomic_flag 之前没有被设置过,则设置 std::atomic_flag 的标志,并返回先前该 std::atomic_flag 对象是否被设置过,如果之前 std::atomic_flag 对象已被设置,则返回 true,否则返回 false。3. 初始状态c++20之前不确定 ,c++20之后是false。7. c++20以前只提供了上面两个方法。
2023-06-15 16:54:26 463
原创 linux内存
同时堆是一个连续空间,并且堆内碎片由于没有归还 OS ,如果可重用碎片,再次访问该内存很可能不需产生任何系统调用和缺页中断,这将大大降低 CPU 的消耗。2.malloc小于128k的内存,使用brk分配内存, malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。
2023-06-13 14:34:49 468
原创 tcp 神秘的40ms 延迟,关闭nagle算法
默认 TCP_NODELAY=0,表示关闭 TCP_NODELAY 选项,也就是说,关闭了禁止延迟,也就是说有延迟,即采用了 Nagle 算法,会延迟 40ms。
2023-05-06 16:59:42 333
原创 linux 各个版本区别
同一个版本的类unix往往有多个不同的安装镜像,这些镜像往往以livecd、livedvd、netinst等结尾,其中,带live的镜像是一个光盘启动的镜像,也就是说可以从该光盘启动进入系统并可以体验。一般而言,cd的容量小于dvd,所以cd版本的安装文件要小于dvd版本,所带的软件包也会少一些。也可以安装到计算机,但是有些内容可能还需要再次到网站下载(自动)liveCD版本:和liveDVD一样,也是一个体验版和DVD体验版唯一的区别就是CD的存储空间要小一些,文件也会小一些,里面的软件包少一点。
2023-04-20 12:17:33 571
原创 操作系统和进程的资源消耗内存
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4。Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4。
2023-02-21 17:43:19 322 1
原创 使用Clion优雅的完全远程自动同步和远程调试c++ , devlepoment
使用Clion优雅的完全远程自动同步和远程调试c++ , devlepoment
2023-02-17 17:41:44 156
原创 tcp 和udp的区别
特点:可靠传输(应答确认)、提供拥塞控制、全双工通信(允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据)。2. 线程安全,数据报协议自动维护消息的边界,多线程操作同一个描述符也不会出现粘包,半包的问题(每次从接收缓冲都是只能取回一个完整的包)。使用UDP编程,需要自己确保可靠性(参考tcp实现,设计心跳机制、应答确认、超时重传等)。注:UDP协议栈会在发送的时候分片,到了接收重组,每次组好了完整的包就丢给用户,不完整就丢掉,故,可能会出现丢包现象。
2022-12-12 11:57:36 209
原创 gdb工具
执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)然后使用run或者r命令开始程序的执行,也可以使用 run parameter将。执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句。开始执行程序,在main函数的第一条语句前面停下来。跟踪查看某个变量,每次停下来都显示它的值。设置断点,程序运行到断点的位置会停下来。然后输入 file yourpram。继续程序的运行,直到遇到下一个断点。产看函数调用信息(堆栈)
2022-11-28 11:50:19 127
原创 clion run qt 工程报错Error copying file “D:/Qt/Qt5.12.11/Tools/mingw730_64/bin/Qt5Cored.dll“
clion run qt 工程报错。
2022-10-24 18:42:10 852 2
busybox-x86_64
2019-12-18
MySQL-community-5.1.72-1.rhel5.x86_64.rpm-bundle.tar
2019-08-29
VA_X.dll,Visual Assist X安装说明
2019-08-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人