嵌入式面试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了嵌入式面试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2971字,纯文字阅读大概需要5分钟。
内容图文
-
死锁
-
四个必要条件
-
-
fork()进程数
-
数据库中事务相关内容
事务定义 :数据库事务是构成单一逻辑工作单元的操作集合
BEGIN TRANSACTION //事务开始 SQL1 SQL2 COMMIT/ROLLBACK //事务提交或回滚
特性 :acid
-
a(Atomicity) 原子性 跟锁还是有区别,可以两个事务同时处理同一个资源,但是每个事务的所有操作必须要么都成功,要么都失败。
-
c(Consistency)一致性(能量守恒):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
-
i(Isolation)隔离性:并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
-
d(Durability)持久性:
事务并发的三个问题-
脏读:A事务对数据进行修改的过程中,B事务读取该数据,A事务对该数据进行回滚,那么B事务读到了脏数据。
在事务1对A的处理过程中,事务2读取了A的值,但之后事务1回滚,导致事务2读取的A是未提交的脏数据。
-
不可重复读:A事务多次读取一个数据,在此过程中,B事务对该数据进行了修改并进行了提交,导致A事务读取同一数据时却读到了不同数值。
由于事务2对A的已提交修改,事务1前后两次读取的结果不一致。
-
幻读 :幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.(幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中,比如下面这种情况:)
事务1查询A<5的数据,由于事务2插入了一条A=4的数据,导致事务1两次查询得到的结果不一样
-
事务的隔离级别
? 事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低.
? 隔离级别从低到高依次是:读未提交->读已提交->可重复读->串行化
并发控制技术
-
乐观并发控制:对于并发执行可能冲突的操作,假定其不会真的冲突,允许并发执行,直到真正发生冲突时才去解决冲突,比如让事务回滚。
-
悲观并发控制:对于并发执行可能冲突的操作,假定其必定发生冲突,通过让事务等待(锁)或者中止(时间戳排序)的方式使并行的操作串行执行。
基于锁的并发控制
? 锁通常分为共享锁和排他锁两种类型
-
1.共享锁(S):事务T对数据A加共享锁,其他事务只能对A加共享锁但不能加排他锁。
-
2.排他锁(X):事务T对数据A加排他锁,其他事务对A既不能加共享锁也不能加排他锁
对于可能发生冲突的并发操作,锁使它们由并行变为串行执行,是一种悲观的并发控制。
故障恢复技术
- 事务故障:比如非法输入,系统出现死锁,导致事务无法继续执行。
- 系统故障:比如由于软件漏洞或硬件错误导致系统崩溃或中止。
事务的执行过程可以简化如下:
- 系统会为每个事务开辟一个私有工作区
- 事务读操作将从磁盘中拷贝数据项到工作区中,在执行写操作前所有的更新都作用于工作区中的拷贝.
- 事务的写操作将把数据输出到内存的缓冲区中,等到合适的时间再由缓冲区管理器将数据写入到磁盘。
由于数据库存在立即修改和延迟修改,所以在事务执行过程中可能存在以下情况:
- 在事务提交前出现故障,但是事务对数据库的部分修改已经写入磁盘数据库中。这导致了事务的原子性被破坏。
- 在系统崩溃前事务已经提交,但数据还在内存缓冲区中,没有写入磁盘。系统恢复时将丢失此次已提交的修改。这是对事务持久性的破坏。
数据库系统是通过并发控制技术和日志恢复技术来对事务的ACID进行保证的,从而可以得到如下的关于数据库事务的概念体系结构。
垃圾回收算法
- 标记清楚法(有缺点:标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不触发另一次垃圾收集动作)
- 复制算法:将可用内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另外一块内存上面,然后再把已使用过的内存空间一次清理掉。当回收时,将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)
? 前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内核加载到内存中
原文:https://www.cnblogs.com/ustc-BlueSky/p/12535672.html
内容总结
以上是互联网集市为您收集整理的嵌入式面试全部内容,希望文章能够帮你解决嵌入式面试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。