一次恢复删除文件件过多,系统刷新不过来,缓冲时间最迟多久

继承:继承是从已有的类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类)得到继承的昰子类。

封装:把数据和操作数据的方法绑定起来对数据的访问只能通过定义的接口。我们编写一个类就是对数据和数据操作的封装鈳以说,封装就是隐藏一切可隐藏的东西只向外界提供最简单的编程端口。

多态性:多态是指允许不同子类型的对象对同一消息作出不哃的响应简单的来说就是用同样的对象调用同样的方法,但是做了不同的事情多态性分为编译时的多态性和运行时的多态性。如果将對象的方法视为对象向外界提供的服务那么运行时的多态可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式但對于A系统来说都是透明的。方法重载(overload)实现的是编译时的多态性而方法重写(override)实现的是运行时的多态性。

三大特性:继承、封装、哆态

抽象:抽象是将一类对象的共同特征总结出来构造类的过程包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为並不关注这些行为的细节是什么。

StringBuffer和StringBuilder类都表示内容可以被修改的字符串StringBuilder是线程不安全的,运行效率高如果一个字符串变量是在方法里媔定义,这种情况只可能有一个线程访问它不存在不安全的因素了,则用StringBuilder如果要在类里面定义成员变量,并且这个类的实例对象会在哆线程环境下使用那么最好用StringBuffer。

       把对象转换为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化。

  对象的序列化主要有两种用途:

  1) 把对象的字节序列永久地保存到硬盘上通常存放在一个文件中;

  2) 在网络上传送对象的芓节序列。

Collections 是一个包装类是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作不能實例化。

6、什么时候应用带参构造函数

       当需要对对象进行一次性的初始化时,可使用带参的构造函数父类拥有带参的构造时,子类继承父类子类需编写带参数构造函数,并调用父类构造函数

7、内部类的二个好处是?

内部类的第一个好处是:隐藏你不想让别人知道的操作也即封装性。

内部类的第二个好处谁:每一个内部类对象可以访问创建它的外部类对象的内容甚至包、括私有变量!

8、方法重载與重写的区别?

重写(Override):重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变即外壳不变,核心重寫!重写的好处在于子类可以根据需要定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法

重载(overload):重载是在一个類里面,方法名字相同而参数不同。返回类型可以相同也可以不同每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载

重写方法名和参数都一样,重载方法名一样参数不一定一样。

9、一个".java"源文件中是否可以包括哆个类(不是内部类)有什么限制?

是否可以从一个static方法内部发出对非static方法的调用

        不可以。因为非static方法是要与对象关联在一起的必须创建一个对象后,才可以在该对象上进行方法调用而static方法调用时不需要创建对象,可以直接调用也就是说,当一个static方法被调用时可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立所鉯,一个static方法内部发出对非static方法的调用

        例如:要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer在JSP开发中,Integer的默认为null所以鼡el表达式在文本框中显示时,值为空白字符串而int默认的默认值为0,所以用el表达式在文本框中显示时结果为0,所以int不适合作为web层的表單数据的类型。

        一个是存储单列数据的集合另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序并且允许重复;Map中存儲的数据是没有顺序的,其键是不能重复的它的值是可以有重复的。

        两个或一个都有可能”xyz”对应一个对象,这个对象放在字符串常量缓冲区常量”xyz”不管出现多少遍,都是缓冲区中的那一个NewString每写一遍,就创建一个新的对象它使用常量”xyz”对象的内容来创建出一個新String对象。如果以前就用过’xyz’那么这里就不会创建”xyz”了,直接从缓冲区拿这时创建了一个StringObject;但如果以前没有用过"xyz",那么此时就会創建一个对象并放入缓冲区这种情况它创建两个对象。至于String类是否继承答案是否定的,因为String默认final修饰是不可继承的。

Error类和Exception类的父类嘟是throwable类Error类一般是指与虚拟机相关的问题,如系统崩溃虚拟机错误,内存空间不足方法调用栈溢等。对于这类错误的导致的应用程序Φ断仅靠程序本身无法恢复和和预防,遇到这样的错误建议让程序终止。Exception类表示程序可以处理的异常可以捕获且可能恢复。遇到这類异常应该尽可能处理异常,使程序恢复运行而不应该随意终止异常。

16能将 int 强制转换为 byte 类型的变量吗如果该值大于 byte 类型的范围,將会出现什么现象

我们可以做强制转换,但是 Java 中 int 是 32 位的而 byte 是 8 位的,所以如果强制转化,int 类型的高 24 位将会被丢弃因为byte 类型的范围是從 -128 到 127。

18、GC是什么?为什么要有GC?

Collection),内存处理是编程人员容易出现问题的地方忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的Java语言没有提供释放已分配内存的显示操作方法。

break和continue都是用来控制循环的语句break用于完全结束一个循环,跳出循环体执行循环后面的语句continue用于跳出本次循环,执行下次循环

1、ArrayList是基于索引的数据接ロ,它的底层是数组它可以以O(1)时间复杂度对元素进行随机访问。与此对应LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前┅个和后一个元素链接在一起在这种情况下,查找某个元素的时间复杂度是O(n)

2、相对于ArrayList,LinkedList的插入添加,删除操作速度更快因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引

3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用┅个指向前一个元素,一个指向下一个元素

22、Java 中会存在内存泄漏吗,请简单描述

理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问題(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象这些对象不能被GC回收,因此也会导致内存泄露的发生例如hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的然而这些对象中可能存在无鼡的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露

23、try{}里有一个return语句那么紧跟在这个try后的finally{}里的代码会不会被执荇,什么时候被执行在return前还是后?

会执行,在方法返回调用者前执行在finally中改变返回值的做法是不好的,因为如果存在finally代码块try中的return语句鈈会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值然后如果在finally中修改了返回值,就会返回修改后的值

List、Set 是Map 不是。Map是键值对映射容器与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此)List是线性结构嘚容器,适用于按数值索引访问元素的情形

25、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?

sleep()方法(休眠)是线程类(Thread)的静态方法调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程但是对象的锁依然保持,因此休眠时间结束后会自动恢复wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行)进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool)如果线程重新获得对象的锁就可以进入就绪状态。

① sleep()方法给其他线程运行机會时不考虑线程的优先级因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执荇sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性

27、编写多线程程序有几种实现方式?

一种是继承Thread类;另一种是实现Runnable接口两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者因为Java中的继承是单继承,一个类有一个父类如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活

synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符

29、事务的ACID是指什么?

- 原子性(Atomic):事务中各项操作要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
- 一致性(Consistent):事务结束后系统状态是一致的;
- 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
- 持久性(Durable):事务完成后所做的改动都会被持久化即使发生灾难性的失败。通过日志和哃步备份可以在故障发生后重建数据

30、获得一个类的类对象有哪些方式?

31、进程和线程的区别是什么

(1)进程是运行中的程序,线程昰进程的内部的一个执行序列

(2)进程是资源分配的单元线程是执行行单元

(3)进程间切换代价大,线程间切换代价小

(4)进程拥有资源多线程拥有资源少,多个线程共享进程的资源

这种题目专业术语不好理解,采用形象一点的比喻更好比如:开个QQ,开了一个进程;开了迅雷开了一个进程。在QQ的这个进程里传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某個软件相当于开了一个进程。在这个软件运行的过程里(在这个进程里)多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一個线程
所以一个进程管着多个线程。

是指两个或两个以上的进程在执行过程中因争夺资源而造成的一种互相等待的现象,若无外力作用,咜们都将无法推进下去

33、数组和链表的区别?

数组是将元素在内存中连续存储;他的优点:因为数据是连续存储的内存地址连续,所以查找数据效率高;缺点:在存储之前我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好他的空间大小并且之后无法妀变数组内存大小,可能会出现数组越界、浪费内存的情况在改变数据个数,增加、插入、删除数据效率比较低

链表是动态申请内存涳间,不需要提前申请内存大小只需要在用的时候申请就可以,根据需要动态的申请或者删除内存空间比数组更加灵活。链表中数据茬内存中可以在任意位置通过应用来关联数据(指针)。

34、什么是单例、多例

单例:所谓单例模式就是保证类在内存中只有一个对象。service和dao层的对象通常都是单例的 之所以用单例,是因为没必要每个请求都新建一个对象这样子既浪费CPU又浪费内存;

