java并发编程实践学习笔记一

介绍在早期的分时共享系统中,每个进程都是一个虚拟的冯诺依曼机。他们拥有一个内存空间,存储着指令和数据,根据机器语言的语义来顺序的执行指令。线程允许程序控制流的多重分支同时存在于一个进程中,他们共享进程范围内的资源。线程有些时候也被称为轻量级进程。并且大多数现代操作系统把线程作为时序调度的基本单元。 线程的优点线程能通过把异步的工作流程转化为普遍存在的顺序流程,使得程序更容易读写和维护。在多处理器的硬件环境中,使用多线程可以更加有效的使用硬件的资源。 线程的风险在没有充分同步的情况下,多线程中的各种操作的顺序是不可预测的。常见的并发危险还有竞争条件。因为线程共享相同的内存地址空间,并发的运行,他们可能访问或修改其它的线程正在使用的变量。在缺少同步的时候,编译器,硬件和运行时事实上对时间和活动顺序是很随意的,比如在寄存器或高速缓冲中的存储变量,这样会使得他们对于其它线程暂时不可见的。它能提高性能,但是给开发带来了困难。活跃度失败的风险,当一个活动进入某种它永远无法继续再执行的状态时,活跃度失败就会发生了。活跃度失败有多种形式,如死锁(deadlock)、饥饿(starvation)、活锁(livelock)。多线程程序还存在性能危险。 线程安全无论何时,只要有多于一个的线程访问给定的状态变量,而且其中某个线程会写入该变量,此时必须使用同步来协调线程对该变量的访问。 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步以及在调用方代码不必作其它的协调,这个类的行为仍然时正确的,那么称这个类时线程安全的。 对线程安全类的实例进行顺序或并发的一系列操作,都不会导致实例处于无效状态。无状态对象永远是线程安全的。

MySQL技术内幕学习笔记四

视图视图是基于基表的虚表,它由sql查询来定义,可以当作表使用,但是视图中的数据没有实际的物理存储。视图可以作为安全层使用。其作用在于一些应用程序本身并不关心基表,只需要按照视图定义来存取数据。 oracle提供的物化视图Oracle支持物化视图,其不再是虚表,而是基于基表实际存在的表。物化视图可以用于预先计算并保存多表的链接或聚集等耗时操作的结果。在SQL server数据库中称为索引视图。在mysql 中可以使用基表加触发器的策略来实现“物化视图”。 分区表innodb存储引擎支持水平分区,主要用于数据库的高可用管理。 MySQL数据库支持以下几种分区 range分区行数据基于给定分一个连续区间的列值被放入分区 list分区行数据基于一些离散的值被放入分区。 hash分区根据用户自定义的表达式的返回值进行分区(返回值不能是负,必须是整数) key分区根据mysql提供的哈希函数进行分区 如果表中存在唯一索引或主键那么分区列必须是其的一部分

MySQL技术内幕学习笔记三

文件概要 文件类型 参数文件 日志文件 socket文件 pid文件 MySQL表结构文件 存储引擎文件 参数文件 在MySQL实例启动时,会读取一个参数文件进行初始化。 MySQL可以没有参数文件。如果没有参数文件,就以源代码中的默认值为标准。 MySQL的参数分为动态参数,静态参数。动态参数可以在MySQL实例运行的时候更改,而静态参数在MySQL实例的整个生命周期内都不能更改。 日志文件 记录了影响了MySQL数据库的各中类型的活动。 日志文件的类型一般包括:错误日志,二进制日志,慢查询日志,查询日志。 慢查询日志,会记录运行超过long_query_time(默认值为10s)的sql语句。 查询日志,记录了所有对MySQL数据库的请求。默认文件名为:主机名.log。未能正确执行的请求也会被记录。 二进制日志,记录所有对MySQL进行更改的操作。其作用包括恢复数据,复制,审计。 套接字文件 在unix系统下连接本地MySQL可以使用unix套接字方式。该方式需要一个套接字文件。

