持续更新ing 软件测试面试常见问题总结( 二 )


执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口 。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
3.多线程会出现哪些问题
由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,当多个线程同时修改同一条数据时可能会出现脏数据,所以出现了线程锁,即同一时刻允许一个线程执行操作 。线程锁用于锁定资源,可以定义多个锁,当需要独占某一个资源时,任何一个锁都可以锁定这个资源,就好比你用不同的锁都可以把这个相同的门锁住一样 。
如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期,我们因此也称为“线程不安全” 。
锁(LOCK):锁对象一旦创建,就可以随时被进程或者线程调用,并且一次创建锁只有一把,如果多个资源想同时获取锁,必须‘排队’,等上一个进程/线程释放了锁才可以请求获取锁
单纯的锁可能会出现死锁问题:
当一个进程或者一个线程一直调用或者占用同一锁Lock而不释放资源而导致其他进程/线程无法获得锁,就会出现的死锁状况,一直阻塞在()处当有两个进程同时想获取两个锁的时候(再往上推就是多个进程想获取多个锁),由于两者都是出于竞争关系,谁也不让谁,谁快谁得手,但计算机中这种竞争关系是很微妙的,时间的差异性很小,于是,就出现了两者都阻塞在同一个地方,都无法同时获得两个锁或者获取对方已经获取的但还没有释放的锁 。
为解决此问题,引入了可重入锁
可重入锁(RLOCK):重入锁定义后,一个进程就可以重复调用指定次数的一个重入锁,而不用去跟别的进程一起争夺其他锁 。
全局解释锁(GIL):其实的(C语言实现的)解释器上有一把GIL锁,也就是说的程序是处于一个解释器锁的环境中的 。GIL是解释器层面的锁,解决解释器中多个线程的竞争资源问题 。因为GIL的存在,在中同一时刻有且只有一个线程会执行,所以中的多线程被称为“伪多线程” 。
4.linux相关问题
问题一、linux查看文件内容的指令
more(分页查看)、less(可上下滚动查看)、head -n(显示前n行)、tail -n(查看后n行)、cat(内容过多时只会显示最后一屏内容)
四、数据库类 1.数据库视图
作用:简化操作、安全、逻辑独立
详见 数据库视图详解
2.数据库索引的类型?索引的作用
普通索引:
基本的索引类型,没有唯一性限制,允许为NULL值,不可以被引用为外键,一个表可以有多个普通索引
唯一索引:
数据列不允许重复,允许为NULL值,不可以被引用为外键,一个表允许多个列创建唯一索引
主键索引:
数据列不允许重复,不允许为NULL,可以被引用为外键,一个表只能有一个主键索引
聚集索引:
在聚集索引中,表中数据行的物理位置与逻辑值(索引和数据为同一个文件)的顺序相同,一个表中只能包含一个聚集索引,因为物理顺序只能有一个 。聚集索引通常提供更快的数据访问速度 。
覆盖索引
组合索引
全文索引
索引的作用:
1.提高数据查找速度提高
2.提高group by、order by分组与排序的速度
2.数据库的事务
定义:事务就是一个对数据库操作的序列,是一个不可分割的工作单位
特性:原子性 () 一致性()持久性() 隔离性()
解释:
(1)原子性:事务的原子性是指一个事务是一个不可分割的工作单位,要不全部执行,要不全部不执行 。