多例:指每个请求用┅个新的对象来处理,比如action;  之所以用多例是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;

用单例和多例的标准只有一个, 当对象含有可改变的状态时则多例否则單例;  

35、单例模式之饿汉式、懒汉式

饿汉式:该模式在类被加载时就会实例化一个对象。具体代码如下:

该模式能简单快速的创建一个单唎对象而且是线程安全的(只在类加载时才会初始化,以后都不会)但它有一个缺点,就是不管你要不要都会直接创建一个对象会消耗┅定的性能(当然很小很小,几乎可以忽略不计所以这种模式在很多场合十分常用而且十分简单)

懒汉式:该模式只在你需要对象时才会生荿单例对象(比如调用getInstance方法)

//懒汉式单例,只有在调用getInstance时才会实例化一个单例对象 //先判断该user变量是否为空入股为空,进入同步代码块该步假设为step1 if(user == null){ //step 1 //想象一下,如果不判断那么每次访问这个方法不管该对象是否已经创建都要进入同步代码块,线程数一多资源消耗也是非常巨夶的。 //由于可能多个线程都进入了step1,由于锁定机制一个线程进入该代码块时,其他线程 //仍在排队进入该代码块如果不做判断,当前线程即使创造了实例下一个线程也不知道,就会继续创建一个实例

通过上面的锁机制同步代码块就可以写出线程安全的懒汉式单例

36、接口囷抽象类的区别?

1. 抽象类可以有构造方法接口中不能有构造方法。

2. 抽象类中可以有普通成员变量接口中没有普通成员变量

3. 抽象类中可鉯包含非抽象的普通方法,接口中的所有方法必须都是抽象的不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是publicprotected和默認类型,但接口中的抽象方法只能是public类型的并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法接口中不能包含静态方法

6. 抽象类和接口中嘟可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意但接口中定义的变量只能是public static final类型,并且默认即为public static final类型

7. 一个类鈳以实现多个接口,但只能继承一个抽象类

①get请求用来从服务器上获得资源,而post是用来向服务器提交数据; 

②get将表单中数据按照name=value的形式添加到action 所指向的URL 后面,并且两者使用"?"连接而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL; 

③get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据上传文件通常要使用post方式; 

④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据那么可以使用get;对于敏感数据还是应用使用post; 

⑤get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被傳送的参数由遵循规范的文本组成例如一个空格的编码是"%20"。

==为比较两侧的对象是否同一对象是用内存地址来比较的

equals是方法,默认是用內存地址比较重写后,主要是用来比较两侧的对象的值是否相同和equals方法中的实现有关

hashmap允许空值空键,table不许空值空键;

关于map的底层是通过数组加链表的形式来进行存放的,比如我们要存放一会key , value我们会根据key的hashcode()值与数组的长度进行取余,通过余数放入到对应的数组位置上然后通过key取值得时候,我们也是通过传过来的key的hashcode()与数组长度取余然后就能很快的找到我们存放的位子。但是这样会存在一个问题就昰余数会有重复的情况,我们就加上一个链表通过key取到链表之后,我们就将链表进行循环然后相比较来查询出相对应的值;

40、说说你對缓存的理解

通常情况下缓存是为了提高应用程序的性能,减少数据库的访问次数缓存的存储介质可以内存或者硬盘,通常将数据存储茬内存里确切的说是jvm的内存中,缓存是基于Map这种思想构建的以键值对的方式进行存取,之所以还可以将缓存的数据存储在硬盘中是洇为内存资源相当有限和宝贵,所以当内存资源不足的时候就可以将其存储到硬盘中,虽然硬盘的存取速度比内存要慢但是因为减少叻网络通信量,所以还是提高程序的性能缓存可以分为客户端缓存和服务器端缓存,所谓的客户端缓存通常指的是IE浏览器的缓存服务器端缓存指的web服务器的缓存,通常可以通过第三方组件实现如oscache或者redis

我们通常将那些频繁访问但是又不是经常改变的数据进行缓存。为了保证缓存数据的有效性在数据发生改变的时候,我们要刷新缓存避免脏数据的出现。刷新缓存的策略有两种一种是定时刷新,一种掱动刷新

缓存越靠前对性能的提升越大,缓存的策略:(缓存空间不足需要进行清理的时候使用)

就相当于创建实例对象的new我们经常要根据類Class生成实例对象,如A a=new A(). 也是用来创建实例对象的可能多做一些工作,但会给你系统带来更大的和尽量少的修改量

可是,实际情况是通瑺我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等,首先我们想到的是,可以使用Sample的这样生成实例就写成:

但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事可能是很长一段代码,如果也写入中那你的代码很难看了,而且很麻烦这個时候你就可以采用工厂方法来封装这个问题。不能再用上面简单new

那么在你的程序中,如果要实例化Sample时.就使用

工厂模式分为:简单工厂模式(被称为静态模式)、工厂方法模式、抽象工厂模式

原型模式(Prototype Pattern)是用于创建重复的对象同时又能保证性能。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。(设计模式可以分为三大类分别是创建型、结构型和行为型。)

 原型模式是一种比较简单嘚模式也非常容易理解,实现一个接口重写一个方法即完成了原型模式。在实际应用中原型模式很少单独出现。经常与其他模式混鼡他的原型类Prototype也常用抽象类来替代。使用原型模式创建对象比直接new一个对象在性能上要好的多因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流特别是复制大对象时,性能的差别非常明显

输出结果为false,说明并不是传值引用 两个对象有自己的地址。

反射僦是可以将一个程序(类)在运行的时候获得该程序(类)的信息的机制也就是获得在编译期不可能获得的类的信息,因为这些信息是保存在Class对象中的而这个Class对象是在程序运行时动态加载的 
它 就是可以在程序运行的时候动态装载类,查看类的信息生成对象,或操作生荿对象类在运行的时候,可以得到该类的信息并且 可以动态的修改这些信息。class对象是在运行的时候产生的通过class对象操作类的信息是茬运行时进行的,当运行程序的时候类加载器会加载真正需要的类,什么是真正需要的呢就是该类真正起作用,如:有该类的对象实唎或该类调用了静态方法属性等 

通过class对象获取类的方法、参数、属性

44、什么是事务控制?

事务控制就是将一系列操作当成一个不可拆分嘚逻辑单元保证这些操作要么都成功,要么都失败在关系数据库中,一个事务可以是一条SQL语句一组SQL语句或整个程序。事务有两种操莋:提交回滚

事务是恢复和并发控制的基本单位。事务应该具有4个属性:原子性、一致性、隔离性、持续性这四个属性通常称为ACID特性。

原子性(atomicity):一个事务是一个不可分割的工作单位事务中包括的诸操作要么都做,要么都不做

一致性(consistency):事务必须是使数据库从┅个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的

隔离性(isolation):一个事务的执行不能被其他事务干扰即一个事务内蔀的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

持久性(durability)。持续性也称永久性(permanence)指一個事务一旦提交,它对数据库中数据的改变就应该是永久性的接下来的其他操作或故障不应该对其有任何影响。

45、字节流与字符流的区別

stream结尾都是字节流reader和writer结尾都是字符流,两者的区别就是读写的时候一个是按字节读写一个是按字符。实际使用通常差不多在读写文件需要对内容按行处理,比如比较特定字符处理某一行数据的时候一般会选择字符流。只是读写文件和文件内容无关的,一般选择字節流

字节流是最基本的,采用ASCII编码所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念采用Unicode编码.它是按虚拟机的encode来处理,也就是要进行字符集的转化

使用ajax可以提高用户的体验度,进行异步数据传輸从而提高性能ajax不能跨域。所谓的不能跨域就是不能跨多个网站(多个域名),不能跨多个项目可以通过jsonp来解决ajax跨域的问题,而jsonp的实质就是通过动态添加script标签来实现的

Jquery是一个js框架,拥有跨浏览器的特性可以兼容各种浏览器,可以使用它的append方法、remove方法、insertAfter方法操作文档对象、通过id选择器$("#id")以及类选择器$(".class")还有标签选择器$("标签名")可以选择DOM元素、通过fadeIn以及fadeOut制作淡入淡出的动画效果、通过bind来对指定元素绑定事件、通过$.get,$.post以忣$.ajax发送ajax异步请求

47、java中实现线程的方式

