1.乐观锁和悲观锁
乐观锁
是总是假定最好的情况,每次别人去拿数据都认为别人不会去修改,所以不用上锁。但是会在更新的时候判断一下在此期间别人有没有去更新这个数据。实现方法有二,版本号机制和CAS算法。乐观锁是用于多读的类型,这样可以提高数据吞吐量。在多写的情况下每次冲突发生,都会retry,反而降低性能。
悲观锁
总是假定最坏的情况,每次去拿数据都认为别人会修改,所以每次都会上锁。其他人向要拿到这个数据都会被阻塞直到它拿到锁。适用于多写的场景。
乐观锁版本号机制
一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数。当数据被修改时,version值加一,当线程A准备更新数据的时候,在读取数据的同时也会读取version的值,在提交更新的时候,若前后version值相等才更新,否则重试更新操作直到成功。
CAS(compare and swap)算法
是一种有名的无锁算法,在不适用锁的情况下实现多个线程间的变量同步,因此也叫非阻塞同步(Non-blocking synchronization)。
2. static关键字
static全局变量和普通全局变量的区别
存储方式都一样,已初始化的存入进程数据段,未初始化的放入bss段。
作用域不相同。普通全局变量在各个源文件内都是有效的,static全局变量只能在它定义的源文件中使用,可以避免在其他源文件引起错误。
static局部变量和普通局部变量的区别
存储方式不同:static局部变量被保存在数据段或bss段,普通局部变量只有在函数被调用的时候会保存到栈空间。
作用域不同:static局部变量在源文件的所有函数都可以使用,局部变量只能在函数内使用。
static函数与普通函数
普通函数的定义和声明是默认extern的,在源程序的所有文件都可见。static只在本文件可见,且不能被其他文件所用。
3. 数据库索引
完整参考:https://www.jb51.net/article/140749.htm
详细讲了聚集索引,辅助索引
4.poll,epoll,select的区别
- 1.他们都能提供多路IO复用的解决方案,epoll是linux特有的,select是posix所规定的,一般操作系统都有实现。
- 2.对于select来说,单个进程能监听的文件描述符数量是有上限的,底层实现为数组,32位系统最大支持1024个文件描述符。64位系统则为2048个。对socket扫描是线性扫描,即轮询的方式。效率较低。维护一个用于存放fd的数据结构,每次调用都会先将用户输入复制到内核空间然后对数组进行线性遍历。因此,监听的文件描述符越多,select的效率就会越低。
- 3.