操作系统
操作系统(三)
- 死锁的基本理论
- 死锁的产生:竞争资源、进程的调度顺序不当
等待请求的资源被释放;自身占用的资源又不释放
死锁的四个必要条件:互斥条件、请求保持条件、不可剥夺条件、环路等待条件

预防死锁的方法:
解决死锁的算法:
- 线程-进程同步
- 同步问题三大经典案例
不同进程之间的读写操作(蓝色一个进程、红色一个进程)

- 乐观锁、悲观锁、可重入锁
- 乐观锁-悲观锁 (都是关于线程同步)
- 悲观锁会给临界资源加锁;乐观锁不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据
自旋 不会放弃CPU
写线程只能获取排他锁;
- 互斥锁与自旋锁的区别——线程间通信
- 互斥锁、读写锁、自旋锁、条件变量
- 自旋锁 (自旋锁的实现原理与互斥锁实现原理不同)
- 读写锁(适合临界资源 多读少写的情况)
- 条件变量
- 进程间有哪些同步的方式——进程间通信
- 进程间通信的方法(管道、消息队列、共享内存、信号、套接字)
- 管道(匿名管道和命名管道)
- 消息队列(生产者消费者属于不同进程,相比管道消息队列可以对数据继续序列化)
- 消息队列可以 单机进程间通信,跨机进程间通信(kafka、rabbitMQ)
- 共享内存
- 信号(仅仅起一个通知的作用,进程之间没有数据交流)
- 网络套接字
- 网络套接字 可以单机进程间,也可以跨机进程间(eg传输层 通过IP地址+端口 形成套接字)
总结:仅消息队列、套接字 可以跨机间进程通信
- 无锁数据结构的原理——CAS原理与无锁技术
- 无锁技术的基石是CAS技术
(通过给旧值版本号的概念,避免CAS与ABA问题)
- 分布式锁的实现方式
- 常见分布式锁的实现方法(三种:redis、zookeeper、基于MySQL)
Redis单节点 通过k-v键值对的方式 实现分布式锁
数据库
数据库(一)
- 关系数据库与其他数据库
- 关系数据库: 把复杂的数据结构归结为简单的二元关系
- 非关系数据库(k-v、文档、列存储数据库、图数据库)
- 数据库的设计、创建与维护
- 现在版本的数据库 DataBase和Schema(模式) 两者同义
create database xxx; - CHARACTER SET = utf8mb4
- 数据表的设计、创建与维护
- 主键 外键 索引
PRIMARY KEY (FCourseld),
FOREIGN KEY(FTeacherld) REFERENCES teacher(Fld)
KEY(列名)
- table options
- partition options
- char、varchar和text有什么区别——表字段属性
- 数字类型
- 日期类型
- 字符串类型
- JSON类型
- 数据库的ACID属性
- ACID 原子性、一致性、隔离性、持久性
- 脏读、幻不可重复读、幻读的概念 与 隔离性
- 隔离级别:未提交读、提交读、可重复读、串行化
注意:我们讨论隔离级别的场景,主要是在多个事务并发的情况下,因此,接下来的讲解都围绕事务并发。
- Read uncommitted 读未提交
- 公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有2000元,singo空欢喜一场。
- 出现上述情况,即我们所说的脏读,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。
- 当隔离级别设置为Read uncommitted时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。
- Read committed 读提交
- singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为何......
- 出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
- 当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。
- 大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。
- Repeatable read 重复读
- 当隔离级别设置为Repeatable read时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。
- 虽然Repeatable read避免了不可重复读,但还有可能出现幻读。
- singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出现了幻觉,幻读就这样产生了。
注:MySQL的默认隔离级别就是Repeatable read。
- Serializable 序列化(串行读)
Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。
数据库(二)
- MySQL索引
- 索引数据结构 对比
改进:二叉树可以通过仅在叶子节点保存数据,叶子节点使用双向链表的方法,实现快速范围查询
二叉树 树高问题 ---> B+树
- 聚簇索引——聚簇索引与非聚簇索
- 聚簇索引
- 非聚簇索引
总结:
- 一个数据表只有一个聚簇索引
- 一个数据表可以有多个非聚簇索引
- 非聚餐索引被称为二级索引:
- 聚簇索引优点:
- 联合索引(多个字段组成)
- 五个具体案例
- 1️⃣ 使用联合索引
- 2️⃣ 使用联合索引
- 3️⃣ 使用联合索引找f_x 但是找f_z时不使用联合索引
- 4️⃣ 不使用联合索引,因为没有联合索引第一个字段
- 5️⃣ 使用联合索引
- MVCC的原理
- MVCC实现的关键是 三个隐藏列
- MySQL常见的日志类型——数据库备份与恢复
- 二进制日志、重做日志、回滚日志、慢查询日志、中继日志
- 重做日志 为了事务提交一定会完成所设置
- 回滚日志 为了方便事务回滚所设置
- MySQL权限维护
- 权限粒度:全局层级、数据库层级、数据库对象层级、列层级
程序设计之面向对象编程
-
面向对象开发的核心思想和概念
-
接口的基本设计
- 接口是系统对外提供的所有服务的抽象,类的所有能够被外部使用者访问的方法构成一个类的接口。
- 类的实现与继承
- 方法重载 和 方法覆盖(重写)
- 继承的使用原则
- 继承树的最上层应该为抽象层