- 博客(42)
- 收藏
- 关注
原创 网络通信详细流程
一、路由器的功能1、协议转换:能对网络层及其以下各层的协议进行转换。2、路由选择:当分组从互联的网络到达路由器时,路由器能根据分组的目的地址按某种路由策略,选择最佳路由,将分组转发出去,并能随网络拓扑的变化,自动调整路由表。3、能支持多种协议的路由选择:路由器与协议有关,不同的路由器有不同的路由器协议,支持不同的网络层协议。如果互联的局域网采用了两种不同的协议,例如,一种是TCP/IP协议,另一种是SPX/IPX协议(即Netware的传输层/网络层协议),由于这两种协议有许多不同之处,分布在互联网中
2021-11-05 16:06:02 555
原创 游戏任务设计
角色任务 quest一、简介一个游戏流程中总会有各种各样任务去引导玩家熟悉游戏或者提高玩家参与度, 这些任务多种多样,如果没有一个统一处理的模块;代码那将会十分冗余;所以项目中必须要有一个处理这些任务的机制, 减少重复代码的编写, 增强代码的可阅读性, 提高开发效率;一个任务必不可少的流程有:接收任务 → 触发增加任务进度事件 → 所有进度完成时任务状态变为完成 → 提交任务;任务有自动接收也有玩家主动接收,很多情况是根据玩家等级来获取玩家可看见任务列表, 在玩家主动或自动接取完任务后达到任务要求
2021-10-29 14:47:51 2874
原创 erlang总结
receive子句的消息匹配模式:如果消息很简单,使用atom就可以描述的话,没必要使用tuple,tuple会消耗更多的内存,而且减慢了进程的处理速度。i()列出当前进程的详细信息,regs()列出所有注册进程和端口的详细信息。ets:i()列出所有ets表的详细信息。atom不会被垃圾回收,因此为所有进程都进行注册有可能会耗尽内存。建议只对长生命周期的进程进行注册。给pid发送消息不会有任何错误,哪怕该进程不存在;但是,当注册的进程不存在时,通过注册名给它发消息会出错。进程对接收到的消息不进行处
2021-10-29 11:06:33 266
原创 可靠数据传输
可靠数据传输对于应用层、传输层、链路层都很重要 由于网络层提供的尽力而为服务是不可靠的所以在传输层就要有可靠数据传输协议来确保可靠什么是可靠?1.传输的数据包没有错误2.传输的数据包不丢失3.传输的数据包顺序要正确一 停等协议(SW):发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。数据在传送过程中会发生哪些损坏?1.比特差错:数据包的部分比特从0变成了1或者从1变成了0。2.分组丢失:分组到达一个中转的路由器时,路由器的输入队列已经满了,此时分组就会溢出,即被
2021-10-28 20:36:07 589
原创 Spring
1.基础(IOC 控制反转 ,DI 依赖注入), 整合Junit 整合web2.AOP 切面编程,3.JdbcTemplate3.事务处理IOC相当于Mapspring概述spring是什么spring用于创建对象的注解 功能相当于XML配置中的@Component 把当前类对象存入Spring容器中不写参数就默认value=类名首字母小写<cotext:component-scan base-package=“com.hxh”> 表示扫描com.hxh下所有注解@Con
2021-10-28 20:14:30 137
原创 设计模式等
设计模式之代理模式设计模式来源于生活,每一种设计模式在现实世界中都能有与它相关的处理方式,关于代理模式,我们听到的见到的最多的可能就是静态代理、动态代理之类的,代理模式的定义:代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。UML结构图如下:代理模式的应用代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访 问,简而言之就是用一个对象来代表另一个对象。静态代理编译时执行就创建好代理类在代理类中注入依赖,即引入需要代理的实体类,通过代理类来调用
2021-10-28 20:13:50 1895
原创 排序等算法
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度: 一个算法执行所耗费的时间。空间复杂度:运行完一个程序所需内存的大小。n: 数据规模k: “桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存算法分类1、冒泡排序(Bubble So
2021-10-28 20:09:26 105
原创 Java并发
JavaConcurrency源码地址线程和锁在并发编程中的作用,类似于柳钉和工字梁在土木工程的作用要想构建稳健的并发程序,必须正确地使用线程和锁为什么要做并发??并发其实式一种解耦合的策略,它帮助我们把做什么(目标) 和什么时候做(时机)分开这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作)并发的客观认识编写并发程序会在代码上增加额外的开销正确的并发式非常复杂的,即使对于非常简单的问题并发中的缺陷因为不易重现也不容易被发现并发往往需要对设计
2021-10-28 20:06:23 164
原创 进制操作,数据底层计算机基础
位运算(&、|、^、~、>>、<<)1.位运算概述从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。例int a = 35;int b = 47;int c = a + b;计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加:35: 0 0 1 0 0 0 1 147: 0 0
2021-10-28 11:54:03 1740
原创 工具使用IDEA等
1.IDEA启动默认打开工程选择页面设置 把下图Reopen last project on startup 的勾选去掉2.设置代码提示不区分大小写 如图把Match case的勾选去掉3.有了 IDEA 我就有了 ssh 远程工具可能大部分人都不知道 idea 还有 ssh 的功能, 平常可能都是依靠一些外部工具来连接服务器比如 xshell, putty 之类的, 但每次需要操作服务器时, 还需要切换到另外一个软件, 这样才能操作.其实 idea 默认就提供了这样的功能如图选择 star
2021-10-27 16:17:07 406
原创 Java高级数据结构
1.红黑树红黑树其实就是一种数据结构,设计它的目的就是为了高效地进行增删改查,性能极其之高,仅通过几十次查询就能从百亿级的数据中查找到数据而链表从百亿数据中找数据它就要查百亿次,百亿次的查找数据库是不能忍受的它应用的地方很多,比如说java中的HashMap和TreeMap。还有就是linux也经常使用到。由于节点之间地址不连续,所以红黑树只适于存在内存的数据,不适合磁盘所以该数据结构在面试的时候是一个常问问题红黑树性质约束:1.结点是红色或黑色2.根结点是黑色3.从根节点到叶子节点,不会
2021-10-27 15:45:53 255
原创 MYSQL底层
读这一篇文章是可以参照上一篇磁盘的博文一起看MySql使用的B+Tree原理数据库索引为何采用BTree?红黑树等数据结构也可以用来实现索引 效果不如B+树1.红黑树节点存储数据少,地址不连续,不适合磁盘存取的数据,不适合存储大量数据,I/O浪费太大,读取到的资源浪费也大2.HashMap用红黑树是因为HashMap是存在内存中不是磁盘 无需进行磁盘I/O内存不能存储大量数据文件系统及数据库系统普遍采用B-/B+Tree作为索引结构索引利于快速找到数据,索引本身很大,不可能全部存储内存,因此
2021-10-27 15:42:56 130
原创 操作系统总结
Operation-System下面是我在学习操作系统中写的一些操作系统常用算法 写于2018年 大二上学期 我对它们进行了整理 通过敲完这些算法 会让你更理解操作系统的原理 使用 VC6.0 和 CB环境都行 纯C语言编写 源码地址银行家算法自然语言描述:设 Requesti是进程 Pi的请求向量,如果 Requesti[j]=K,表示进程 Pi需要 K 个 Rj类型的资源。当 Pi发出资源请求后,系统按下述步骤进行检查:(1) 如果 Requesti[j]≤Need[i,j]
2021-10-27 15:40:06 290
原创 Mysql练习
一 磁盘(disk)也就是我们电脑的硬盘,磁盘由以下5个组织构成像MYSQL数据库存储的数据就是在磁盘中 即使断电数据也不会消失,不过性能没有基于内存的Redis高1.盘片(platter)磁盘中一般有多个盘片组成,每个盘片包含两个面,上下两面各一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量一般在5片以内。盘面的编号自下而上,最底为第0面。2.磁头(head)磁头可以沿磁盘半径方向运动(寻道),不同磁头以磁头号来区分,3.磁道(track)磁道是磁盘旋转时磁头在盘面划出的一个
2021-10-27 15:37:21 183
原创 计算机网络相关
1.从输入URL到页面加载发生了什么?总体来说分为以下几个过程:1.DNS解析2.TCP连接3.发送HTTP请求4.服务器处理请求并返回HTTP报文5.浏览器解析渲染页面6.连接结束1.DNS解析DNS解析的过程就是寻找哪台机器上有你需要资源的过程。当你在浏览器中输入一个地址时,例如www.baidu.com ,其实不是百度网站真正意义上的地址。互联网上每一台计算机的唯一标识是它的IP地址,但是IP地址并不方便记忆。用户更喜欢用方便记忆的网址去寻找互联网上的其它计算机,也就是上面提到的百
2021-10-27 14:44:30 1228
原创 Java中重点知识
1.&(按位与)和&&(逻辑与)的区别?&&具有短路功能,当第一个表达式为false,则不执行第二个表达式。&可以当位运算符,例如一个整数与15做&操作,可以获得该整数最后4个人bit位。2.Integer 与 int 的区别?int是Java提供的8种原始数据类型之一,Java为每个原始类型提供了封装类,Integer为的就是以对象的形式去更好地操作int类型的变量。Integer默认为null,int默认为0。3.String是基本类型吗
2021-10-27 11:59:46 152
原创 IO的原理
1,学IO流之前,我们写的程序,都是在内存里自己跟自己玩。比如,你声明个变量,创建个数组,创建个集合,写一个排序算法,模拟一个链表,使用一些常用API,现在回想一下,是不是在只是自己在内存里玩一玩?计算机组成包括运算器,控制器,存储器,输入设备,输出设备。那么你前面的工作,仅仅够你的程序和内存以及CPU打打交道,如果你需要操作外部设备呢?比如键盘,显示器,再比如,最常见的外设:硬盘?甚至未来世界里的每家每户都有的机器人,“如何让你的程序和机器人进行交互呢?”2,所以程序设计语言必须要提供程序与外部设备交互
2021-10-27 11:56:57 403
原创 Java线程池
线程池概念线程池: 简单理解,它就是一个管理线程的池子。优势(1)、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;(2)、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;(3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一
2021-10-27 11:55:32 98
原创 Java类加载机制
Java程序通过编译器javac后变成.class字节流文件,类加载器就将.class加载到JVM中。类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范
2021-10-27 11:54:46 117
原创 Mysql主从同步,数据库连接等
1 master,记录数据更改操作启用binlog日志设置binlog日志格式设置server_id2slave运行2个线程Slave_io:复制master主机binlog日志文件里的sql到本机的relay-log文件里Slave_sql:执行本机relay_log文件里的sql语句,重现master的数据操作SQL调优学习笔记SQL优化的5个方面1.服务器硬件性能(机械硬盘换固态硬盘)2.MySql服务器优化3.SQL语句本身优化4.反范式设计优化(阿里规范)5.索引优化.
2021-10-26 23:04:33 260
原创 Lua学习
题目一、给一个表,表里有5个数,在[0-13]之间,其中0可以表示任意数,判断这个表是否连续?思路:连续的条件:1、表中都是02、表中有4个03、0个数不大于3,经过排序之后除去0之外,最大值减去最小值的差小于5注意:要排除掉除去0之外的数里面有相同的数local list = {0,0,2,5,1}function toCheck () table.sort(list) -- 把数组从小到大排序 local zero_num = 0 for k,v in pair
2021-10-26 23:02:42 111
原创 Lua数据结构
Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础。如数组、记录、线性表、队列和集合等,在Lua中都可以通过table来表示。一、数组在lua中通过整数下标访问表中的元素即可简单的实现数组。并且数组不必事先指定大小,大小可以随需要动态的增长。a = {}for i = 1,100 do a[i] = 0endprint("The length of array 'a' is " .. #a)squares = {1, 4, 9, 16, 25}print("T
2021-10-26 23:01:07 318
原创 volatile
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机
2021-10-26 22:59:39 76
原创 Synchronized
一 Synchronized简介Synchronized是java内置的关键字。代表这个方法加锁,相当于不管哪一个线程,运行到这个方法时,都要检查有没有其它线程正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程运行完这个方法后再运行此线程,没有的话,锁定调用线程,然后直接运行。Synchronized是同步锁,保障原子性、可见性、有序性1 原子性指一个操作一旦开始,就不会被其他线程所干扰,不可中断。2.可见性指一个线程对共享变量进行修改,另一个能立刻获
2021-10-26 22:58:44 1098
原创 TCP三次握手四次挥手过程理解
SYN:同步请求ACK:对同步请求的响应seq:当前数据包序列号ack:期望对方下一条数据包的序列号第一次握手: 主机A向B发送连接请求客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号x,保存在包头的序列号(Sequence Number)字段里。第二次握手: 主机B对收到的主机A的报文段进行确认服务器发回确认包(ACK)来应答。即SYN标志位和ACK标志位均为1,同时将确认序号(Acknowledgement Number)设置为客户的初始序号加1,即
2021-10-26 00:13:10 1212
原创 可靠数据传输(rdt)实现的底层原理
可靠数据传输对于应用层、传输层、链路层都很重要 由于网络层提供的尽力而为服务是不可靠的所以在传输层就要有可靠数据传输协议来确保可靠什么是可靠?1.传输的数据包没有错误2.传输的数据包不丢失3.传输的数据包顺序要正确一 停等协议(SW):发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。数据在传送过程中会发生哪些损坏?1.比特差错:数据包的部分比特从0变成了1或者从1变成了0。2.分组丢失:分组到达一个中转的路由器时,路由器的输入队列已经满了,此时分组就会溢出,即被
2021-10-26 00:10:30 892
原创 Redis
1.Redis单线程处理请求为啥性能这么高?(10万QPS)(1) 单线程操作(CPU不需要创建/销毁线程,避免上下文切换,无并发资源竞争的问题,减少锁的消耗)。(2) redis的底层数据结构做了很多优化,设计巧妙,数据存储类似于HashMap的,读写操作都是O(1)的时间复杂度(3) Redis是完全基于内存的,绝大部分请求是纯粹的内存操作,数据存在内存中,非常快速。(4) 使用多路I/O复用模型,非阻塞IO;注意:上述每一项都可以单出来扯很久,篇幅有限,我在这里不打算深入。了解越多你会发现r
2021-10-25 10:19:05 245
原创 线程池学习
1 线程池的优势(1)降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗,提高性能;(2)提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;(3)方便线程并发数的管控。因为线 程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。(4)提供更强大的功能,延时定时线程池2 线程池主要的参数public ThreadPoolExe
2021-10-25 10:18:05 57
原创 Java的IO
BIOBIO B指的是blocking的意思,就是阻塞。服务端开发使用ServerSocket绑定端口号后,程序就会监听该端口,等待accept事件,accept方法会阻塞当前主线程当服务端收到accept事件时,程序就会拿到一个客户端与当前服务端连接的Socket。通过该Socket服务端可以进行读写,不过Socket读写方法都会阻塞当前线程,为了能继续等待其他客户端连接,所以BIO为每个Socket开启一个线程单独处理Socket读写。但难以支持过多的连接,1万个客户端连接就需要1万个线程,
2021-10-25 10:17:31 59
原创 回朔123
1 子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)class Solution { List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> subsets(int[] nums) { backtrack(nums, 0, new ArrayList<>()); re
2021-10-25 10:16:58 62
原创 Erlang数据结构
整数 Integer Erlang可表示任意大的整数,大整数自动转换成bignums类型,比固定大小的整数类型相对效率较低。 16#2A 其中2A是一个16进制的数。如:2#1010是二进制。 Character表示字符的ASCII码。如:Character 表示字符的ASCII码。如:Character表示字符的ASCII码。如:a = 97 $\n。浮点数 Float基元 Atom表示文字常量.
2021-10-25 10:16:07 205
原创 gen_server
一. 相同点(特点):启动进程通信gen_server和gen_fsm都是通过gen模块来启动一个持续recv的进程,监听着进程外给自己发送的消息,或者是自己给自己发送的消息。维护消息队列(消息邮箱)gs和gf都维护了一个消息邮箱,类似于消息队列的数据结构,存储着进程收到的所有消息。在消息队列不为空时,会向消息队列获取消息,并消费消息,对消息做出对应的处理。唯一进程消息处理与分发从模块方法上看,erleng 的gs和gf都是通过gen_server与gen_fsm模块统一调用和消息分发。以g
2021-10-25 10:15:24 288
原创 配置文件规则
服务端常用数据样式描述1: 取工作区的第一列作为内容输出list{list, Sheets}例如:fun: {list, cb_fun, handle, {list, [“主线任务”, “支线任务”]}}data: list() -> [10000, 10001].2: 取工作区的所有行指定列作为内容输出{tuple_list, ValFields}{tuple_list, Sheets, ValFields}{tuple_list, Sheets, ValFields, Opt
2021-10-25 10:14:35 218
原创 Erlang
Erlang的出现是为了实现一套容错,可伸缩,软实时的高可用系统。如电话系统能够在流量高峰期时,监督和确保紧急服务正常, 避免设备故障导致中断。可伸缩:指系统可以适应负载和可用资源的变化,如平滑处理峰值流量而不丢失请求。分布式:指系统组成集群并相互交互协作。 在单台机器上,通过多个节点实例能更好地利用多核处理器的效能。容错:指在其环境存在故障的情况下仍可以可预期的方式运转。确保错误的请求或者故障不会导致进程崩溃。软实时:指响应和延迟的可预测性,保字在可接受的时间内做出响应。无论同一时刻有多少请求,吞
2021-10-25 10:13:29 903
原创 GIt使用
最近项目中使用git感觉不太熟练, 使用起来总出现一些问题,以前使用git就简单个人项目中使用, 没有项目开发中这么多分支,并且自己的项目操作出现问题也没啥影响, 所以git用的比较随便, 一段时间没使用git忘得也很快, 于是想花点时间整理一下彻底地理解git的一些原理和操作, 也为了以便自己需要时可以回过来看看, 所以打算将git学习形成文档, 提高在项目中使用git的效率; 一 设置标识git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配
2021-10-25 10:12:56 76
原创 1 01背包
1 01背包有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。public class beibao01 { public static v
2021-10-25 10:11:13 81
原创 Erlang开发建议
确保没有任何编译警告Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针)。因此string速度较慢,空间占用较大使用’++'时,left list会被拷贝,然后添加到right list的头部,因此最好把length较短的list放在左侧‘–’ 运算与 '++'运算1> [1,2,3,4] – [1] – [2].[2,3,4]这是从后面算起的,先算 [1] – [2] ,得到 [1] 后被 [1,2,3,4] --,.
2021-10-21 21:27:08 141
原创 MySQL安装
简介MYSQL数据库是一种小型数据库,应用较为广泛, MYSQL安装分为安装版安装和解压版安装两种,解压版安装的好处是安装个过程简单,但是到后期中文乱码问题不能得到较好的解决,甚至无法解决,安装版只要安装成功,环境变量就自动被指,简单高效,我们选择安装版。我们首先拿到安装包,当然,没有安装包的同学可以自行去官网下载(mysql5.7只有解压版)我们双击安装包进入这个界面我们点击next以后来到下面这页面,首次安装我们选择change,如果我们以前安装过这个东西,我们要点击remove删除以前的文件
2021-10-21 21:03:06 60
原创 Erlang
Erlang Erlang的出现是为了实现一套容错,可伸缩,软实时的高可用系统。如电话系统能够在流量高峰期时,监督和确保紧急服务正常, 避免设备故障导致中断。 可伸缩:指系统可以适应负载和可用资源的变化,如平滑处理峰值流量而不丢失请求。 分布式:指系统组成集群并相互交互协作。 在单台机器上,通过多个节点实例能更好地利用多核处理器的效能。 容错:指在其环境存在故障的情况下仍可以可预期的方式运转。确保错误的请求或者故障不会导致进程崩溃。 软实时:指响应和
2021-09-28 00:00:00 555
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人