Redis入门

RedisRedis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库, redis支持数据的持久化,可以将内存中的数据存储到磁盘中。 不仅仅支持key-value类型的数据,还支持list,set,zset,hash等数据结构 支持数据的备份 redis的特点 极高的性能,读取速度可达110000次/s;写的速度高达81000次/s 支持多种数据类型 所有操作都是原子性的(包括多步操作) 其它特性 redis的数据类型和相关命令 string 字符串 一个键最大可以存512mb 123456789101112131415161718192021222324252627//存入set mykey "hello word"//取出get mykey//返回key中的字符串的子字符串getrange key start end// 将key的值设为value并返回旧值getset key value//对key所存储的字符串,获取指定偏移量上的位getbit key offset//获取所有给定key的值mget key1 [key2...]//对所有key存储的字符串,设置或清除指定偏移量上的位setbit key offset value//将值value关联到key,并将key的过期时间设为secondssetex key seconds value//只有在key不存在时设置key的值setnx key value//返回key所存储的字符串的长度srtlen key//将key中存储的值加一incr key//将key所存储的值加上给定的增量值incrbyfloat key increment//在key后面追加字符串append key value

MySQL技术内幕学习笔记二

重做日志缓存 重做日志缓冲(redo log buffer) 重做日志缓冲同样也在innodb内存区。innodb存储引擎会将重做日志信息先放到重做日志缓冲区,然后以一定的频率刷新到重做日志中。 重做日志缓冲不必太大。因为一般每一秒都会刷新到重做日志文件中。默认为8MB,该值可以由innodb_log_buffer_size控制 重做日志缓冲刷新的三种情况。1.master thread每一秒都会刷新一次。 2.每次事务提交时都会刷新一次。 3.重做日志缓冲池剩余空间小于1/2时,会刷新。 额外的内存池 额外的内存池 innodb存储引擎采用一种称为内存堆的方式进行。在给一些数据结构分配内存时,会从额外的内存池中申请,但该内存中的内存不足时,会从缓冲池中申请。 SQL语句的分类 数据库查询语言DQL -各种查询 数据操纵语言DML 增删改 数据定义语言DDL 用来创建数据库中的各种对象,如表,视图,索引等 数据控制语言DCL 授权,回滚数据库等

MySQL技术内幕学习笔记一

数据库是物理操作系统文件或其它形式文件类型得集合。 实例是数据库后台线程和共享内存区。通常数据库和实例是一一对应的关系。一个数据库对应一个实例。 MySQL是一个单进程多线程架构的应用。 MySQL数据库启动时会按照/etc/my.cnf–>/tec/mysql/my.cnf–>/usr/local/mysql/etc/mycnf–>~/.my.cnf的顺序读取配置文件(也可能是.ini后缀)。如果配置文件中有相同的配置则按最后一个读取的文件进行配置。如果没有配置文件,则使用数据库默认参数。 innodb采用聚集的方式存储数据。每张表都是按主键的顺序进行存放的。如果没有显式的在表中定义主键。innodb会为每一行生成一个6字节的ROWID作为主键。 innodb存储引擎的体系架构后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。还要负责将已修改的数据文件刷新到新的磁盘文件。还要保证数据库发生异常情况时,能恢复innodb存储引擎到正常的运行状态。

汇编学习笔记一

寄存器 通用寄存器AX (accumulate累加寄存器);BX(base基地址寄存器);CX(count计数器寄存器);DX(data数据寄存器)。 指针寄存器SP(stack pointer堆栈指针寄存器)BP(base pointer基地址寄存器) 变址寄存器SI(source index源地址寄存器)DI(destination index目标变址寄存器) 控制寄存器IP(instruction pointer指令指针寄存器)FlAG标志寄存器 段寄存器CS(code segment代码段寄存器)DS(data segment数据段寄存器)SS(stack segment堆栈段寄存器)ES(extra segment附加段寄存器) 为了和8位机兼容,通用寄存器,可以分为高8位和低8位。如AX可以分为AH和AL。