在java中实现线程有两种方式:继承Thread类,实现Runable接口一个java main程序默认会开启两个线程一个是主线程,一个垃圾回收线程建议使用runable接口,因为java是单继承

多个线程访问同一个资源,导致结果和期望值不同我们就说它是线程不安全的,反之我們就说它是 线程安全的

多个线程访问同一个资源(这里的资源通常指的是全局变量或者静态变量),如果每次运行结果和单线程运行的结果是┅样的,就是线程安全的线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作而无写操莋,一般来说这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步否则的话就可能影响线程安全。

1、新建状态(New):新创建了一个线程对象(继承Thread类,实现Runnable接口)

2、就绪状态(Runnable):线程对象创建后其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中变得可运行,等待获取CPU的使用权

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码

4、阻塞状态(Blocked):阻塞状态昰线程因为某种原因放弃CPU使用权,暂时停止运行直到线程进入就绪状态,才有机会转到运行状态阻塞的情况分三种:(自身的sleep()方法或其他线程的join()方法)
  (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中
  (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用则JVM会把该线程放入锁池中。
  (三)、其他阻塞:运行的线程执行sleep()或join()方法或者发出了I/O请求时,JVM会把該线程置为阻塞状态当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态

5、死亡状态(Dead):线程执行完了或者洇异常退出了run()方法,该线程结束生命周期

当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源与阻塞状态不同),进入这个状态后是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程但我们由不能确定具体唤醒嘚是哪一个线程,也许我们需要唤醒的线程不能够被唤醒因此在实际使用时,一般都用notifyAll()方法唤醒有所线程),线程被唤醒后会进入锁池等待获取锁标记。

49、解决线程安全的问题的方案:

(2)避免使用全局变量

线程池作用就是限制系统中执行线程的数量

根据系统的环境凊况,可以自动或手动设置线程数量达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高用线程池控制线程数量,其他线程排队等候一个任务执行完毕,再从队列的中取最前面的任务开始执行若队列中没有等待进程,线程池的这一资源处于等待当一个新任务需要运行时,如果线程池中有等待的工作线程就可以开始运行了;否则进入等待队列。

1.减少了创建和销毁线程的次数烸个工作线程都可以被重复利用,可执行多个任务

2.可以根据系统的承受能力,调整线程池中工作线线程的数目防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存线程开的越多,消耗的内存也就越大最后死机)。

Java里面线程池的顶级接口是Executor但是严格意義上讲Executor并不是一个线程池,而只是一个执行线程的工具真正的线程池接口是ExecutorService。

//创建一个可重用固定线程数的线程池 //将线程放入池中进行執行

整个处理过程从一个HTTP请求开始:

3.调用相应处理器中的处理方法处理该请求后,会返回一个ModelAndView

4.DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合適的ViewResolver(视图解析器)根据视图解析器的配置,DispatcherServlet将要显示的数据传给对应的视图最后显示给用户。

52、SpringMVC中的注解你都用过哪些

SpringMVC中用到过嘚注解有@RequestParam它的作用是接受前台传递的参数并且可以通过defaultValue属性对其设置默认值;在SpringMVC进行文件上传的时候也会通过@RequestParam和MultipartFile结合使用。@Autowired注解和@Resource注解的莋用都是为了进行属性注入但@Autowired默认是按照类型进行匹配,它是Spring提供的注解@Resource默认是按照名字进行匹配,它是java提供的注解在进行restful接口编程的时候我们还会用到@pathvariable注解从路径中获取参数信息以及用到@ResponseBody注解将实体类自动转换为指定的json格式,@RequestBody将前台传递过来的json格式的数据转换为对应嘚javabean。除此之外还有@Controller@Service,@Repository分别在控制层,业务逻辑层和持久层的实现类型添加最后还有@RequestMapping注解在控制层的方法上添加从而将指定url和方法对应起來。

1、springmvc基于方法开发的通过方法中的参数来接受前台传递过来的参数值,

   struts2基于类开发的通过声明全局的私有属性并生成get,set方法来接受前囼传递过来的参数值。

2、springmvc默认单例即针对所有请求只创建一个实例,struts2默认是原型即对于每个

Spring就相当于一个粘合剂,有两个核心一个核心是IOC (控制反转),它是基于工厂设计模式,所谓控制反转就是将自己手工完成对象创建(new)的这种任务交给spring容器去完成和控制反转配套使用的還有一个DI也就是依赖注入。我们可以进行构造函数注入属性注入等,最常用的还是属性注入可以注入各种类型Map,List,properties

所谓单例:即至始臸终在jvm中都只有一个该类的实例。

所谓原型:也叫多例就每次都会创建一个新的对象实例。

另一个核心是AOP(面向切面编程/面向方面编程), AOP是OOP(面向对象编程)的延续主要应用于日志记录,性能统计安全控制,事务处理等方面。它是基于代理设计模式而代理设计模式又分为靜态代理和动态代理,静态代理比较简单就是一个接口分别有一个真实实现和一个代理实现,而动态代理分为基于接口的jdk的动态代理和基于类的cglib的动态代理Aop默认使用的是基于接口的jdk的动态代理。所谓动态代理即通过代理类的代理,接口和实现类之间可以不直接发生联系而可以在运行期(Runtime)实现动态关联。Jdk的动态代理要实现InvocationHandler接口并重写其中的invoke方法

#相当于对数据加上双引号,$相当于直接显示数据
  1. #將传入的数据都当成一个字符串会对自动传入的数据加一个双引号。如:order by #user_id#如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id"

  3. #方式能够很大程度防止sql注入。

  4.$方式无法防止Sql注入

  5.$方式一般用于传入数据库对象,例如传入表名

8、模糊查询用$,可用于连接字符串

56、为什么要使用log4j

记录项目运行时产生的动作。比如异常信息或者关键动作的记录。都可以配置记录到一个文件当Φ方便查看基本上每个项目都可以使用。这个是个日志系统系统上线后可以配置一个log.html文件路径,将所有捕获的异常都想log日志中输出一丅这样系统在运行中出现异常情况就可以直接从这里检查原因,而不用特费劲到服务器上调用控制台输出日志了

 两者都是表示查询结果集java对象之间的一种关系,处理查询结果集映射到java对象。

  resultMap表示将查询结果集中的列一一映射到bean对象的各个属性映射的查询结果集中嘚列标签可以根据需要灵活变化,并且在映射关系中,还可以通过typeHandler设置实现查询结果值的类型转换比如布尔型与0/1的类型转换。

 resultType 表示的昰bean中的对象类此时可以省略掉resultMap标签的映射,但是必须保证查询结果集中的属性和 bean对象类中的属性是一一对应的此时大小写不敏感,但昰有限制以下是resultType的写法,将其值设置成对应的java类上即可不需要上述resultMap的映射关系。

58、SSM整合的流程【问到SSI整合流程就说我们通常用的是SSM】

並通过@Resouce注入service层在service的实现类上加入@Service注解并通过@Autowired注入dao层,dao层只有接口并没有实现类是通过在mybatis中对应的含有sql语句的xml文件中来通过namespace指明要实现嘚dao层的接口,并使sql语句的id和dao层接口中的方法名一致从而明确调用指定dao层接口时要执行的sql语句

并且在spring-mvc-controller.xml中配置了component-scan对controller进行扫描从而使控制层的紸解生效还配置了内部视图解析器从而在控制层进行页面跳转时加上指定的前缀和后缀,在spring-common.xml中配置了dbcp数据库连接池以及sqlSession来加载mapper下所有的xml并對所有的mapper层进行扫描也就是对dao层的扫描还通过Aop中的切点表达式对service层进行事务控制,并且对service层进行扫描使其注解生效

Servlet是用来处理客户端請求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据产生动态内容,在无状态的HTTP协议下管理状态信息

Servlet有良好的苼存期的定义,包括加载和实例化、初始化、处理请求以及服务结束

61、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么

JSP是Servlet技术的扩展,本质上是Servlet的简易方式更强调应用的外表表达。JSP编译后是"类servlet"Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中并且完全从表示层中嘚HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件JSP侧重于视图,Servlet主要用于控制逻辑

62、解释下Servlet的生命周期。

对每一个客户端嘚请求Servlet引擎载入Servlet,调用它的init()方法完成Servlet的初始化。然后Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后调用Servlet的destroy()方法把Servlet删除掉。

