嵌入式面试

  1. 死锁mysql

    • 四个必要条件linux

  2. fork()进程数ios

  3. 数据库中事务相关内容算法

    事务定义 :数据库事务是构成单一逻辑工做单元的操做集合sql

    BEGIN TRANSACTION  //事务开始 
    SQL1 
    SQL2 
    COMMIT/ROLLBACK   //事务提交或回滚

    特性 :acid数据库

    1. a(Atomicity) 原子性 跟锁仍是有区别,能够两个事务同时处理同一个资源,可是每一个事务的全部操做必需要么都成功,要么都失败。ubuntu

    2. c(Consistency)一致性(能量守恒):事务的执行结果必须使数据库从一个一致性状态到另外一个一致性状态。一致性状态是指:1.系统的状态知足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,好比转帐先后两个帐户的金额总和应该保持不变。并发

    3. i(Isolation)隔离性:并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时同样。好比多个用户同时往一个帐户转帐,最后帐户的结果应该和他们按前后次序转帐的结果同样。性能

    4. d(Durability)持久性:操作系统

      img
      事务并发的三个问题

      1. 脏读:A事务对数据进行修改的过程当中,B事务读取该数据,A事务对该数据进行回滚,那么B事务读到了脏数据。

        img

        在事务1对A的处理过程当中,事务2读取了A的值,但以后事务1回滚,致使事务2读取的A是未提交的脏数据。

      2. 不可重复读:A事务屡次读取一个数据,在此过程当中,B事务对该数据进行了修改并进行了提交,致使A事务读取同一数据时却读到了不一样数值。

        img

        因为事务2对A的已提交修改,事务1先后两次读取的结果不一致。

      3. 幻读 :幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的所有数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,之后就会发生操做第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉同样.(幻读和不可重复读的区别在于,不可重复读是针对肯定的某一行数据而言,而幻读是针对不肯定的多行数据。于是幻读一般出如今带有查询条件的范围查询中,好比下面这种状况:)

        img

        事务1查询A<5的数据,因为事务2插入了一条A=4的数据,致使事务1两次查询获得的结果不同

    事务的隔离级别

    ​ 事务具备隔离性,理论上来讲事务之间的执行不该该相互产生影响,其对数据库的影响应该和它们串行执行时同样。而彻底的隔离性会致使系统并发性能很低,下降对资源的利用率,于是实际上对隔离性的要求会有所放宽,这也会必定程度形成对数据库一致性要求下降.

    ​ 隔离级别从低到高依次是:读未提交->读已提交->可重复读->串行化

    并发控制技术

    • 乐观并发控制:对于并发执行可能冲突的操做,假定其不会真的冲突,容许并发执行,直到真正发生冲突时才去解决冲突,好比让事务回滚。

    • 悲观并发控制:对于并发执行可能冲突的操做,假定其一定发生冲突,经过让事务等待(锁)或者停止(时间戳排序)的方式使并行的操做串行执行。

      基于锁的并发控制

    ​ 锁一般分为共享锁和排他锁两种类型

    • 1.共享锁(S):事务T对数据A加共享锁,其余事务只能对A加共享锁但不能加排他锁。

    • 2.排他锁(X):事务T对数据A加排他锁,其余事务对A既不能加共享锁也不能加排他锁

      对于可能发生冲突的并发操做,锁使它们由并行变为串行执行,是一种悲观的并发控制。

    故障恢复技术

    - 事务故障:好比非法输入,系统出现死锁,致使事务没法继续执行。
    • 系统故障:好比因为软件漏洞或硬件错误致使系统崩溃或停止。

    事务的执行过程能够简化以下:

    1. 系统会为每一个事务开辟一个私有工做区
    2. 事务读操做将从磁盘中拷贝数据项到工做区中,在执行写操做前全部的更新都做用于工做区中的拷贝.
    3. 事务的写操做将把数据输出到内存的缓冲区中,等到合适的时间再由缓冲区管理器将数据写入到磁盘。

    因为数据库存在当即修改和延迟修改,因此在事务执行过程当中可能存在如下状况:

    • 在事务提交前出现故障,可是事务对数据库的部分修改已经写入磁盘数据库中。这致使了事务的原子性被破坏。
    • 在系统崩溃前事务已经提交,但数据还在内存缓冲区中,没有写入磁盘。系统恢复时将丢失这次已提交的修改。这是对事务持久性的破坏。

    数据库系统是经过并发控制技术和日志恢复技术来对事务的ACID进行保证的,从而能够获得以下的关于数据库事务的概念体系结构。

    img

    垃圾回收算法

    • 标记清楚法(有缺点:标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会致使,当程序在之后的运行过程当中须要分配较大对象时没法找到足够的连续内存而不得不触发另外一次垃圾收集动做)
    • 复制算法:将可用内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另一块内存上面,而后再把已使用过的内存空间一次清理掉。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。固然,98%的对象可回收只是通常场景下的数据,咱们没有办法保证每次回收都只有很少于10%的对象存活,当Survivor空间不够用时,须要依赖于老年代进行分配担保,因此大对象直接进入老年代。
    • 标记-整理算法:在老年代中,对象存活率比较高,若是执行较多的复制操做,效率将会变低,因此老年代通常会选用其余算法,如标记—整理算法。让全部的对象都向一端移动,而后直接清理掉端边界之外的内存

ubuntu的启动过程

+ 系统开始时启动bios(pc环境中,地址是0xFFFF0),第一阶段任务就是上电自检POST
+ bios第二阶段,本地设备初始化和枚举,runtime services,做用是检测顺序排在第一的可启动设备,并启动存放在设备中的操做系统。(当POST结束时,内存中POST相关代码会被丢弃,而runtime services代码一直保存在内存中)
+ 通常的linux会从磁盘中开始启动,磁盘的第一个扇区有主引导记录MBR(Master Boot Record)

img

​ 前446字节是primary bootloader,包含了可执行代码和错误信息字符串。接下去64字节是磁盘的分区表,该分区表中包含了四条分区记录,每条分区记录为16字节,分区记录能够为空,若为空则表示分区不存在。最后是2个字节的magic number,这两个字节是固定的0xAA55,这两个字节的magic number能够用于判断该MBR记录是否存在。

​ primary bootloader的做用就是用于寻找并定位secondary bootloader,也就是Stage 2 bootloader。它经过遍历分区表寻找可用的分区,当它发现可用的分区的时候,仍是会继续扫描其余分区,确保其余分区是不可用的。而后从可用的分区中读取secondary bootloader到内存中,并执行。

  • stage 2 BootOLoader 能够更恰当地称做kernel loader,将linux内核加载到内存中

相关文章
相关标签/搜索