自旋锁和互斥锁的区别
互斥锁在等待期间会放弃cpu,自旋锁在等待期间会处于一种忙等待的状态,不断循环并测试锁。
互斥锁在访问临界区时使用,保证同一时间内只有一个线程访问临界区的资源,只有拿到互斥锁的线程才能访问资源,否则将阻塞在等待锁的过程,直到互斥锁被释放。
自旋锁不是通过休眠让进程阻塞,而是在获取到锁之前一直处于忙等待(自旋)的状态,使用在以下情况:锁持有的时间较短,并且不想在线程调度上花费过多时间。
TCP实现可靠传输依赖哪些机制
面向连接-前提
确认应答-通过ack确认序号确认对方是否收到了发送的数据
超时重传-发送方等待超时后重新发送报文
序号和确认序号-实现了应答机制,以及进行接收方包序号的管理,实现数据的有序交付
校验和字段-检验数据的一致性,如果不一致则丢弃数据
避免丢包机制-通过滑动窗口实现流量控制,通过重传机制实现拥塞控制
发送方发送的大量数据会被先存放在接收方的缓冲区内,等待接收方内核读取,如果接收方读取的太慢,则缓冲区很快会被填满,此时发送方再发送数据时就会产生丢失,对方就要进行重传,通过流量控制能够避免发送方过多的数据重传。流量控制机制主要是通过滑动窗口实现的,接收方每次接收到数据后会计算当前缓冲区剩余空间大小并通知发送方,发送方收到回复后,就能够知道下次发送数据的大小应该在哪个范围内,从而实现流量控制。
拥塞控制主要是避免网络拥堵时发生的丢包现象,通过发送方发送的频率,慢启动,拥塞避免,拥塞发生,快速恢复等机制实现。
STL容器,迭代器,算法
容器是数据类型的集合,内部封装了不同的数据类型,可以通过数组,链表等常用的数据结构来实现。不同的容器反映出程序设计的不同需求。
迭代器是一种高级的指针,用于遍历容器中的元素,返回容器中元素的引用,迭代器的优点是为不同类型的容器提供一个小巧且通用的接口,抽象了容器的遍历逻辑,在不暴露底层数据的条件下进行容器内部数据的遍历。并且通过非const的迭代器还能够间接更改容器内部的元素。
算法是处理数据集中元素的方法,例如他们可以搜索,排序,修改数据等。算法通过迭代器操作容器,因此一个算法只需要编写一次就能够适用于不同的容器,因为迭代器对于不同的容器的通用的。
为了给算法更多的扩展性,需要提供一些被算法调用的附属函数。可以使用通用算法去适应非常特别和复杂的需求。你可以提供自己的搜索标准或者特殊的操作去绑定元素。
stl的概念是将数据和操作隔离开来,数据由容器来管理,操作是由可配置的算法进行定义。迭代器则是容器与适配器之间的桥梁,允许任意容器与算法之间的交互。
Mysql事务的并发问题
脏读 事务A读到了事务B未提交的数据,当事务B回滚后,事务A读到的数据都是脏数据
不可重复读 事务A多次读取同一数据,但每次读到的数据不同,这是因为事务B多次对数据进行更新和提交
幻读 事务A在操作数据的过程中,表数据多次新增或删除,并且新增或删除的数据影响事务A的结果
mysql通过锁和隔离级别实现隔离性。
mysql通过undo log实现原子性,undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。
链接