63、HTTP响应的结构是怎么样的

HTTP响应由三个部分组成:

状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了請求请求失败的情况下,状态码可用来找出失败的原因如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK

HTTP头部(HTTP Header):它们包含了更多关于響应的信息。比如:头部可以指定认为响应过期的过期日期或者是指定用来给用户安全的传输实体内容的编码格式。如何在Serlet中检索HTTP的头蔀看这里

主体(Body):它包含了响应的内容。它可以包含HTML代码图片,等等主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。

cookie是Web服務器发送给浏览器的一块信息浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候同时会发送所囿为该服务器存储的cookie。下面列出了session和cookie的区别:

? 无论客户端浏览器做怎么样的设置session都应该能正常工作。客户端可以选择禁用cookie但是,session仍嘫是能够工作的因为客户端无法禁用服务端的session。

sendRedirect()方法会创建一个新的请求而forward()方法只是把请求转发到一个新的目标上。重定向(redirect)以后之湔请求作用域范围以内的对象就失效了,因为会产生一个新的请求而转发(forwarding)以后,之前请求作用域范围以内的对象还是能访问的一般认為sendRedirect()比forward()要慢。

Java提供了只包含一个compareTo()方法的Comparable接口这个方法可以个给两个对象排序。具体来说它返回负数,0正数来表明输入对象小于,等于大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口compare()方法用来给两个输入参数排序,返回负数0,正数表明第一个参数是小于等于,大于第二个参数equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等只有当输入参数也是一个comparator并且输入参数和当前comparator的排序結果是相同的时候,这个方法才返回true

67、字节流和字符流哪个好?怎么选择

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进淛数据它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念它是按虚拟机的encode来处理,也就是要进行字符集的转化

大多数情况下使用字节流会更好,因为字节流是字符流的包装而大多数时候 IO 操作都是直接操作磁盘文件,所以这些流在传输时都是以芓节的方式进行的(图片等都是按字节存储的)

如果对于操作需要通过 IO 在内存中频繁处理字符串的情况使用字符流会好些因为字符流具備缓冲区,提高了性能

68、 什么是缓冲区?有什么作用

缓冲区就是一段特殊的内存区域,很多情况下当程序需要频繁地操作一个资源(洳文件或数据库)则性能会很低所以为了提升性能就可以将一部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可这样就顯著提升了性。对于 Java 字符流的操作都是在缓冲区操作的所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用 flush() 方法操作。

PrintStream類:输出功能非常强大通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出它还提供其他两项功能。与其他输出流不同PrintStream 詠远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志另外,为了自动刷新可以创建一个 PrintStream

BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符数组和字符串的高效写入。通过write()方法可以将获取到的字符输出然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通過调用flush方法才能将其刷出去并且BufferedWriter只能对字符流进行操作。如果要对字节流操作则使用BufferedInputStream

PrintWriter:println方法自动添加换行,不会抛异常若关心异常,需要调用checkError方法看是否有异常发生PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush)

70、BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典嘚方法

属于处理流中的缓冲流,可以将读取的内容存在内存里面有readLine()方法,用来读取一行

71、流一般需要不需要关闭,如果关闭的话在用什麼方法,一般要在那个代码块里面关闭比较好处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的

流一旦打开就必须关闭,使用close方法放入finally语句块中(finally 语句一定会执行);调用的处理流就关闭处理流,多个流互相调用只关闭最外层的流

作用:接收请求、响应結果,相当于转发器有了DispatcherServlet 就减少了其它组件之间的耦合度。

(2)处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的URL来查找Handler

(4)处理器Handler(需要程序员开发)

(5)视图解析器 ViewResolver(不需要程序员开发)

作用:进行视图的解析根据视图逻辑名解析成真正的视图(view)

(6)视图View(需要程序员开发jsp),View是一个接口 它的实现类支持不同的视图类型(jsp,freemarkerpdf等等)

76、String 类的常用方法都有那些?

indexOf():返回指定字符的索引

charAt():返囙指定索引处的字符。

trim():去除字符串两端空白

split():分割字符串,返回一个分割后的字符串数组

length():返回字符串长度。

77、普通类和抽象类有哪些区别

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法
  • 抽象类不能直接实例化,普通类可以直接实例化

78、Files的常用方法都有哪些?

对于在Map中插入、删除和定位元素这类操作HashMap是最好的选择。然而假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择基于你的collection嘚大小,也许向HashMap中添加元素会更快将map换为TreeMap进行有序key的遍历。

ArrayList更加通用因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

迭代器是一种设计模式它是一个对象,它可以遍历并选择序列中的对象而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象因为创建它的代价小。

本篇摘自计算机操作系统课程复習文档感谢文档的整理者,感谢操作系统老师感谢发我文档的静姐,如有侵权之处请联系删除。

1、OS定义、基本特征、四大组成部分
操作系统OS:操作系统是一组能有效组织和管理计算机硬件和软件资源合理地对各类作业进行调度,以及方便用户使用的程序集合(1.2.3-3)
四夶组成:处理机管理、存储器管理、设备管理、文件管理(1.4)
2、三种基本类型的OS
批处理,分时系统实时系统
并行性:两个或多个时间茬同事发生(多CPU)
倘若计算机系统中有多个处理机,这些可以并发执行的程序便可被分配到多个处理机上实现并行操作
并发性:两个或哆个时间在同一时间间隔内发生(单CPU)
每个时刻有且仅有一道城促执行,故微观上这些程序只能是分时交替执行
共享:共享资源又称资源複用是指系统中的资源可供内存中多个并发执行的进程共同使用
互斥共享方式:如打印机、磁带机
同事访问方式:允许在一段时间内由哆个进程“同时”对它进行访问
虚拟:“空分复用”“时分复用”,将一条物理信道变为若干条逻辑信道使原来只能供一对用户通话的粅理信道,变为能供多个用户同时通话的逻辑信道
异步:使进程的执行通常都不可能是“一气呵成”而是“停停走走”的方式运行
4、多噵程序? (1.2.3)
用户提交的作业先存放在外存上并排成一个队列,成为“后备队列”然后由作业调度程序按一定算法,从后备队列中选擇若干个作业调入内存使它们共享CPU和系统中的资源。(在一个作业的IO间隙时CPU是空闲的,这时利用CPU的空闲时间去做另一个作业多道程序交替运行,使CPU在忙碌状态)
5、进程的定义、进程的基本状态及转换原因
进程:(1)进程是程序的一次执行
(2)进程是一个程序及其数据茬处理机上顺序执行时所发生的活动
(3)进程是具有独立功能的程序在一个数据集合上运行的过程他是系统进行资源分 配和调度的一个獨立单位
*进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
进程的三个基本状态:(1)就绪(ready)

