基础设施主要包括网络系统(networking)、存储设备(storage)、服务器(servers)、虚拟化技术(virtualization)。而平台则在基础设施之上,还包括操作系统(OS)、中间件(middleware)以及运行库(runtime)。最后是软件,则在平台的基础上,还添加了数据(date)与应用(application)。
这其实是云计算的三个分层,基础设施在最末端,平台在中间,软件则在顶层,分别是Infrastructure-as-a-Service(IaaS)、Platform-as-a-Service(PaaS)、Software-as-a-Service(SaaS),而别的一些“层”可以在它们之上继续添加。
IaaS也就是基础设施即服务(Infrastructure-as-a-Service),拥有了IaaS,就可以将引荐外包到别的地方去。IaaS公司会提供场外服务器,存储和网络硬件,也可以选择租用。节省了维护成本和办公场地,公司可以在任何时候利用这些硬件来运行其应用。
目前比较知名的IaaS公司有亚马逊、Bluelock、CSC、GoGrid、IBM等。
PaaS即平台即服务(Platform-as-a-Service),某些时候也被叫作中间件。所有的开发都可以在这一层进行,节省时间与资源。PaaS公司可以提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统等,可以节省硬件上的费用。
PaaS公司与IaaS公司有许多重叠,除了上面列出的那些之外,还有Google、Microsoft Azure、Force.com、,Heroku、Engine Yard等。
最后则是SaaS,软件即服务(Software-as-a-Service),也是我们目前普通用户接触最多的层面,在网络上任意一个远程服务器上的应用都是属于SaaS。比如现在阿里的钉钉、JIBUU以及苹果的iCloud都属于这一类。APP
SaaS服务帮助客户实现在各种各种设备上通过客户端进行界面访问,比如浏览器。
比较知名的SaaS公司有Salesforce、workday、Slack等。
数据库引擎:InnoDB, MyISAM, HEAP, ISAM, Memory
索引类型:唯一索引(unique index),主键索引(promary key),聚集索引(组合索引)
数据库性能优化的5种方案:建立索引、优化SQL语句,优化表结构,拆分表,分库。
优化法则归纳为5个层次:
1、 减少数据访问(减少磁盘访问)
2、 返回更少数据(减少网络传输或磁盘访问)
3、 减少交互次数(减少网络传输)
4、 减少服务器CPU开销(减少CPU及内存开销)
5、 利用更多资源(增加资源)
B+树:平衡多路搜索树。子树的个数最多可以与关键字一样多。非叶节点存储的是子树里最小的关键字。同时数据节点只存在于叶子节点中,且叶子节点间增加了横向的指针,这样顺序遍历所有数据将变得非常容易。
B+树适合作为数据库的基础结构,完全是因为计算机的内存-机械硬盘两层存储结构。内存可以完成快速的随机访问(随机访问即给出任意一个地址,要求返回这个地址存储的数据)但是容量较小。而硬盘的随机访问要经过机械动作(1磁头移动 2盘片转动),访问效率比内存低几个数量级,但是硬盘容量较大。典型的数据库容量大大超过可用内存大小,这就决定了在B+树中检索一条数据很可能要借助几次磁盘IO操作来完成。
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上。由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了
MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
HashMap是数组(默认长度16,负载因子0.75)+链表/红黑树(JDK1.8增加了红黑树部分)实现的。
HashMap是数组+链表的存储形式,默认的初始容量是16,默认的加载因子是0.75,当链表长度达到8时将会转化为红黑树来提高查找效率。
查看系统负载情况:uptime
10:19:04 up 257 days, 18:56, 12 users, load average: 2.10, 2.10,2.09
显示内容说明:
10:19:04 //系统当前时间
up 257 days, 18:56 //主机已运行时间,时间越大,说明你的机器越稳定。
12 user //用户连接数,是总连接数而不是用户数
load average // 系统平均负载,统计最近1,5,15分钟的系统平均负载
系统平均负载是指在特定时间间隔内运行队列中的平均进程数。
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。
如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
1可以被认为是最优的负载值。负载是会随着系统不同改变得。
buffer是即将要被写入磁盘的,cache是被从磁盘中读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提高系统性能。
Java Object默认的基本方法中没有copy(),含有如下方法:
getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait(), finalize()
子类重写父类方法时,方法的访问权限不能小于原访问权限,在接口中,方法的默认权限就是public,所以子类重写后只能是public.
类加载顺序:父类静态代码块、子类静态代码块、父类初始化块、父类构造方法、子类初始化块、子类构造方法。
一个java文件可以包含多个java类,但是只能包含一个public类,并且public类的类名必须与java文件名相同。
MVVM, Model-View-ViewModel的简写。即模型-视图-视图模型。【模型】指的是后端传递的数据。【视图】指的是所看到的页面。【视图模型】mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。
MVC和MVVM的区别并不是VM完全取代了C,ViewModel存在目的在于抽离Controller中展示的业务逻辑,而不是替代Controller,其它视图操作业务等还是应该放在Controller中实现。也就是说MVVM实现的是业务逻辑组件的重用。
当年为了解决浏览器兼容性问题,出现了很多类库,其中最典型的就是jquery。但是这类库没有实现对业务逻辑的分成,所以维护性和扩展性极差。综上两方面原因,才有了MVVM模式一类框架的出现。比如vue,通过数据的双向绑定,极大了提高了开发效率。
构造散列函数的方法:
直接定址法、数字分析法、平方取中法、折叠法、随机数法、除留余数法。
处理冲突:开放寻址法、链接法。双散列、再散列。
散列表的载荷因子定义为: Image= 填入表中的元素个数 / 散列表的长度
对于开放定址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。
为了提高数据的查询效率,需要在数据库中建立索引,则下列设计索引的原则描述正确的是:
在频繁进行排序或分组(即进行group by 或order by操作)的列上建立索引、
考虑列中值的分布,列的基数越大,索引的效果越好。
1、 表的某个字段值的离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时, cardinality (基数,集的势)的值就等于该表的行数。 MySQL 在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时, MySQL 自动创建主索引( primary index ),且索引名称为 Primary ;数据库用户创建唯一性索引时, MySQL 自动创建唯一性索引( unique index ),默认情况下,索引名为唯一性索引的字段名。
2、 占用存储空间少的字段(int, char)更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。
3、 存储空间固定的字段更适合选作索引的关键字。与 text 类型的字段相比, char 类型的字段较为适合选作索引关键字。
4、 Where 子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。group by, order by, join
5、 更新频繁的字段不适合创建索引,不会出现在 where 子句中的字段不应该创建索引。
6、 最左前缀原则。
7、 尽量使用前缀索引。
ARP:把IP地址转换为物理地址。RARP:把MAC地址转为IP地址。
进程可以由程序、数据和进程控制块(PCB)描述。
若进程A和进程B在临界段上互斥,那么当进程A处于该临界段时,它可能被进程B中断,但进程B不能进入临界区。
1、抖动的现象是什么?刚刚换入内存的页立即又要被换出内存,这种频繁的页面调度行为称为抖动。所以其实质就是:一个进程在换页上用的时间多于执行时间。
2、对于某一进程来说,偶然出现一次抖动的现象,那么主要原因是:页面置换算法不合理。
3、对于某一个PC来说,如果某一进程不断出现抖动的现象,那么其主要原因是:这个进程频繁访问的页面数目>系统为其分配的工作集大小。
花了很大一部分开销去换页,换页频繁不代表换页的时间远多于执行程序的时间。
虚拟存储管理中采用对换(swapping)策略后,用户进程可使用的存储空间似乎增加了。
MySQL的触发器只支持行级触发,不支持语句级触发。
触发程序与表相关,当对表执行Insert、Delete、Update语句时会激活触发程序。可以将触发程序设置为在执行语句之前或之后激活。create trigger或drop trigger
在MySQL中,使用new和old引用触发器中发生变化的记录内容。插入:New.col;删除:Old.col;更新:New.col或Old.col。
触发程序不能使用以显式或隐式方式开始或结束事务的语句,如Start transaction、commit、rollback。
触发器程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL(允许存储程序通过参数将数据返回触发程序)。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 非剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
会话1持有了表Lock1的X锁(排它锁),且事务没有结束,会话1就一直持有X锁不释放;而会话2执行select操作,请求在表Lock1上加S锁(共享锁),但S锁与X锁是不兼容的,所以会话2被阻塞等待。
避免死锁:
(1).按同一顺序访问对象。(注:避免出现循环)
(2).避免事务中的用户交互。(注:减少持有资源的时间,较少锁竞争)
(3).保持事务简短并处于一个批处理中。(注:同(2),减少持有资源的时间)
(4).使用较低的隔离级别。(注:使用较低的隔离级别(例如已提交读)比使用较高的隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)
(5).使用基于行版本控制的隔离级别;
(6).使用绑定连接。注:绑定会话有利于在同一台服务器上的多个会话之间协调操作。绑定会话允许一个或多个会话共享相同的事务和锁(但每个回话保留其自己的事务隔离级别),并可以使用同一数据,而不会有锁冲突。
MySQL有三种锁的级别:页级、表级、行级。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
CSMA/CD协议即带冲突检测的载波监听多路访问协议。
A,发送前空闲检测,只有信道空闲才发送数据
B,发送时当前信号占据信道,信道必定不为空闲,检测空闲没意义
C,发送过程中冲突检测,如果发生冲突,立即停止发送,随机避让。
D,冲突发送后,两个发送端都随机避让一段时间,避让的时间是随机的,优先级相等,没有哪个优先权高的说法。
先听后发,边听边发,冲突即停,延迟重发
分时操作系统具有以下特征: | 实时操作系统基本特征:
1.多路性 | 1.及时性
2.交互性 | 2.可靠性
3.独占性 |
4.及时性 |
多路性指,同时有多个用户使用一台计算机,宏观上看是多个人同时使用一个CPU,微观上是多个人在不同时刻轮流使用CPU。
交互性是指,用户根据系统响应结果进一步提出新请求(用户直接干预每一步)。
“独占”性是指,用户感觉不到计算机为其他人服务,就像整个系统为他所独占。
及时性指,系统对用户提出的请求及时响应。
关于静态变量
静态变量是在类加载的时候分配空间的,静态变量和对象没有关系 是在JVM第一次读到一个类的时候加载信息的过程中分配空间的 加载过程为
1 .加载父类(如果父类已经加载过,则不在加载)。
2.初始化静态属性 。
3 .按顺序的初始化静态代码块,初始化的前提就是分配空间 。
而且静态变量在以后的创建对象的时候不在初始化 所以一般用静态来保存共享信息。
静态变量存在于方法区中,成员变量存在于堆内存中,成员变量所属于对象。
JAVA成员变量和静态变量的区别:
成员变量随着对象创建而存在,随着对象被回收而消失;
静态变量随着类的加载而存在。
静态变量是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。
SQL绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实.
绑定变量是指在SQL语句中使用变量,改变变量的值来改变SQL语句的执行结果。
使用绑定变量,可以减少SQL语句的解析,能减少数据库引擎消耗在SQL语句解析上的资源。
绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难
绑定变量是为了减少解析的,比如你有个语句这样
select aaa,bbb from ccc where ddd=eee;
如果经常通过改变eee这个谓词赋值来查询,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析。
什么时候不应该/不必要使用绑定变量
a,如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析消耗微乎其微。
b变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量的值真是,尤其是在表存在数据倾斜的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。
进程调度
只要可以引起进程状态发生变化,就会导致进程调度。
A,进程执行完毕,系统需要把CPU时间分配给其他进程,引起进程调度
B,进入IO请求队列,进程需要暂停,等待IO访问结束才能继续执行,是进程调度
C,系统没有能力判断进程是否进入死循环,不会引起进程调度
D,进程调用阻塞原语,则会切换至等待状态,需要进程调度
引起进程调度的原因
正在执行的进程执行完毕或因发生某事件而不能再继续执行;
执行中的进程因提出I/O请求而暂停执行;
在进程通信或同步过程中执行了某种原语操作如P操作、阻塞、挂起原语等;
在可剥夺式调度中,有比当前进程优先权更高的进程进入就绪队列;
在时间片轮转法中,时间片完;
△通常系统是按先来先服务或优先权形式来组织调度队列。
进程间通信方式:
管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
Linux下的五种I/O模型(网络IO模型)
1)阻塞I/O(blocking I/O)
2)非阻塞I/O (nonblocking I/O)
3) I/O复用(select 和poll) (I/O multiplexing)
4)信号驱动I/O (signal driven I/O (SIGIO))
5)异步I/O (asynchronous I/O (the POSIX aio_functions))
前四种都是同步,只有最后一种才是异步IO。
操作系统是系统软件,不是应用软件。
冯·诺依曼计算机系统结构的基本思想是存储程序。
二分插入排序法,是简单插入排序的一种优化。
其思想是:每次取出待排序的值,通过与已经排序后的数组中的中间值进行比较,若大于中间值,则取后半段进行比较,若小于中间值则取前半段进行比较。
按照直接插入排序的思想去理解,这个题,比较次数应该就和是否有序有关系
而二分查找排序的话,比较次数是不受影响的。
数据库事务的ACID特性
原子性(Atomicity):事务是应用中最小的执行单位。就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分的最小逻辑执行体。
一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变成另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而该未完成的事务对数据库所作的修改已被写入数据库,此时数据库就处于一种不正确的状态。一致性是通过原子性来保证的。
隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。
持久性(Durability):事务一旦提交,对数据所作的任何改变都要记录到永久存储器中,通常就是保存到物理数据库。
cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再次请求该网站时,浏览器就会把请求地址和cookie一同给服务器。服务器检查该cookie,从而判断用户的状态。服务器还可以根据需要修改cookie的内容。 session是另一种记录客户状态的机制。不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只需要从该session中查找该客户的状态就可以了。 如果说cookie机制是通过检查客户身上的“通信证”,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份。
使用Servlet处理HTTP请求
1.当服务器接收到一个HTTP请求,判断请求的是静态网页还是动态网页
2.如果是静态网页则由服务器查询资源文件并响应给客户端,如果是动态,交由web容器处理
3.web容器找到对应的Servlet,调用HttpServlet的service(),再调用一个实例对象的service(),再具体调用doXXX方法
4.如果能处理,就将响应XMLHttpResponse对象的属性处理,不能处理就将请求转发(需要得到一个具体路径的RequestDispatcher对象)
首先查看端口是否打开 netstat -an|grep 3306
栈里存放的是值类型(int、float等)的值和引用类型(String、你自己创建的类对象等)在堆中的地址;堆中存放引用类型的值,如果堆中某个值的地址在栈中没有被指向,他就会被GC回收。
方法区存储所有的类和静态变量。
通信网的基本结构形式有5种:网型、星型、复合型、环形、总线型。
CRUD是指在做计算处理时的增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。
中断处理和子程序调用都需要压栈以保护现场,中断处理一定会保存而子程序调用不需要保存其内容的是程序状态字寄存器。
在中断处理中,最重要的两个寄存器是PC和PSWR。
⦁ 系统调用:应用程序主动向操作系统发出的服务请求。(异步或同步)
⦁ 异常:非法指令或者其他原因导致当前指令执行失败后的处理请求。(如内存出错,除0)(同步)
⦁ 中断:来自硬件设备的处理请求。(异步)
处理机制:
⦁ 中断:持续,对用户应用程序是透明的
⦁ 异常:杀死或重新执行意想不到的应用程序指令
⦁ 系统调用:等待和持续。
中断的优点: 1.提高CPU的效率; 2.实时处理; 3.故障处理; 4.实现时分操作。
输出1
无符号号整数和有符号整数相加,有符号整数转化为无符号整数,signed int b 变成了一个很大的数,所以a + b是>0的。
常见的批处理作业调度算法
1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多。
2.短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短。而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值。
3.最高响应比优先算法(HRN):FCFS可能造成短作业用户不满,SPF可能使得长作业用户不满,于是提出HRN,选择响应比最高的作业运行。响应比=1+作业等待时间/作业处理时间。
4.基于优先数调度算法(HPF):每一个作业规定一个表示该作业优先级别的整数,当需要将新的作业由输入井调入内存处理时,优先选择优先数最高的作业。
5.均衡调度算法,即多级队列调度算法**
基本概念:
作业周转时间(Ti)=完成时间(Tei)-提交时间(Tsi)
作业平均周转时间(T)=周转时间/作业个数
作业带权周转时间(Wi)=周转时间/运行时间
响应比=(等待时间+运行时间)/运行时间
进程调度算法
1.先进先出算法(FIFO):按照进程进入就绪队列的先后次序来选择。即每当进入进程调度,总是把就绪队列的队首进程投入运行。
2.时间片轮转算法(RR):分时系统的一种调度算法。轮转的基本思想是,将CPU的处理时间划分成一个个的时间片,就绪队列中的进程轮流运行一个时间片。当时间片结束时,就强迫进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
3.最高优先级算法(HPF):进程调度每次将处理机分配给具有最高优先级的就绪进程。最高优先级算法可与不同的CPU方式结合形成可抢占式最高优先级算法和不可抢占式最高优先级算法。
4.多级队列反馈法:几种调度算法的结合形式多级队列方式。
空闲分区分配算法
1.首先适应算法:当接到内存申请时,查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。此算法简单,可以快速做出分配决定。
2.最佳适应算法:当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,将其进行分割并分配。此算法最节约空间,因为它尽量不分割到大的空闲区,其缺点是可能会形成很多很小的空闲分区,称为“碎片”。
3.最坏适应算法:当接到内存申请时,查找分区说明表,找到能满足申请要求的最大的空闲区。该算法的优点是避免形成碎片,而缺点是分割了大的空闲区后,在遇到较大的程序申请内存时,无法满足的可能性较大。
虚拟页式存储管理中的页面置换算法
1.理想页面置换算法(OPT):这是一种理想的算法,在实际中不可能实现。该算法的思想是:发生缺页时,选择以后永不使用或在最长时间内不再被访问的内存页面予以淘汰。
2.先进先出页面置换算法(FIFO):选择最先进入内存的页面予以淘汰。
3.最近最久未使用算法(LRU):选择在最近一段时间内最久没有使用过的页,把它淘汰。
4.最少使用算法(LFU):选择到当前时间为止被访问次数最少的页转换。
磁盘调度
1.先来先服务(FCFS)
2.最短寻道时间优先(SSTF):让离当前磁道最近的请求访问者启动磁盘驱动器,即是让查找时间最短的那个作业先执行,而不考虑请求访问者到来的先后次序,这样就克服了先来先服务调度算法中磁臂移动过大的问题
3.扫描算法(SCAN)或电梯调度算法:总是从磁臂当前位置开始,沿磁臂的移动方向去选择离当前磁臂最近的那个柱面的访问者。如果沿磁臂的方向无请求访问时,就改变磁臂的移动方向。在这种调度方法下磁臂的移动类似于电梯的调度,所以它也称为电梯调度算法。
4.循环扫描算法(CSCAN):循环扫描调度算法是在扫描算法的基础上改进的。磁臂改为单项移动,由外向里。当前位置开始沿磁臂的移动方向去选择离当前磁臂最近的哪个柱面的访问者。如果沿磁臂的方向无请求访问时,再回到最外,访问柱面号最小的作业请求。
速度:SRAM > DRAM > ROM,寄存器>Cache>内存
单例的两种实现方式:
public class Singleton{
private static Singleton instance = null;
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
Spring的Ioc(控制反转和依赖注入)
控制反转:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。
依赖注入:组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注入到组件之中。
轻量级,代码侵入性低。IOC: 对象全部交给容器管理,不用关心其初始化、使用、销毁过程。AOP,面向切面编程,不影响主程序流。 这是只是最基本的。 数据源管理、安全权限管理、springMVC 等等,到项目中用到才会发现有多好。
.class文件的结构:(按顺序)
1.魔数(Magic):4字节,紧跟2个大小版本号;
2.常量池:池的个数+池中表项(池的个数-1项);
3.类的访问修饰符,指向类自身的引用this_class,指向父类的引用super_class,接口数量,接口引用;
4.字段数量+字段描述,方法数量+方法描述;
5.类的属性数量+属性信息。
常用的并发编程组件:ReentrantLock,ReadWriteLock,Semaphore,AtomicInteger,CountDownLatch,CyclicBarrier,BlockingQueue,PriorityBlockingQueue,DelayQueue,Exchanger。
volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。禁止指令重排序。
redis是一个开源的基于内存的KV型数据库。通常用来作为数据库,缓存,或者是消息中间件进行使用,它支持的数据类型有string,hash,list,set,zset。
redis可以提供在少数(100以内)连接时12W的QPS,在多数链接(6W)时5W的QPS高性能。同时redis本身在集群模式下可以保证数据的一致性,以及本身对事务的支持和对发布订阅模式的支持可以应用于更多的业务场景。
数据库范式:
1NF:符合1NF的关系中的每个属性都不可再分;
2NF:消除了非主属性对于码(主键)的部分函数依赖。所有非主属性都要和该数据表的主键有完全依赖关系。
3NF:消除了非主属性对于码的传递函数依赖。单价*数量=总价
BCNF:消除了“关键字段决定关键字段”的情况。消除了主属性对于码的传递函数依赖。
线程共包括以下5种状态。
1.新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
2.就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
3.运行状态(Running): 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4.阻塞状态(Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
(02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
(03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead): 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
当一个表的索引无法放入到内存中而需要把部分索引装载到磁盘中时,会导致性能下降,与实际记录的条数无关。
2018-09-17
海康1面:
自我介绍
项目架构
redis和mysql同步,redis数据失效怎么办,数据更新怎么办。
·应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql,此种情况存在的问题主要是如何保证mysql与redis的数据同步,二者数据同步的关键在于mysql数据库中主键。
·在redis启动时去mysql读取所有表键值存入redis中;往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。(对强一致要求比较高的,应采用实时同步方案,即查询缓存查询不到再从DB查询,保存到缓存;更新缓存时,先更新数据库,再将缓存的设置过期(建议不要去更新缓存内容,直接设置缓存过期)。)缓存只做失效,不做更新。
·对于并发程度较高的,可采用异步队列的方式同步,可采用kafka等消息中间件处理消息生产和消费。
redis数据失效时,从mysql查询数据,然后把查到的新数据保存到缓存。
讲一下堆排序(时间复杂度O(nlgn)):初始化堆;维持最大堆的性质(父节点比任何子节点都大),从最后一个非叶节点开始往前遍历,通过交换使每一个子树都满足最大堆的性质。然后,把根节点(最大节点)和最后一个节点进行交换,并把它移除;循环第二步。
讲一下AVL树,讲一下B,B plus(打不出来加号╯^╰) ,AVL,RBTree区别于联系。
AVL树是最早的自平衡二叉查找树,其中任一节点的两棵子树的最大高度差为1.查找、插入和删除在平均和最坏情况下的时间复杂度都是O(lgn)。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。
红黑树相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。
红黑树的5个性质:1.节点是红色或黑色。2.根是黑色。3.所有叶子都是黑色(叶子是NIL节点)。
4.每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
B树中每一个内部节点会包含一定数量的键,键将节点的子树分开。例如,如果一个内部节点有3个子节点(子树),那么它就必须有两个键: a1 和 a2 。左边子树的所有值都必须小于 a1 ,中间子树的所有值都必须在 a1 和a2 之间,右边子树的所有值都必须大于 a2 。
B+树通常用于数据库和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。与B树不同的是,叶子节点之间多了横向指针。
死锁,什么情况会发生死锁,出现死锁有什么解决方法。
死锁就是若干进程之间形成了一种头尾相接的循环等待资源关系。产生死锁有四个必要条件:互斥条件、请求与保持条件、非剥夺条件、循环等待条件。
出现死锁时,通过破坏四个必要条件之一来解决,比如杀掉等待进程(破坏循环等待条件)、设置锁请求超时(破坏请求与保持条件)。
避免死锁:6种方案。
四种事务处理隔离级别(TIL),从低到高分别为:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。读未提交、读已提交、可重复读、串行化。
spring 声明式事务如何实现。(JavaEE轻量级。。。P342)
@Transaction注解可以用在方法或类上面,当SpringIOC容器初始化时,Spring会读入这个注解或XML配置的事务信息,并保存到一个事务定义类里面;运行时,Spring会拦截注解标注的某一个方法或某个类的所有方法。
Spring通过事务管理器创建事务,同时根据配置设置事务的属性(隔离级别、超时时间等);然后执行业务逻辑代码,Spring通过反射的方式调度开发者的业务代码,反射的结果可能是正常返回或者产生异常返回,当发生异常并且满足事务回滚条件时,Spring就将数据库事务回滚,否则就提交;最后释放事务资源。
spring 管理的controller默认是单例的,怎么实现的?注解@Scope(value="prototype"或"singleton")
单例的好处:性能。高并发下能极大的节省资源,提高服务抗压能力。
Spring框架对单例的支持是采用单例注册表的方式进行实现的。配置文件中bean的属性scope="singleton"或singleton=true。
controller是怎么处理多线程不安全的?
Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。因此,我们在使用contrller时,应避免在controller中定义实例变量。
如果controller中定义了实例变量,有两种解决方案:1.把controller设为多例模式;2.使用ThreadLocal变量。
linux如何查看一个进程的状态。
ps -aux显示所有进程,其中有stat字段表示进程状态(运行、中断、不可中断、僵死、停止)。
如果我的Java进程挂了,linux下怎么处理?
有什么想问的?