同程艺龙系统架构师面试
(1) 线程状态很细致的问,阻塞io
//线程刚创建
NEW,
//在JVM中正在运行的线程
RUNNABLE,
//线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
BLOCKED,
//等待状态
WAITING,
//调用sleep() join() wait()方法可能导致线程处于等待状态
TIMED_WAITING,
//线程执行完毕,已经退出
TERMINATED;
(2) cpu调度算法有什么?
1、先到先服务调度算法(FCFS)
根据就绪队列的到达时间来服务,此时就绪队列是一个FIFO队列,先到先服务,后到的线程不能抢占前面正在服务的线程。这种算法的优点是实现简单,缺点也很明显,就是CPU进程区间变化很大时,平均等待时间会变化很大。
2、最短作业优先调度(SJF)
顾名思义,就是CPU进程区间最短的先执行,如果两个进程区间具有同样的长度,那么按照FCFS来调度。
SJF可以是抢占的,也可以是不抢占的。它的平均等待时间优于FCFS。
3、优先级调度
其实上面的SJF算法就是一种特殊的优先级调度,只不过这里的优先级定义更加广泛一些,SJF算法的优先级是按照CPU进程区间长短来定义的,这里的优先级可以是其他的一些定义。
优先级调度可以是抢占的,也可以是非抢占的。
优先级调度的一个主要问题是无穷阻塞(也称为饥饿),如果一个线程的优先级很低,可能需要等待很长的时间才能到这个线程执行,甚至永远不执行,一种解决方法是老化(随着时间的增长,增加线程的优先级)
4、轮转法调度(RR)
轮转法调度专门是为分时系统设计的。它类似于FCFS,但是增加了抢占为了切换线程。定义一个较小的时间单元,称为时间片,通常为10-100ms。为了实现RR算法,将就绪队列保存为FIFO队列,新进程增加到就绪队列队尾,CPU调度程序从就绪队列选择第一个进程,设置定时器在一个时间片之后再中断,再分派这个进程。
如果该进程的CPU区间小于时间片,进程本身就会释放CPU,调度程序继续处理下一个进程,如果当前进程的CPU区间比时间片长,定时器会产生CPU中断,实行上下文切换,然后将此进程放到就绪队列队尾,继续调度就绪队列第一个进程。
5、多级队列调度:
这里对进程进行分组,在组内使用FCFS和SJF算法,在组间实行优先级调度或者轮转法调度。但是不允许进程在组间切换。
6、多级反馈队列调度
允许进程在组间切换,主要思想是根据不同区间的特点区分进程,如果CPU进程占用过多CPU时间,那么它会被转移到更低优先级队列。这种形式老化阻止饥饿。
(3) redis 常用的语句
1.String类型的数据存储获取
set key value:设置key的值为value,若存在则覆盖,不存在则自动创建decrby
get key:获取key的值,不存在返回nil表示为空,数据若不为String也回返回错误信息
getset key value:首先获取key的值再对其进行修改
del key:删除key及其数据
incr key:对key的数据进行加一操作,只能对满足Integer的数据起作用。若值不存在,那么初始化为0
decr key:对key的数据进行减一操作,只能对满足Integer的数据起作用
incrby key increment(具体数字):对key值增加increment
decrby key decrment(具体数字):对key值减少decrement
append key value:在末尾添加数据,若key不存在则新建
2.hash类型数据(即键值对形式)
hset key filed value:修改key下filed的value,若不存在则自动创建
hget key filed:获取key下filed的值
hmget key filed1 filed2 filed3 …:获取key下的多个filed值hincr
hgetall key:获取所有key中filed的值,这里不会显示filed,只有value
hdel key filed1 filed2 …:删除key下的filed,可同时多个删除
del key:删除整个key中内容
hincrby key filed incrment:增加数字
hexsit key filed:是否存在
hlen key:key中有几个filed
hkeys key:显示所有key
3.list类型
该数据结构是一个双向链表,有头插和尾插两种方式。输出的过程遵从栈的方式
lpush key value1 value2…:使用头插法插入数据
rpush key value1 value2…:使用尾插法插入数据
lrange key start end:显示list,从头到尾,strat表示开始显示位置最小0,end表示结束位置,-1表示末尾,-2表示末尾第二个
lpop key:从头部弹出元素
rpop key:从尾部弹出元素
llen key:获取list中的个数
4.set集合数据类型
set集合与list的最大区别是,set的无序的,取出数据的顺序是不可知的,其次set集合中不允许出现相同的value
sadd key value1 value2 …:添加数据
srem key value1 value2…:移出指定的数据
sinter key1 key2 key3:集合的交集
sunion key1 key2 key3:集合的并集
(4) 你了解数据库的底层吗(扯了一些数据库底层的东西)
(5) java中怎么实现内存溢出
a) 堆溢出
b) 栈溢出
c) 常量池溢出
(6) TCP和UDP有什么区别, 上层协议有哪些
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP对系统资源要求较多,UDP对系统资源要求较少。
上层协议:HTTP、FTP、SMTP
(7) get请求和Post请求有什么区别
-
get 在浏览器回退时是无害的,post 会再次提交数据
-
get 产生的url 地址可以被 bookmark,post 则不可以
-
get 请求会被浏览器主动cache (缓存),post 则不会,除非手动设置
-
get 请求参数会被完整保留在浏览器历史记录里,而post中参数不会被保留
-
get 只接受ASCII 码字符,而post 没有限制
-
get 请求只能进行url 编码,而post 支持多种编码方式。
-
get 把请求参数放在url 上,即http协议头上,post 放在Request body请求体中。
故get 比post 更不安全,不能用来传递敏感信息。附:get 参数放在url上,以?分割url,参数之间以&相连;英文/数字,不做改变,原样发送;
空格转换为+;中文/其他字符,则用base64加密,即%加上“十六进制ASCII码” -
get 一般来说提交的数据最大是2k;(原则上url 长度无限制,但大多数浏览器通常都会限制url 长度在2k(2048字节byte))
post 理论上没有限制,实际上IIS4中最大量为80k,IIS5中为100k。 -
get 产生一个tcp 数据包,浏览器会把http header 和data 一并发送出去,服务器响应200(返回数据)
post 产生两个tcp 数据包,浏览器会先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)附:Http 是基于tcp/ip 关于数据如何在万维网中通信的协议。所以http 的底层是tcp/ip,get 、post 的底层也是tcp/ip,
也就是说,get、post 都是tcp 连接。
(8) mySQL 中实现分页
limit 基本实现方式
一般情况下,客户端通过传递 pageNo(页码)、pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 limit 来解决这个问题:
收到客户端{pageNo:1,pagesize:10}
select * from table limit (pageNo-1)*pageSize, pageSize;
(9) 求两个数组的交集和差集
Forfor循环
RemoveAll+addAll
(10) linux中怎么将数据存储到文件中
(11) linux 权限
(12) maven 生命周期
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
(13) maven deploy 命令
deploy的用法:将maven的web项目部署到远程服务器。
(14)ajax优缺点
优点:
1.最大的优点就是页面无需刷新,在页面内与服务器通信,非常好的用户体验。
2.使用异步的方式与服务器通信,不需要中断操作。
3.可以把以前服务器负担的工作转嫁给客户端,减轻服务器和带宽,可以最大程度减少冗余请求。
4.基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
缺点:
1.AJAX干掉了Back和History功能,即对浏览器机制的破坏。
在动态更新页面的情况下,用户无法回到前一个页面状态,因为浏览器仅能记忆历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的差别非常微妙;用户通常会希望单击后退按钮能够取消他们的前一次操作,但是在Ajax应用程序中,这将无法实现。
2.安全问题技术同时也对IT企业带来了新的安全威胁,ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有ajax也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、SQL注入攻击和基于credentials的安全漏洞等。
3.对搜索引擎的支持比较弱。如果使用不当,AJAX会增大网络数据的流量,从而降低整个系统的性能。
(15)http请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。