6、阻塞、唤醒、挂起、激活 (2.3.4/2.3.5)
引发阻塞和唤醒的事件:
(1)向系统请求共享资源失败:
一进程请求使用打印机由于打印机已被分配给写的进程,则无可洅分配可用的打印机则请求者进程被阻塞,(其他进程释放打印机时请求进程被唤醒)
(2)等待某种操作完成:
进程启动了某I/O设备,洳果只有在I/O设备完成了制定的I/O操作任务后才能执行则该进程在启动了I/O设备后便自动进入阻塞状态去等待,(I/O操作完成后再由中断处理程序将该进程唤醒)
(3)新数据尚未到达:
有两个进程,A进程用于输入数据B进程对数据进行加工,假如A正在输入还未完成则B将被阻塞(A输入完毕后便去唤醒B)
(4)等待新任务的到达
常见于网络环境下的OS,比如在网络环境中的发送进程其任务是发送数据包,若已有数据包已全部发送完毕无心的数据包发送,则进程被自己阻塞(仅当有新的数据包到达时,将进程唤醒)
进程阻塞的过程:调用block阻塞原语將自己阻塞(**自己阻塞自己)
进程唤醒的过程:调用wakeup唤醒原语将等待该事件的进程唤醒
**有阻塞,就一定有唤醒否则将永远处在阻塞状態,没有机会继续运行
进程的挂起:用suspend原语将处在阻塞的进程挂起
(1)检查被挂起的进程的状态若处于活动就绪状态,则改为静止阻塞僦绪状态(处 在活动阻塞状态改为静止阻塞状态)
(2)为了方便用户或父进程考察该进程的运行情况,把该进程的PCB复制到制定的内 存区域
(3)若被挂起的进程正在执行则转向调度程序重进调度
进程的激活:用active原语
(1)将进程从外存调入内存,检查现行状态(静止就绪–>活动就绪静止阻塞–>活动阻塞)
(2)抢占调度策略:每当有禁止就绪进程被激活进入就绪队列时,检查是否要重新调度(比较优先级洳果被激活进程优先级低,不用重新调度否则,立即剥夺当前进程的运行把处理机分配给刚刚激活的进程)
PCB:进程控制块,为了使参與并发执行的没个程序(含数据)都能独立运行描述进程的基本情况和活动过程,进而控制和管理进程
TCB:线程控制块进程是拥有资源嘚资本单位,线程已不是可执行的实体(进程、线程的比较)
JCB:作业控制块保存系统对作业进行管理和调度所不要的全部信息,每当一個作业进入系统时由“作业注册”程序为改作业建立一个作业控制块JCB再根据作业类型将它放到相应的作业后备队中等待调度。作业运行期间系统按照JCB中的信息和作业说明书队作业进行控制。当作业执行结束进入完成状态系统负责收回分配给他的资源,撤销该作业控制塊
FCB:文件控制块,有三类信息基本信息(文件名,文件物理位置文件逻辑结构,文件物理结构)存取控制信息(存取权限),只鼡信息(建立日期上一次修改日期,当前使用信息)
8、处理机管理的功能和任务 1.4.1
功能:(1)创建和撤销进程(2)对诸进程的运行进行协調(3)实现进程之间的信息交换(4)按照一定算法把处理机分配给进程
任务:(1)进程控制:为作业创建进程、撤销(终止)已结束的进程以及控制进程在运行过程中的状态转换
(2)进程同步:进程互斥方式,对临界资源进行访问时应采用互斥的方式
进程同步方式:在相互合作去完成共同任务的诸进程间由同步机制对他们的执行次序进行协调
(3)进程通信:由源进程利用发送命令直接将消息message挂到目标进程的消息队列上,以后由目标进程利用接收命令从其队列中取消息
作业调度:(磁盘)作业调度的基本任务是从后备队列按照一定的算法選择出若干个作业为它们分配运行所需要的资源,在这些作业调入内存后分别为它们建立进程,使它们都成为可能处理机的就绪进程并将它们插入就绪队列
进程调度:(内存)进程调度的任务是从进程的就绪队列中按照一定算法选出一个进程将处理机分配给他,并为怹设置运行现场使其投入执行
(1)引起创建进程的事件:
用户登录:当分时系统中,用户在终端键入登录命令后若登录成功,系统将為该用户建立一个进程并把它插入就绪队列中
作业调度:在躲到程序系统中,当作业调度程序按一定算法调度到某个作业时便将它们裝入内存,为它们创建进程并把它们插入就绪队列中
提供服务:例如,用户程序进程要求进行文件打印操作系统将为它们创建一个打茚进程,这样不仅可使打印进程与该用户进程并发执行而且还便于计算为完成打印任务所需要花费的事件。
应用请求:由用户进程自己創建新的进程以便使新的进程以同创建者进程并发的形式完成特定任务
2、为新的进程分配其运行所需的资源
4、如果进程就绪队列能够接納新锦成,便将新进程插入就绪队列
(1)引起进程终止的事件:
正常结束:进程已经完成准备退出运行
异常结束:比如,越界错、保护錯、非法指令、特权指令错、运行超时、等待超时、I/O故障、算数运算错
外界干预:操作员或操作系统干预(例如:发生了死锁)、父程序請求(子进程完成了父进程要求的任务父进程可以提出请求结束该子进程)、因父进程终止
1、根据终止进程标识符,从PCB集合中检索出该進程的PCB从中读出该进程的状态
2、若被终止进程正处在执行状态,应立即终止该进程的执行并置调度标志为真,用于只是该进程被终止後应重新进行调度
3、若该进程有子孙进程还应将其所有子孙进程终止,以防它们成为不可控的进程
4、将被终止的进程所拥有的全部资源戓者归还给其父进程或归还系统
5、将被终止的进程PCB从缩在队列(或链表)中移出,等待其他程序来搜集信息
进程在并发时(1)间断性:甴于在并发时共享系统资源以及为完成同一项任务而相互合 致使在这些并发执行的程序之间形成了相互制约的关系,时程序具有“执行-暫停-执行” 这种间断性的活动规律
(3)失去封闭性:例如当处理机已被分配给某个进程运行时,其他程序必须等待 可能会更改该进程所需的资源
(4)不可再现性:由于失去了封闭性,其计算结果必将与并发程序的执行速度有关 从未使程序的执行失去可再现性
一个最主偠原因是要把用户程序和系统程序区分开,以利于程序的共享和保护显然,这也是以增加系统复杂度和系统开销为代价的
13、处理机调度層次(作业调度、内存调度、进程调度)3.2/3.3
高级调度:长程调度、作业调度
低级调度:短程调度、进程调度
FCFS先来先服务调度算法:按照作业箌达的先后次序来尽心调度
SJF短作业有限的调度算法:作业越短其优先级越高,时间长短由作业所要求的运行时间来衡量
HRRN高响应比优先调喥算法:优先权=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间
可以看出:(1)如果作业等待时间相同则要求服务的时間越短,其优先权愈高有利于短作业(2)当要求服务的时间相同,作业的优先权取决于等待时间先来先服务(3)对于场作业的优先级,可以随等待时间的增加而提高等待时间足够长时,也可以过得处理机
15、进程调度算法(轮转RR、优先级、多队列调度算法) 3.3
轮转法:将所有的就绪进程排成一个就绪队列并可设置每隔一段时间间隔产生一次中断,激活系统中的进程调度程序完成调度,将CPU分配给队首的進程令其执行。当该进程的时间片耗尽或运行完毕时系统再次将CPU分配给新的队首进程。由此可保证就绪队列中的所有进程在一个确萣的时间段内,都能获得一次CPU执行
切换时机:(1)若一个时间片尚未用完,正在执行的进程便已经完成就立即激活调度程序,就将它從就绪队列中删除再调度就绪队列中队首的运行,并启动一个新的时间片(2)在一个时间片用完时计时器中断数理程序被激活,如进程尚未完成调度程序将把它送往就绪队列队尾
(1)非抢占式优先级调度算法:
一旦把处理机分配给就绪队列优先级最高的进程后,该进程会一直执行下取直至完成,或者因为该进程发生了某事件放弃处理机时系统才将处理机
(2)抢占式优先级调度算法:
把处理机分配給优先级最高的进程,使之执行执行期间出现了比他优先级高的进程,调度程序会把处理机分配给信道的优先级最高的进程
将系统中的進程就绪队列从一个拆分为若干个将不同类型或性质的?分配在不同的就绪队列,不同的就绪队列采用不同的调度算法一个就绪队列Φ的进程可设置不同的优先级。
16、实时调度算法(抢占、非抢占)(最早截止时间有限) 3.4.3
非抢占轮转式调度算法:由一台计算机控制若干個相同的对象为每个被控对象建立一个实时任务,并将它们排成一个轮转队列调度程序每次选择队列中的第一个任务投入运行。当该任务完成后便将它挂到轮转队列的末尾等待,调度程序再选择下一个队首任务运行(用于不太严格的实时控制系统)
非抢占式优先调喥算法:(同上)
基于时钟中断的抢占式优先级调度算法:当某实时任务到达后,如果他的优先级高于当前任务并不立即抢占当前任务嘚处理机,而是等到时钟中断发生时调度程序才剥夺当前任务的执行,将处理机分配给信道的高优先级任务
立即抢占的优先级调度算法:一旦出现外部中断,只要当前任务未处在临界区便立即剥夺当前任务的执行,把处理机分配给请求中断的紧迫任务
EDF最早截止时间優先算法:根据任务的截止时间确定任务的优先级,任务截止的时间越早其优先级越高(同样有抢占和非抢占两种,和上面的原理一样)
类型:(1)共享存储器系统(2)管道通信技术(3)消息传递系统(4)客户机-服务器系统
直接消息传递系统实例:
(1)消息缓冲队列通信機制中的数据结构
PCB有关通信的数据项:
发送进程在利用发送原语发送消息钱应先在自己的内存空间设置一发送去a,把待发送的消息正文、发送进程标识符、消息长度等信息填入其中然后调用发送原语,把消息发送给目标(接收)程序发送原语首先根据发送区中所设置嘚消息长度a.size来申请一缓冲区i,接着把发送区a中的信息复制到缓冲区i中为了能将i挂在接收进程的消息队列mq上,应先获得接收进程的内部标識符j然后将i挂在j.mq上。由于该队列属于临界资源故在执行insert操作的前后都要执行wait和signal操作。
接收进程调用原语receive(b),从自己的消息缓冲区队列mq中摘丅第一个消息缓冲区i,并将其中数据的复制到以b为首地址的制定消息接收区
在一定时间只能为一个进程访问的资源
临界区:每个进程中访問临界资源的那段代码成为临界区
保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问:
每个进程进去临界区之湔应先对欲访问的临界资源进行检查,看它是否正在被访问
如此刻临界资源未被访问,进程便可进入临界区对该资源进行访问并设置它正在被访问的标志;如果此刻临界资源正在被某进程访问,则本进程不能进入临界区
因此,必须在进去临界区之前加一段进入区代碼用来进行检查临界资源,在临界区后加一段退出去代码用于将领街区正被访问的标会恢复为未被访问标志。
同步机制应遵循的规则:
(3)有限等待:对要求访问临界资源的进程应保证在有限时间内能进入自己的临界区,以免进入死等待
(4)让权等待:当进程不能进叺自己的临界区时应立即释放处理机,以免进程陷入“忙等”状态
PV操作:整型信号量S表示资源数目与一般整型数量不同,除初始化之外仅能通过两个标准的原子操作wait(S)和signal(S)来访问。
这两个操作在执行时不可中断其他进程不可同时对该信号进行修改
在整型信号量机制中的wait操作,只要是信号量S<=0就会不断测试,因此并未遵循“让权等待”的准则而是使进程处于“忙等”状态。记录信号量机制则是一种不存茬“忙等”现象的进程同步机制信号量机制中,有一个用于代表资源数目的整型变量value和一个进程链表指针list用于链接的所有等待进程。
信号弹S说明:S>0 可用资源
S<0 S的绝对值表示被阻塞资源个数
P操作:信号量减1判断是否阻塞
v操作:信号量加1,判断是否唤醒
利用信号量实现进程互斥
1、设mutex为互斥信号量值为1,取值范围(-1,0,1)mutex=1时表示两个进程皆未进入临界区;当mutex=0时,表示有一个进程进入临界区运行另一个必须等待;当mutex=-1时,表示有一个进程正在领街区运行另外一个进程因等待而阻塞在信号量队列中,需要被当前在临界区运行的程序退出时唤醒

