一、JVM模型图:
MyBatis中默认定义了两级缓存,分别是一级缓存和二级缓存。
(1)默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
(2)二级缓存需要手动开启和配置,二级缓存是基于namespace级别的缓存。
(3)为了提高扩展性,MyBatis定义了缓存接口Cache,我们可以通过实现Cache接口来自定义二级缓存。
一级缓存介绍
- 一级缓存(local cache),即本地缓存,作用域默认为SqlSession。当Session flush 或close 后,该Session中所有Cache将被清空。
- 本地缓存不能被关闭,但可以调用clearCache()来清空本地缓存,或者改变缓存的作用域。
- mybatis3.1之后,可以配置本地缓存的作用域,在mybatis.xml中配置。
一级缓存失效的四种情况
- 不同的SqlSession对应不同的一级缓存。
- 同一个SqlSession但是查询条件不同。
- 同一个SqlSession的两次查询期间执行了增删改操作。
- 同一个SqlSession的两次查询期间手动清空了缓存。
二级缓存介绍
- 二级缓存(second level cache),是全局作用域缓存。
- 二级缓存默认不开启,需要手动配置。
- MyBatis提供二级缓存的接口以及实现,实现二级缓存要求被查询的JavaBean实现Serializable接口。
- 二级缓存在SqlSession关闭或提交之后才会生效。
二级缓存使用步骤
- 在mybatis全局配置文件中开启二级缓存 < setting name=“cacheEnabled” value=“true”/>。
- 在需要使用二级缓存的mapper映射文件中使用< cache />标签配置缓存。
- 被查询的JavaBean需要实现Serializable接口。
二、集合
1:数组存储
缺点:
- 长度开始必须指定,而且一旦指定,无法修改;
- 保存的必须为同一类型的元素;
- 使用数组进行增删操作比较麻烦;
优点:读取可以使用下标直接进行。
2:集合
好处:
- 可以动态保存多个对象,使用方便;
- 提供了一系列方便的操作对象的方法,如add、remove、set、get等;
- 使用集合增删较方便。
分类:单列集合(Collection接口) 双列集合(Map接口)
3:Collection接口实现类的特点
- Collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,可以是有序的(List), 有些也是无序的(Set)
- Collection接口没有直接的实现子类,是通过他的子接口Set和List来实现的
4:迭代器
Iterator对象称为迭代器,主要用于遍历Collection集合中的元素;所有实现了Collection接口的集合类都有一个iterator()方法,用于返回一个实现了Iterator接口的对象,即可以返回一个迭代;Iterator仅用于遍历集合,Iterator本身不存放对象。
5:List接口的特点
- List集合类中元素有序(添加顺序和取出顺序一致),且可重复
- List集合中的每个元素都有其对应的顺序索引,即支持索引
- List容器中的元素都对应一个整数型的序号记载其在容器中的位置,额可以根据序号存取容器中的元素
- JDK API中List接口的实现类非常多,常用的有ArrayList、LinkedList、Vector
6:ArrayList
特点:
- 允许存储所有元素,包括null,ArrayList可以加入一个或者多个null
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全的(源码中没有synchronized关键字,执行效率高)。
底层操作机制源码分析:
- 创建ArrayList对象的时候,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如需再次扩容,
则扩容elementData1.5倍 - 如果使用的是指定大小的构造器,则初始化elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
构造分析:
7:Vector
8:LinkedList
- LinkedList底层实现了双向链表和双端队列的特点
- 可以添加任意元素(可以重复), 包括null
- 线程不安全,没有实现同步
9:HashMap
特点:
- HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
- HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
- HashMap 是无序的,即不会记录插入的顺序。
取元素:
设置元素:
10:TreeMap
11:HashTable
三、Synchronized和Lock
1、区别
- a. lock是一个接口,而synchronized是java的一个关键字。
- b. synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生
2、 synchronized的实现
a:
Java中每一个对象都可以作为锁,synchronized实现同步的基础:
普通同步方法,锁是当前实例对象
静态同步方法,锁是当前类的class对象
同步方法块,锁是括号里面的对象
同步代码块是使用monitorenter和monitorexit指令实现的,同步方法(在这看不出来需要看JVM底层实现)依靠的是方法修饰符上的ACC_SYNCHRONIZED实现
b:
同步代码块:monitorenter指令是在编译后插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置,JVM需要保证每一个monitorenter都有一个monitorexit与之相对应。任何对象都有一个monitor与之相关联,当且一个monitor被持有之后,他将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor所有权,即尝试获取对象的锁;
c:
同步方法:synchronized方法则会被翻译成普通的方法调用和返回指令如:invokevirtual、areturn指令,在VM字节码层面并没有任何特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的access_flags字段中的synchronized标志位置1,表示该方法是同步方法并使用调用该方法的对象或该方法所属的Class在JVM的内部对象表示Klass做为锁对象
d:区别
用法区别:
- synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
- lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
性能区别:
synchronized是托管给JVM执行的,
而lock是java写的控制锁的代码。
在Java1.5中,synchronize是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。
但是到了Java1.6,发生了变化。synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上synchronize的性能并不比Lock差。官方也表示,他们也更支持synchronize,在未来的版本中还有优化余地。
两种机制区别:
synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低。
而Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作(Compare and Swap)。我们可以进一步研究ReentrantLock的源代码,会发现其中比较重要的获得锁的一个方法是compareAndSetState。这里其实就是调用的CPU提供的特殊指令。
现代的CPU提供了指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。这个算法称作非阻塞算法,意思是一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。
用途区别:
synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。
1.某个线程在等待一个锁的控制权的这段时间需要中断
2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程
3.具有公平锁功能,每个到来的线程都将排队等候
四、线程之间的通信
线程通信涉及到的三个方法:
- (1)wait():一旦执行此方法当前线程进入阻塞状态,并释放同步监视器
- (2)notify():一旦执行此方法就会唤醒被wait的另一个线程。如果存在多个被wait的线程,唤醒优先级高的线程。
- (3)notifyAll():一旦执行此方法就会唤醒所有被wait的线程
注意:
-
(1)wait()、notify()、notifyAll()三个方法必须在同步代码块或同步方法里面使用
-
(2)wait()、notify()、notifyAll()三个方法的调用者必须是同步代码块或同步方法里面的同步监视器
如下面的,obj对象作为同步监视器的话其他地方调用这个三个方法也需要使用obj对象 -
(3)因为任何一个对于多线程来说是唯一的对象都可以充当同步监视器,所以上面三个方法是定义在Object对象里面的
sleep()和wait()方法的异同
- (1)两个方法声明的位置不同,sleep()方法声明在Thread类里面,wait()方法声明在Object类里面
- (2)调用要求不同,sleep()方法可以在任何需要的场景下面使用,wait()方法必须在同步代码块或同步方法里面使用
- (3)关于释放同步监视器的问题:如果sleep()和wait()方法都在步代码块或同步方法里面使用时, sleep()方法不会释放同步监视器,而wait()方法会释放同步监视器
五、线程池
线程池基础
a、什么是线程池
用一句话来概述就是:线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后再需要执行新的任务时重用这些线程而不是新建线程。
b、为什么使用线程池
使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有线程进行统一的管理和控制,从而提高系统的运行效率,降低系统的运行压力。
c、线程池有那些优势
- 降低资源消耗:线程和任务分离,提高线程重用性 控制线程并发数量,降低服务器压力,统一管理所有线程
- 提高系统响应速度。假如创建线程用的时间为T1,执行任务的时间为T2,销毁线程的时间为T3,那么使用线程池就免去了T1和T3的时间。
d、线程池使用
Java内置线程池:ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize
:线程池核心线程数量
maximumPoolSize
:线程池最大线程数量
keepAliverTime
:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
unit
:存活时间的单位
workQueue
:存放任务的队列
handler
:超出线程范围和队列容量的任务的处理程序
e、创建顺序
核心线程 -> 队列 -> 最大线程 -> 拒绝策略
f、workQueue
ArrayBlockingQueue
基于数组的有界阻塞队列
LinkedBlockingQuene
基于链表的无界阻塞队列
SynchronousQuene
一个不缓存任务的阻塞队列
PriorityBlockingQueue
具有优先级的无界阻塞队列
g、
通过Executor工厂类获取线程池有三种方式,这三种方式都是通过Executors类中的静态方法来获取的:
- 通过newCachedThreadPool获取线程池对象 特点是:创建一个默认的线程池对象,里面的线程可重用,且在第一次使用时才创建
- 通过newFixedThreadPool获取线程池对象 特点是:可指定创建线程数,并且可以重复用
- 通过newSingleThreadExecutor获取线程池对象 特点是:只会创建一个线程
第一种:newCachedThreadPool:线程的数据是不做限制的,每次有任务来的时候都会以任务优先,性能最大化(也就是服务器压力比较大)
第二种:newFixedThreadPool:可以让压力不那么大,并且可以规定线程的数量,当线程的数量达到指定数量的时候,这个时候就不会再有新的线程了
第三种:newSingleThreadExecutor:绝对的安全,不考虑性能,因为是单线程,永远只有一个线程来执行任务
六、类
1:对象
对象是类的一个实例,有状态和行为。例如:一条狗是一个对象,它的状态有;颜色、名字、品种,行为有:摇尾巴,叫,吃等;
类:类是一个模板,它描述一类对象的行为和状态;
类可以看成是创建Java对象的模板;
局部变量: 在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
**成员变量:**成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
**类变量:**类变量也声明在类中,方法体之外,但必须声明为 static 类型。
2:接口
a、什么是接口
接口在JAVA中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
b、接口与类相似点
一个接口可以有多个方法。
接口文件保存在 .java 结尾的文件中,文件名使用接口名。
接口的字节码文件保存在 .class 结尾的文件中。
接口相应的字节码文件必须在与包名称相匹配的目录结构中。
c、接口与类的区别
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
接口不能包含成员变量,除了 static 和 final 变量
接口不是被类继承了,而是要被类实现。
接口支持多继承。
d、接口特性
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
e、抽象类和接口的区别
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
3:抽象类
所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
4:重载、继承
a、重载(OverLoad)
指一个类中可以有多个方法具有相同的名字,但是这些方法的参数不同(参数的类型和个数不同);返回值不行。
b、继承
继承的特点
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,这是 Java 继承区别于 C++ 继承的一个特性。
继承的缺点
提高了类之间的耦合性(耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
c、extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
d、implements关键字
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
e、super关键字
我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
f、this关键字
指向自己的引用。
g、final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final 含义为 “最终的”。
使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写
注: final 定义的类,其中的属性、方法不是 final 的。
5:类的加载
a、定义
当程序主动使用某个类时,如果该类还未被加载到中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化
加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。
b、加载的来源
从本地文件系统加载class文件,这是前面绝大部分示例程序的类加载方式。
从JAR包加载class文件,
通过网络加载class文件。
把一个Java源文件动态编译,并执行加载。
c、类加载器
一旦一个类被加载如JVM中,同一个类就不会被再次载入了。正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。
d、三种类加载器
aa、根类加载器(bootstrap class loader)
它用来加载 Java 的核心类,是用原生代码来实现的,并不继承自 java.lang.ClassLoader(负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
bb、扩展类加载器(extensions class loader)
它负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现,父类加载器底层由其他语言实现。
cc、系统类加载器(system class loader)
被称为系统(也称为应用)类加载器,它负责在JVM启动时加载来自Java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH换将变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()来获取系统类加载器。如果没有特别指定,则用户自定义的类加载器都以此类加载器作为父加载器。由Java语言实现,父类加载器为ExtClassLoader。
dd、用户类加载器
ee、加载器启动顺序
根类加载器----->拓展类加载器---->系统类加载器---->用户类加载器
e、类加载机制
aa、全盘负责:
所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。
bb、 双亲委派:
所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载。
cc、 缓存机制:
缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。这就是为很么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因。
dd、双亲委派机制的优势
采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。
七、网络
1:计算网络模型
2:IP协议
a、定义
IP(Internet Protocol)网际协议,是TCP/IP协议的核心部分,虽然IPV4终将会被IPV6替代,但是目前IPV4仍然是IP协议的主流版本
互联网这个共享网络中精确定位到一台主机,那么就一定需要该主机的IP地址。主机是拥有IP地址,但是不能进行路由控制(Routing,意思是中转、分组数据包),路由器(Router)这种设备既有IP地址,又可以进行路由控制;我们可以将接入互联网中的主机和路由器都叫做节点
b、IP地址组成
IP地址由网络标识(网络地址)和主机标识(主机地址)两部分组成
网络号:保证互相连接的两个网段具有不同的标识。
主机号:保证在同一个网段中,两台主机具有不同的标识。
A类地址:0.0.0.0 ~ 127.255.255.255
B类地址:128.0.0.0 ~ 191.255.255.255
C类地址:192.0.0.0 ~ 223.255.255.255
D类地址:224.0.0.0 ~ 239.255.255.255
E类地址:240.0.0.0 ~ 247.255.255.255
很多子网的申请者都会去申请B类网络地址,因为A类根本用不完,而C类不够用。导致B类的网络地址很快就被分配完了。而申请了A类的网络又会浪费大量的IP地址,在这种情况下,人们提出了新的划分方案:CIDR(Classless Interdomain Routing无类型域间选路)
c、子网掩码
引入子网掩码来区分网络号和主机号
子网掩码也是一个32位的正整数,但结尾通常是一串0
将IP地址与子网掩码进行&操作,所得结果就是网络号
网络号和主机号的划分就与这个IP地址是A类、B类还是C类无关了
内网IP和公网IP
3:TCP协议
a、三次握手
保证双向互通(服务器和客户端)
安全应答机制
b、四次挥手
四次挥手为了安全; 断开可以单向断开,即若要彻底断开即需要两方确认四次挥手。
c、滑动窗口协议
d、状态转化图
4:模型
a、B/S模型
客户端通过浏览器,浏览web服务器上的网页,这样的模型叫bs模型,b指客户端browser,s指服务端server。在客户端和浏览器端之间走的报文是http协议(即超文本传输协议)
b、C/S模型
客户端(client)发报文,服务器(server)收报文,服务器收到报文之后处理。这与bs模式没有很大区别,只不过是c与s间可以自定义数据传送报文。cs模式一般走的协议是tcp协议
c、P2P模型
各计算机没有固定的客户和服务器划分。相反,任意一一对计算机一称为对等方(Peer), 直接相互通信。
P2P 模型从本质上来看仍然使用客户/服务器方式,每个结点既作为客户访问其他结点的资源,也作为服务器提供资源给其他结点访问。
d、注意点
网络服务器模型 P2P模型(PPlive、Bittorrent 和电驴)、CS模型(Web、文件传输FTP、远程登录、电子邮件) 和 系统的架构模型区分 CS模型和BS模型
5、HTTP
a、定义
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应
b、流程
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。
c、通信请求方式
OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
HEAD 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
GET向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
PUT向指定资源位置上传其最新内容
DELETE 请求服务器删除Request-URL所标识的资源
TRACE回显服务器收到的请求,主要用于测试或诊断
cookie seesion
d、HTTP的状态码
404/500/403/200等
八、操作系统
1:线程
2:进程
3、任务调度算法
a、先进先出进程调度算法(FIFO) (先来先服务FCFS)
按照进程就绪的先后次序来调度进程。
优点: 实现简单
缺点: 没考虑进程的优先级
b、短作业(进程)优先调度算法(SJF SPF)
选择就绪队列中估计运行时间最短的进程投入运行。
优点: 平均周转时间,带权平均周转时间都改善
缺点: 对长作业非常不利,不能保证紧迫性进程得到及时处理,估计运行时间不准确
C、时间片轮转调度算法(RR—Round Robin)
把CPU划分成若干时间片,并且按顺序赋给就绪队列中的每一个进程,进程轮流占有CPU,当时间片用完时,即使进程未执行完毕,系统也剥夺该进程的CPU,将该进程排在就绪队列末尾。同时系统选择另一个进程运行
d、优先权调度算法(HPF—Highest Priority First)
优先选择就绪队列中优先权最高的进程投入运行。
非抢占式优先权算法: 仅在事件发生放弃处理机时
抢占式优先权算法: 可将正在运行的运行权剥夺
高响应比优先调度算法:
高响应比优先调度算法的基本思想是把CPU分配给就绪队列中响应比 最高的进程。
e、推荐
短作业优先调度算法 + 动态优先权机制
既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。
计算公式:响应比 =(等待时间+要求服务时间)/ 要求服务时间,即RR=(w+s)/s=1+w/s,因此响应比一定是大于1的。
优点: 短作业与先后次序的兼顾,且不会使长作业长期得不到服务
缺点: 响应比计算系统开销,增加系统开销
4、内存
虚拟内存、物理内存
物理内存地址(不能重复)、逻辑内存地址
5、32位操作系统和64操作系统的区分
内存管理的二进制的位数,即管理内存的多少。