《计算机网络》备忘录
计算机网络相关知识,用作备忘录,以备查阅。
01 网络协议的分层结构OSI 分层模型:
自上而下分为应用层,表示层,会话层,传输层,网络层,数据链路层,物理层七层
会话层,表示层,应用层称为资源子网(用来数据处理),物理层,数据链路层,网络层称为通信子网(实现数据通信),传输层是通信子网和资源子网的通信接口
五层模型:
应用层:进行应用数据处理,封装后交给传输层
传输层:对应用层数据进行封装,如 TCP 和 UDP 协议
网络层:对传输层数据封装,如 IP 协议,其会提供寻址能力
数据链路层:每台设备有唯一的 MAC 地址(通过 ARP 协议),为网络层提供链路级别传输的服务
物理层:提供二进制传输的服务
网络包封装过程:
02 数据在网络中的封装一个常见的问题:当在浏览器中输入网址后,到网页显示,其间发生的过程?
浏览器对 URL 进行解析
查询 URL 中的服务器对应的 IP 地址,客户端对本地 DNS 服务器采用递归查询,本地 DNS 服务器对 DNS 根服务器进行迭代查询
浏览器通过调用 Socket 库,来委托操作系统的 TCP/IP 协议栈进行 ...
MySQL实战45讲
本文主要是对 MySQL实战 45 讲中内容的一些总结,以备查阅。
01 基础架构:SQL 查询语句如何执行
MySQL 基本架构图如上,大体上分为 Server 层和存储引擎层。前者涵盖了 MySQL 的大多数核心服务,如内置函数,跨存储引擎的功能,如存储过程,触发器,视图等 ;后者则是负责数据的存储和提取,其架构模式是插件式的,如 InnoDB,MyISAM,Memory 等,其中 InnoDB 从 MySQL 5.5 之后成为默认存储引擎。
考虑这样的一条语句:select * from T where ID=10 ,了解一下每个组件的功能。
连接器:用户在发送 SQL 语句前需要和 Server 端连接,TCP 连接之后,连接器对用户身份进行认证。在连接的时候尽量选择长连接,可能会发现 MySQL 的内存占用涨得很快,这是因为执行过程中的临时内存是管理在连接对象里面的。为了解决该问题,可以定期断开连接或者主动执行重置连接 mysql-reset_connection
查询缓存:MySQL 拿到一个查询请求后,先去查询缓存里面看看是不是已经执行过该语句,如果存 ...
LeetCode Rush
本文用于记录在算法题目中使用的技巧或者方法,以备查阅。
链表问题
使用双指针可以解决找固定位置相关问题,环形链表问题,相交链表问题,旋转链表问题
尝试设置 dummyHead 节点,用于处理特殊情况
只知道要删除的节点,实现该节点的删除
头插法和尾插法的不同点,可以使用头插法实现链表的反转,也可以直接使用迭代方法
链表反转问题:全部反转(迭代,递归,头插法),部分反转(递归,迭代),k 个一组翻转(递归,迭代)
合并链表问题:合并两个链表,合并 k 个链表
判断回文链表:使用额外数据结构,反转后半部分的链表再进行比较,使用后序遍历来比较(链表只存在前序和后序)
二叉树问题
二叉树遍历分为 BFS(层次遍历),DFS(前序,中序,后序遍历)
在解决二叉树的问题过程中,通常和其递归遍历框架存在关系,而在编写递归算法中,最关键的是要明确函数的定义是什么,然后使用这个递归推到最终结果,而不要跳入到递归的细节中去
递归解决二叉树问题:左右翻转二叉树,二叉树展开为链表(先序),填充每个节点的下一个右侧节点指针(注意不同父节点下的关系),将数组构建为最大二叉树,二叉树最大深度,判断 ...
《操作系统概念》笔记
本文总结了《操作系统概念》中的知识点,以便查阅。
第二章 操作系统结构操作系统的服务:主要包括以下功能:
用户界面
程序执行
IO 操作
文件系统操作
通信:通过共享内存或者消息交换实现
错误检测
资源分配
记账:记录用户使用资源类型和数量
保护和安全
系统调用:提供操作系统的服务调用接口,该部分通常使用 C 或者 C++ 实现,当然,对某些底层硬件操作可能需要使用汇编。向操作系统传参的方法有:寄存器传参,栈传参,表传参。
系统调用类型:进程控制,文件管理,设备管理,信息维护,通信,保护。
操作系统的结构:
简单结构:如 MS-DOS,并没有仔细划分为模块
分层方法:每层上调用的接口是不同的,用于区分用户接口和不同等级的系统接口
微内核:主要功能在于为客户端程序和运行在用户空间的各种服务提供通信,通信是通过消息传递实现的
模块:最佳方法是可加载的内核模块,常见于现代 Linux 系统中
操作系统的引导:加载内核以启动计算机的过程,称为系统引导。大多数的操作系统都有一个引导程序,改程序能够定位内核,并将其加载到内存以开始执行。当 CPU 收到一个重置事件 ...
《深入浅出MySQL》笔记
本文用于记录《深入浅出MySQL》里面的知识要点,以备再次查阅。
第二章 SQL基础MySQL使用入门:
SQL语句分类:DDL,DML,DCL。
DDL:数据定义语言,对数据库内部的对象进行创建,删除,修改等操作。
123456789101112131415161718// 数据库CREATE DATABASE dbname;SHOW DATABASES;USE dbname;DROP DATABASE dbname;// 表CREATE TABLE tablename ( column_name1, type1 constraints, ... column_namen, typen constraints);DESC tablename; SHOW CREATE TABLE tablename;DROP TBALE database;ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];ALTER TABLE tablename ADD [COLUMN] column_ ...
《Java并发编程实战》笔记
本文总结了《Java并发编程实战》中的关键点,可以用于查阅其中的知识点。
第二章 线程安全性线程安全性:当多个类访问同一个类的时候,这个类始终都能表现出正确的行为,就称该线程是线程安全的。
原子性:
竞态条件(Race Condition):当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。比如懒汉式单例模式中的 getInstance 方法,基于先检查后执行,由于需要检查 instance 是否为 null,再判断是否需要实例化,此时就存在竞态条件。
复合操作:指的是将一系列的操作合并成一个,使其满足原子性,比如 AtomicLong 里面的 incrementAndGet 方法。
加锁机制:
内置锁:使用关键字 synchronized 实现同步锁,修饰方法的时候锁就是方法调用所在的对象,静态的 synchronized 方法以 Class 对象为锁。
123synchronized (lock) { // 访问或者修改由锁保护的共享对象}
重入:当某个线程请求一个由其他线程持有的锁的时候,发出请求的线程会阻塞。但是如果一个线 ...
《Effective Java》笔记
本文是《Effective Java》第三版的读书笔记。
第二章 创建和销毁对象
考虑使用静态工厂方法代替构造函数:获取一个类的实例的传统方式是使用类提供的公开构造函数,另外一种方法是类提供公开静态工厂方法,用于返回实例。使用静态工厂方法优点:
静态工厂方法有确切名称,便于阅读
静态工厂方法不需要在每次调用时创建新对象
可以通过静态工厂方法获取返回类型的任何子类的对象,提供灵活性
返回对象的类可以随调用的不同而变化,作为输入参数的函数,声明的返回类型的任何子类型都是允许的
当编写包含方法的类时,返回对象的类不需要存在,如JDBC
静态工厂方法缺点:
没有公共或受保护构造函数的类不能被子类化
程序员很难找到它们,下面是一些静态工厂方法的常用名称:
from:一种类型转换方法,接收单个参数并且返回相应实例
of:一个聚合方法,接受多个参数返回一个实例
valueOf:替代from和of但是更加冗长的方法
instance或getInstance:返回一个实例,该实例由参数描述,但具有不同的值(可能会缓存)
create或newInstance:该方法保证每个调用都返回一个新实例
...
一致性算法
本文主要介绍分布式系统中的一致性算法,包括 Panxos,Raft 和 ZAB 算法。
一致性概念CAP 理论:对于一个分布式系统,不能同时满足以下三点:
一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
可用性(Availability):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
分区容错性(Partition Tolerance):一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
一致性模型:
弱一致性:如果能容忍后续的部分或者全部访问不到,则是弱一致性。
最终一致性:如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。如 DNS,Gossip( ...
深入理解JAVA虚拟机笔记
本文主要整理由周志明编写的《深入理解Java虚拟机》第三版书籍的整理笔记。
第二章 Java内存区域与内存溢出异常运行时数据区域:
程序计数器:通过改变其值来获取下一条需要执行的字节码指令。
虚拟机栈:每个方法执行的时候会创建一个栈帧,用于存储局部变量,方法出口等信息。
本地方法栈:同虚拟机栈,只不过本地方法栈是为本地方法服务的。
堆:几乎所有的对象实例都会在这里面分配。
方法区:用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
运行时常量池:是方法区的一部分,常量池表,Class 文件中描述信息会放在此处。
直接内存:在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
对象的创建:当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个 ...
设计模式
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。本文介绍设计模式。
设计模式简介设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
GoF:四位作者合称,他们提出的设计模式主要基于以下面向对象设计原则:
对接口编程而不是对实现编程。
优先使用对象组合而不是继承。
设计模式的用途:是开发人员的共同平台,代表着最佳的实践。
设计模式的类型:创建型模式,结构型模式,行为型模式。另外将介绍 J2EE 模式:
创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式( ...