TCP/IP学习笔记(三)

DNS(域名解析服务)DNS可以将字符串自动转化为具体的IP地址。 ARP(地址解析协议) 以目标IP地址为线索,来定位下一个应该接收数据分包的网络设备对应的MAC地址。ARP只适用于IPv4. 通过广播发送一个ARP请求包,其中含有想要了解MAC地址的IP。同一个链路中的主机接收并解析。如何发现需要解析的是自己的IP地址对应的MAC地址的话。就将自己的MAC地址加入ARP响应包中。然后把获取到的MAC地址与IP建立映射。然后缓存一段时间。 RARP 从MAC地址获取IP地址的一种协议。 为了解决一些嵌入式设备无法通过DHCP获得自己的IP地址的问题。所以需要建立一个RARP服务器。 NAT技术 是在本地网络中使用私有地址,在连接互联网式转而使用全局IP地址的技术。 内部有一张进行转换的地址的表。 NAPT为了解决私有网络内部多台机器同时通信时,可能会造成全局IP地址不够用。NAPT采用将端口号一起转换的方式来解决这个问题。 无法从NAT外部向内部服务器建立连接。 转换表的生成和转换操作都会产生一定的开销。 通信过程中如果NAT遇到异常所有的TCP连接都会被重置。即使做了容灾备份也无法避免TCP连接的重置。

TCP/IP学习笔记(二)

IP协议 IP相当于OSI参考模型中的网络层。主要作用是实现终端节点之间的通信。数据链路层的主要作用是在同一种互联的数据链路中进行包传递。如果需要跨越多种数据链路,就需要网络层的协助。 IP协议的三大模块1.IP寻址 2.路由 3.IP分包和组包 IP地址用于连接到网络中所有主机中识别出进行通信的目标地址。所以在TCP/IP中所有的主机或路由器都必须设定自己的IP,而网桥或交换集线器不需要自己的IP,因为他们只负责简单的将比特流转发。 路由控制是指将分组数据发送到最终目标地址的功能,即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。 路由控制表(路由择域信息库)为了将数据包发送到目标主机,所有主机都维护着一张路由控制表,该表记录了IP数据下一步应该发给那个路由器。路由控制表存储在路由器或联网计算机上。 IP链路的抽象化IP实现了多个数据链路之间的的通信协议。不同的数据链路有各自的特点。需要对不同的数据链路进行抽象化。不同的数据链路的最大传输单位往往不同。为了解决这个问题IP协议对链路进行了抽象化,屏蔽了链路的差异。 IP是面向无连接型在发送IP数据包之前,不需要建立对端目标之间的连接。其优点在于简化了协议,提高了速度。 IP地址1.IP地址由32位整数来表示。2.IP地址由网络标识(地址)和主机标识(主机地址)两部分组成。3.网络标识在数据链路中的每个端配置不同的值。网络标识必须保证互相连接的每个端的地址不相重复。4.同一个网段中的地址也必须保证主机标识不相重复。

TCP/IP协议学习笔记(一)

TCP/IP协议的分层模型1.应用层 2.传输层 3.互联网层 4.网卡层 5.硬件层(物理层) TCP首部包含的信息 1.源端口号和目标端口号(用于识别发送主机和接收主机的应用,每个应用占用特定的端口)2.数据包的序号3.校验和(用于判断数据是否被损坏) IP首部包含的信息1.接收端IP地址和发送端IP地址2.上一层协议类型标志3.接收端的MAC(物理地址)地址 MAC地址1.MAC地址用于识别数据链路中互联的节点。2.MAC地址长48bit,在使用网卡(NIC)的情况下,MAC地址一般烧录在ROM中。理论上讲MAC地址是不会重复的,但是实际上MAC地址有重复的可能,比如虚拟机上

110111213