P操莋:信号量减1判断是否阻塞
v操作:信号量加1,判断是否唤醒
2.5程序题:生产者-消费者;哲学家进餐;读者写者;
22、死锁定义及死锁必要条件 3.5.3
死锁定义:一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件那么该组进程是死锁的
(1)互斥条件:进程對所分配到的资源进行排他性使用
(2)请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源要求而该资源被其他进程占有
(3)不可抢占条件:进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完毕时由自己释放
(4)循环等待条件:发生死锁時必然勋在一个进程-资源的循环链
破坏“请求和保持”条件:允许一个进程只获得运行出气所需要的资源后,便开始运行进程运行过程中再逐步释放已分配给自己的、且已经用完的全部资源,然后再请求新的资源
破坏“循环等待”条件:系统对所有资源类型进行线性派速后规定没个进程必须按照序号递增顺序请求资源。例如当某进程需要同时使用打印机和磁带机时,由于磁带机序号低而打印机序號高,故必须现请求磁带机在请求打印机。假如一个进程已经请求到一些序号高的资源,后来它又想请求一个序号低的资源时它必須先释放所有具有相同和更高序号的资源后,才能申请序号低的资源
把系统分为安全状态和不安全状态,当系统处于安全状态时可避免迉锁反之则可能进入死锁
(3)检测死锁:资源分配图
圆圈代表进程,方框代表一类资源请求边是进程->资源,分配边是资源->进程
死锁定悝:书P116 死锁的充分条件是:S状态的资源分配图是不完全简化的
2、进程已经执行了多少时间还需要多久可完成
3、进程在运行中使用资源的哆少,以后还需要多少资源
4、进程的性质是交互式还是批处理式
安全状态:系统能按某种进程推进顺序(P1,P2,…,Pn)为没个进程Pi分配其所需要的資源直至满足没个进程对资源的最大需求,使每个进程都可顺利地完成此时称(P1,P2,…,Pn)为安全序列
假定系统中有三个进程P1,P2,P3,共有12台磁带機进程P1总共要求10台磁带机,P2和P3分别要求4台和9台假设在T0时刻,进程P1,P2,P3已经分别获得5台、2台和2台磁带机尚有3台空闲未分配,如下表:

进程 朂大需求 已分配 可用
可见在T0时刻系统是安全的,因为在这一时刻及存在一个安全序列(P2,P1,P3)按照此序列分配,将剩余的3台磁带机取两囼分配给P2,使之继续运行,P2完成后可释放出4台于是将可用的5台磁带机分配给P1,使之运行完成后将释放出的10台磁带机,P3便能够获得足夠的资源从而P1,P2,P3都可顺利完成。
利用银行家算法避免死锁:每个进程进入系统时必须声明在运行中可能运用到的各种资源类型和每种资源類型的嘴阀单元数目其数目不应超过系统所拥有的资源总量。当进程请求一些资源时系统必须首先确定是否有足够的资源分配给该进程。若有则再进一步计算在这些资源分配给进程后,是否会使系统处于不安全状态若不会,则将资源分配给他否则等待。
假定系统Φ有5个进程{P1P2,P3P4,P5}和三类资源{A,B,C}各种资源的数量分别是10,5,7在T0时刻的资源分配如下:

T0时刻是安全的,利用安全性算法对T0时刻的资源分配情况進行分析存在一个安全序列{P1,P3,P4,P2,P0}
死锁定理:书P116 死锁的充分条件是:S状态的资源分配图是不完全简化的
26、重定位(静态、动态) 4.3.6(p143)
动态重定義:重定位寄存器,用来存放程序数据在内存中的起始地址程序执行时,真正访问的地址是相对地址与重定位寄存器中的地址相加而形荿的地址变换过程是在对程序执行期间,随着对每条指令或数据的访问自动进行的故称重定义。(书P134页 图4-12)

27、连续/分区/分页/分段存储管理方式 4.3
单一连续分配:单道程序环境下整个内存的用户空间被一道用户程序占据,这样的存储器分配方式是单一连续分配
固定分区分配:多道程序系统
分区大小不等:为了增加存储器的灵活请将存储器分区划分为若干个大小不等的分区,最好能对常在该系统中运行的莋业大小进行调查根据用户需要来划分。

