面试准备
Posted yijue-lu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试准备相关的知识,希望对你有一定的参考价值。
首行占位
Python相关
1.Python3特性和变化
1.Python3默认编码是UTF-8,2为ASCII
2.Python3中只有int,2中有int跟long,其中int不能超过sys.maxint
3.Python3中print是一个函数,需要带括号,2中不需要
4.Python3中input接收到的是str,2中接受到的是int(raw_input接受str)
5.Python3中range返回的是可迭代对象(节省内存),2中是列表
2.GIL
全局解释器锁,作用是保证一个进程同一时刻只有一个线程在运行
产生原因:Python的线程是调用C语言的原生线程,当线程执行之后python解释器就无法对其进行控制,解决多线程之间数据完整性和状态同步,就有了GIL锁
释放时机:线程开始IO操作,解释器每隔100opcode(操作码)或15ms
3.解释器
1.CPython:应用最广泛
2.IPython:基于CPython,增强交互体验
3.PyPy:执行速度快(对代码进行动态编译,注意不是解释)
4.JPython:运行在java平台上的解释器,把代码编译成java字节码执行
5.IronPython:.net
4.循环引用
是什么:
解决方法:
1.弱引用:weakref.ref
2.手动回收:gc.collect()
5.内存回收
1.引用计数
2.分代回收
3.标记-清除
6.进程、线程、协程
进程:系统进行资源分配和调度的基本单位
多进程的出现大大提高了用户体验
线程:CPU调度的最小单位
原因:多进程虽然提高了系统运行的效率,也有COW等技术对进程进行优化,但是进程的频繁创建和销毁代价较大、资源的大量复制和分配耗时仍然较高,于是80年代出现了能够独立运行的单位——线程。
多线程之间可以直接共享资源,同时线程之间的通信效率又远高于进程间,将任务并发的性能再次向前推进了一大步。
协程:一种用户态的轻量级线程,即协程是由用户程序自己控制调度的
原因:协程的概念最早提出于1963年,45但由于其并不符合当时崇尚的的“自顶向下”的程序设计思想,未能成为当时主流编程语言的一部分。
随着技术的发展,虽然进程和线程大大提高了cpu的使用率,但一些场景下线程CPU时间片的大量切换其实是做了很多不必要的无用功,特别是Python中因为GIL锁的存在,其多线程很多时候并不能提高程序运行效率,于是协程的概念又开始发挥了作用
7.LEGB
L:Local可能在一个函数或者类方法内部,局部命名空间
E:Enclosed可能在嵌套函数内,闭包作用域
G:Global全局命名空间
B:Built-in内建命名空间
DB相关
1.mysql存储引擎
1.MyISAM:优势是访问速度快
2.InnoDB:5.5.5之后默认,支持事务和行级锁定,外键约束,缺点占用更多空间
3.Merge
4.Memory
2.MySQL索引机制
由存储引擎决定,InnoDB用的是B+树
建立索引可以大大提高MySQL的检索速度,它就像字典的目录,通过目录可以快速找到要查找的内容
B+树与B树的区别:
1.B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有
2.B+树中所有的叶子节点都是通过指针连接在一起,而B树不会
B+树的优点:
1.非叶子节点不会带上ROWID,这样一个块中可以容纳更多的索引项,一是可以降低树的高度;而是一个内部节点可以定位更多的叶子节点
2.叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点间不停地往返移动。
B树的优点:
对于在内部节点的数据,可以直接得到,不必根据叶子节点来定位
Innodb引擎(聚集索引)
Myisam引擎(非聚集索引)
聚集索引跟非聚集索引的根本区别:
表记录的排列顺序与索引的排列顺序是否一致
3.事务特性
ACID:原子性,一致性,隔离性,持久性
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中的所有更改都会被撤销。
4.事务隔离
事务的隔离性是数据库支持事务必备的四个特性之一,简单来说事务隔离就是并发执行的多个事务之间互不干扰。
事务隔离分为四个级别,第一个是RU未提交读,会出现脏读的问题,就是一个事物读取到另一个事物修改但未提交的数据;第二个是RC提交读,解决了脏读的问题,但是存在不可重复读的问题,就是一个事务对同一条数据两次读取结果不一致,这是因为两次读取过程中有其他事务队数据更改并提交;第三个是RR可重复读,解决了不可重复读的问题,但是存在幻读的问题,就是一个事务对同一范围两次读取结果不一致,这是因为两次读取过程中有其他事务对这个范围插入了新记录;第四个是SE可串行化,解决前面三种级别存在的问题,要求所有事务串行执行,读取的每行数据都会加锁,对性能和效率影响很大。
innoDB是mysql默认的存储引擎,默认的隔离级别是RR,并且在RR的隔离级别下更进一步,通过多版本并发控制(MVCC)解决不可重复读问题,加上间隙锁(也就是并发控制)解决幻读问题。因此innoDB的RR隔离级别其实实现了串行化级别的效果,而且保留了比较好的并发性能。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
MVCC:多版本并发控制机制
实现:通过保存数据在某个时间点的快照来实现的,同一个事务里能够看到数据一致的视图
间隙锁:间隙锁是一个在索引记录之间的间隙上的锁
5.Redis
使用场景:
1.缓存高频次访问的数据,降低数据库io
2.分布式架构,做session共享
3.利用zset类型可以储存排行榜
4.利用list做简易MQ或储存最新的n个数据
数据类型:
1.Hash
2.Str
3.List
4.Set
5.Zset
存储机制:
两种:Snapshot和AOF。无论是那种机制,Redis都是将数据存储在内存中。
性能 : Snapshot 性能较高
安全:AOF安全型较好
持久化方式:
以上是关于面试准备的主要内容,如果未能解决你的问题,请参考以下文章
BAT Java面试完整汇总:面试准备(心态+简历)+面试题目+6条面试经验