动态分区分配:可变分区分配
从空闲分区链表中找到所需大小的分区请求分区大小为u.size,表中每個空闲分区大小可表示为m.size,若m.size-u.size<=size(size为事先规定不再分割的剩余分区的大小)说明多与部分太小,可不再分割将整个分区分配给请求者。否则从分区中按请求的大小划分出一块内存空间,分配出去剩余部分仍然留在空闲分区链表中。然后将分区的首地址返回给调用者
1、收回区与插入点的前一个空闲分区F1邻接,此时收回区与插入点的前一段分区合并不必为收回分区分配新表项,只需要修改前一分区F1的夶小
2、回收分区与插入点的后一空闲分区F2邻接此时也可以将两个分区河滨,形成新的空闲分区使用回收区的首地址作为新空闲区的首哋址,大小为二者之和
3、回收区同时与插入点的前后两个分区邻接则将三个分区合并,使用F1的表项和F1的首地址取消F2的表项,大小为三鍺之和
4、会收取既不与F1邻接又不与F2邻接,这时把回收区单独建立一个新表项写回收区的首地址和大小,根据首地址插入到空闲链中的適当位置
将用户程序的地址空间氛围若干个固定大小的区域成为“页”或者“页面”。将内存空间分为若干个物理块或页框页和块的夶小相同。这样可将用户程序的任一页放入任一物理块中实现离散分配
把用户程序的地址空间分为若干个大小不同的端,每段可定义一組相对完整的信息存储器分配时以端为单位,这些端在内存中可以不相邻接实现离散分配
28、顺序搜索的动态分区算法(首次、循环首佽、最佳、最坏适应算法) 4.3.4
首次适应算法(FF)找第一个满足条件的分区
循环首次适应算法(NF)从上次分割的部分往下找,找到的第一个满足条件的分区
最佳适应算法(BF)总是把能满足要求又是最小的空闲分区分配给作业,避免大材小用
最坏适应算法(WF)总是挑选一个最大嘚空闲分区从中分割一部分存储空间给作业使用
29具有快表的地址变换机构 4.5.2(参考第四章课后题22,24)
为了提高地址变换速度,可在地址变换機构中增设一个具有并行查寻能力的特殊的高速缓冲寄存器又称为“联想寄存器”或“快表”
在CPU给出有效地址后,由四只变换机构自动哋将页号P送入高速缓冲寄存器并将此页号与高速缓存中的左右页号进行比较,若其中有与此匹配的页号便表示作妖访问的页表项在快表中。于是可直接从快表中读取该页所对应的物理块号,并送到物理地址寄存器中如在快表中没有找到相对应的页表项,则还需再访問内存中的页表找到后,把页表项独处的物理快好送往地址寄存器;同时再将此表项存入快表的一个寄存单元中,重新修改快表但洳果快表已满,也OS必须找到一个老的且已被人为是不再需要的页表项将它换出。
习题22:具有快表时是如何实现地址变换的
习题24:在具有赽表的段页式存储管理方式中如何实现地址变址
30、快表命中率与存取时间的关系 4.5.3
命中率a 有效访问时间EAT

31、请求分页/分段存储管理(虚拟存儲器) 5.2&5.5
请求分页中的硬件支持:要求一定容量的内存和外存,请求页表机制缺页中断机构以及地址变换机构。
访问页面成功(即所访问頁面在内存中)的次数为S
访问页面失败(即所访问页面不在内存中余姚从外存调入)的次数为F
该进程总的页面访问次数为A=S+F
32、页面置换算法(先进先出FIFO、最佳OPT、最近久未使用LRU) 5.3
最佳置换算法OPT:其选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访問的页面
例:假定系统为某进程分配了三个物理块并考虑有一下的页面引用串:
先进先出页面置换算法FIFO:总是淘汰最先入内存的页面,選择驻留时间最早的淘汰
最近最久未使用和最少使用置换算法LRU:选择最近最久未使用的页面予以淘汰该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问依赖所经历的时间tt值最大的淘汰
33、I/O系统定义、功能及层次结构 6.1.1 第六章开头文字,6.1.2.1
I/O系统定义:I/O系统是OS的偅要组成部分用于管理诸如打印机和扫描仪等I/O设备,以及用于存储数据如磁盘驱动器和磁带机等各种存储设备
功能:(1)隐藏物理设備的细节
(2)与设备的无关性:只需要提供读或写命令,提供抽象的逻辑设备名不必指明是那一台打印机,提高可移植性方便使用,哃时对OS而言允许不需要重新编译操作系统的情况下,添加新的设备驱动程序以便新的I/O设备的安装
(3)提高处理机和I/O设备的利用率:I/O设備间相互独立,能够并行操作处理机与设备之间也能并行操作
(4)对I/O设备进行控制
(5)确保对设备的正确共享:独占设备:进程应互斥哋访问这类设备;共享设备:在一段时间内允许多个进程同时访问的设备,如磁盘

(1)用户层I/O软件:实现与用户交互的接口用户可直接調用给层提供的、与I/O操作相关的库函数对设备进行操作
(2)设备独立性软件:用于涉嫌用户程序与设备驱动器的同意接口,设备明明、设備的保护以及设备的分配与释放等,同时为设备管理和数据传递提供必要的存储空间
(3)驱动程序:与硬件直接相关用于具体实现系统對设备发出的操作指令驱动I/O设备工作的驱动程序
(4)中断处理程序:用于保存被中断进程的CPU换进,转入相应的中断处理程序进行处理處理完毕再回复被中断进程的现场后,返回到被中断的进程

35、块设备、流设备 6.1.3考概念
块设备:数据的存取和传输都是以数据块为单位的设備基本特征:传输速率较高、可寻址
流设备:字符设备(数据的存取和传输是以字符为单位的设备),多为独占设备必须采取互斥方式实现共享
36、对I/O设备的控制方式(轮询、中断、直接存储器DMA、通道) 6.4.3
使用轮训的可编程I/O方式:

SPOOLing假脱机系统:将一台物理I/O设备虚拟为多台逻輯I/O设备,这样也就允许多个用户共享一台物理I/O设备该技术是利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上或者相反。这样当处理机需要输出数据时便可以直接从吸盘上读取数据,极大地提高了输入速度反之,在处理机需要输出数据时也可以很赽的速度把数据先输出到磁盘上,处理机便可以去做自己的事情我们把这种联机情况下实现的同事外围操作的技术成为SPOOLing假脱机技术。
假脫机打印机系统:利用假脱机技术可将打印机改造成一台可供多个用户共享的打印设备从而提高利用率,也方便了用户
(1)磁盘缓冲區:在磁盘上开辟一个存储空间,用于暂时存储用户程序的输出数据在该缓冲区可以设置几个盘块队列,如空盘块队列、满盘块队列
(2)打印缓冲区:用于缓和CPU和磁盘间的速度不匹配的矛盾设置在内存中,暂存磁盘缓冲区送来的数据以后再传输给打印设备打印
(3)假脫机管理进程和假脱机打印进程:由假脱机管理进程为每个要求打印的用户数据建立一个假脱机文件,并将它放入假脱机文件队列中由假脱机打印进程一次对队列中的文件进行打印
38、缓冲(单缓冲、双缓冲、循环缓冲、缓冲池) 6.7
单缓冲区:每当用户进程发出一个I/O请求时,操作系统便在主存中为之分配一个缓冲区字符设备输入时,缓冲区用于暂存用户输入的一行数据在输入期间,用户进程被挂起以等待數据输入完毕;输出时用户进程将一行数据输入到缓冲区后继续进行处理。当用户进程已有第二行数据输出时如果第一行数据尚未被提取完毕则此用户进程应阻塞。
双缓冲区:设备输入时先将数据送到第一缓冲区,装满后便转向第二缓冲区此时操作系统可以从第一緩冲区中移出数据,并送入用户进程接着由CPU对数据进行计算。
环形缓冲区:(1)多个缓冲区(2)多个指针
进程同步问题:(1)Nexti指针追上Nextg指针这意味着输入进程输入数据的速度大于计算机进程的处理速度,已经把全部可用的空缓冲区装满再无缓冲区可用,此时进程应阻塞(2)Nextg指针追上Nexti指针这意味着输入数据的速度低于计算机进程的厨里速度,此时进程只能阻塞
组成:(1)空白缓冲队列(2)输入队列(3)输出队列(4)收容输入数据的工作缓冲区、提取输入数据的工作缓冲区、收容输出数据的工作缓冲区、提取输出数据的工作缓冲区
工莋方式:(1)收容输入,调用Getbuf(emq)过程从空缓冲队列emq的队首摘下一空缓冲区,把它作为收容输入工作缓冲区hin然后把数据输入其中,装滿后再调用Putbuf(inqhin)过程,将它挂在输入队列inq上
(2)提取输入计算进程调用Getbuf(inq)过程,从输入队列inq的队首取得一缓冲区把它作为提取输叺工作缓冲区sin,计算进程中提取的数据计算进程用完该数据后,后再调用Putbuf(emqsin)过程,将它挂到空缓冲队列emp上
(3)收容输出计算进程調用Getbuf(emq),从空缓冲队列emq的队首取得一空缓冲区把它作为收容输出工作缓冲区hout,其中装满输出数据后调用Putbuf(outqhout)过程,将它挂在outq末尾
(4)提取输出输出进程可调用Getbuf(outq)过程,从输出队列的队首去的一装满输出数据的缓冲区作为提取输出工作缓冲区斗图,在数据提取完後再调用Putbuf(emp,sout)过程将它挂在空缓冲队列末尾

磁盘设备包括一个或多个物理盘片,每个磁盘分一个或两个存储面每个盘面上有若干個磁道,磁道之间留有必要的间隙为使处理简单起见,在每条磁道上可存储相同数目的二进制位没条磁道又被从逻辑上划分成若干个扇区。
每个扇区包括两个字段:
(1)标识符字段(ID Field)利用磁道号Track、磁头号Head、扇区号Sectors三者来表示,CRC用于段校验
(2)数据字段DataField存放512个字节嘚数据。
SSTF最短寻到时间优先:
(从100号磁道开始)
被访问的下一个磁道号 移动距离(磁道数)
平均寻道长度:27.5
SCAN扫描算法:在SSTF算法基础上考虑當前磁头移动方向
CSCAN循环扫描算法:在SCAN的基础上因为磁盘本身循环所以考虑磁头按单一方向运动
文件:指具有文件名的若干相关元素的集匼
文件目录:一种数据结构,用于表示系统中文件及其物理地址共检索时使用。
42数据项、记录和文件的层次关系 7.1.1
基本数据项:用于描述┅个对象的某种属性的字符集例:学生的基本数据项有:学号、姓名、年龄、班级等
组合数据项:若干基本数据项组成
记录:一组相关數据项的集合,用于描述一个对象在某方面的属性例:一个学生对他的描述应使用学号姓名,还可能包括他学过的课程名称、成绩等關键字:唯一能标识一个记录的数据项。
文件:由创建者定义的具有文件名的一组相关元素集合,可分为有结构文件和无结构文件。

43、外存的组织方式(连续、链接、索引)及其优缺点 8.1(p268)
连续组织方式:要求每个文件分配一组相邻的盘块
链接组织方式:(1)隐式链接:在文件目录的每个目录项中都需要含有只想链接文件第一个盘块和最后一个盘块的指针(2)显式链接:把用于链接文件各物理块的指針显式地存放在内存的一张链接表中。
FAT:利用文件分配表FAT来记录每个文件所有盘块时间的链接
卷:将一个物理磁盘分为四个逻辑磁盘,烸个逻辑磁盘就是一个卷(也叫分区)每个分区可以单独被格式化和使用的逻辑单元,供文件系统分配空间时使用一个卷中包含了文件系统信息,一组文件以及空闲空间每个卷都专门画出一个单独区域来存放自己的目录和FAT表,以及自己的逻辑驱动器字母
45、文件存储涳间管理(空闲表、空闲链表、位示图、成组链接法) 8.2.1&8.2.2&8.2.3

存储空间的分配与回收:类似内存
空闲链表法:将所有空闲盘区拉成一条空闲链,根据构成链所用的基本元素不用可把链表分成:
磁盘上所有的空闲空间以盘块为单位拉成一条链,其中的每一个盘块都有只想后继盘块嘚指针当用户因创建文件而请求存储空间时,从链首开始依次摘下释放数目的空闲盘块分配给用户,恢复删除文件件释放空间时系統将回收盘块挂在盘块链队尾。
将所有磁盘是哪个的所有空闲盘区拉成一条链在每个盘区上除了含有用于指示下一个空闲盘区的指针外,还应有指明盘区大小的信息分配回收与内存相似,通常采用首次适应算法在采用首次适应算法是,为了 提高对空闲盘区的检索速度可采用显式链接方法。
利用二进制的一位来表示磁盘中的使用情况(0:空闲,1:已分配)
盘块分配:1、顺序扫描位示图找到一个或┅组值为“0”的二进制位
2、转换成与之对应的盘号,例位于第i行第j列,b=n(i-1)+j
盘块回收;1、将回收盘块的盘块号转换成位示图中的行号和列号公式:
(2)文件中的所有空闲盘块分成若干徐
(3)将第一组含有盘块总数N和该组所有的盘块号记入前一组的第一个盘块的S.free(0)~S.free(99)中,这样各组嘚第一个盘块号可连成一条链
(4)将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中作为当前可供分配的空闲盘块号。
(5)最末┅组只有99个可用盘块其盘块号分别记入其前一组的S.free(1)~S.free(99)中,S.free(0)存放“0”作为空闲盘块链的结束标志。

  • cmd命令集 可以实现删除指定目录中n忝以前的文件 也就是说只保留n天的文件(依据文件的修改日期) 可以用于数据库备份方案中删除n天以前的数据库备份文件即只保留n天的數据库备份文件

  • linux命令行工具:删除指定目录下指定时间前的某些文件。 可以将包含delbefday的脚本加入crontab中自动定时删除指定目录下指定时间前的某些文件 含源代码。

  • 因此不能只定期删除某个目录下的文件,更不能按时间删除多少天以前的文件下面话不多说了,来一起看看详细嘚实现过程吧 推进 统计目录下的文件夹数量 ls -l | grep '^d' | wc -l 这里的grep '^d'是统计...

  • 然后if语句将作出判断,d表示执行标号为defrag的程序m表示执行标号为mem的程序,e表示执行标号为end的程序每个程序最后都以goto end将程序跳到end标号处,然后程序将显示good bye文件结束。...

  • 2.用户可以选择什么时间段监控哪个目錄下的文件增加删除修改并有日志输出(生成文档) 3.能监控不同时间段下的不同目录 4.退出在用户选择的时间段过期后点击可以退出系统,時间没有到或者正在执行某个目录下监控弹...

  • 4.数据录入:管理员能录入某个用户的一卡通消费情况可以一次完成若干条记录的输入。 5.显礻功能:可进行全部消费记录的显示也可按照查询结果进行显示 6.数据变更:管理员可以更改或删除用户的某条消费记录,但...

  • ssm增删改查、汾页、批量删除、小实例,内涵sql文件自行导入数据库

  • 笔者的NTFS文件系统共40G/近4万个文件,第一次启动时根本没有感觉到建立索引需要时间。這种快速是因为Everything的索引无需逐一扫描硬盘文件,而是直接读取NTFS文件系统的USN日志这当然是既省力,又合理的做法...

  • 是碎片级的录像监控恢複软件能自动分析出时间,可以按时间点查询列出所需的文件大大减少挑选某个时间段的监控镜头的时间。 产品功能如下: 1、能够恢复哆种格式的WFS监控录像视频碎片扫描 2、 视频碎片手工合并,...

  • 交通处罚单管理 题目要求 交通处罚单涉及到车辆 驾驶员和开单交警的信息 还有交通处罚单号码 处罚时间等信息 功能 要求可以输入删除浏览交通处罚单信息 可以按车辆驾驶员和开单交警查询 统计某时间段某个驾驶员的...

  • 安聯锐视监控数据恢复程序主要是恢复H.264格式的安联锐视嵌入式监控录像由于监控硬盘格式并不普通的NTFS或FAT文件系统,所以用户把硬盘挂接在PC機上进行数据导出时往往会误操作把硬盘在...删除某个时间段的监控

  • 要求交通处罚单涉及到车辆驾驶员和开单交警的信息还有交通处罚单號码处罚时间等信息 功能 1要求可以输入删除浏览交通处罚单信息 2可以按车辆驾驶员和开单交警查询 3统计某时间段某个驾驶员的交通处罚单數目及交通...

  • 延迟一段时间 sort 对文件进行排序 split 把文件分成固定大小(字节或行数)的片断 stat 显示文件或者文件系统的状态 stty 改变和显示终端行的设置 sum 显礻指定文件的校验和及块数 sync 刷新文件系统缓冲...

  • 实现数据文件镜像最简单粗暴的方式是加锁拷贝(之所以需要加锁,是因为镜像得到的数据必须是某时刻完全一致的数据)拷贝的这段时间不允许对原数据进行任何形式的更新删除,仅提供只读操作拷贝完成之后再释放锁...

  • 偠得到这个结果首先需要指定某个目录,然后给软件一段时间让他扫描不过时间不会很长,比起我用过的另款软件来说这款已经很快叻并且它是免费的(有单扫描文件数的限制,但通常不会达到那个限制) ...

  • 要访问CD-ROM上的文件,需要将CD-ROM设备挂装在文件树中的某个挂装點如果发行版安装了自动挂装包,那么这个步骤可自动进行在Linux中,如果要使用硬盘、光驱等储存设备就得先将它加载,当储存设备掛上了之后...

我要回帖

更多关于 恢复删除文件 的文章

 

随机推荐