[解析] 对于选项A,最短作业优先(Shortest Job First,SJF)是对FCFS算法的改进,其目标是减少平均周转时间。其优点是相比FCFS(First Come First Served,先来先服务)改善了平均周转时间和平均带权周转时间,缩短了作业的等待时间,同时,提高了系统的吞吐量。但缺点就是对长作业非常不利,可能长时间得不到执行;未能依据作业的紧迫程度来划分执行的优先级;难以准确估计作业(进程)的执行时间,从而影响调度性能。最短作业优先是一种适用于运行时间可以预知的非抢占式的批处理调度算法。所以,选项A正确。 对于选项B,先来先服务(First Come First Serred,FCFS)是最简单的调度算法,按先后顺序进行调度;适用于长作业,而不利于短作业;有利于CPU繁忙的作业,而不利于I/O繁忙的作业。所以,选项B错误。 对于选项C,优先级算法(Priority Scheduling)是多级队列算法的改进,平衡了各进程对响应时间的要求。适用于作业调度和进程调度,可分成抢先式和非抢先式。所以,选项C错误。 对于选项D,轮转法(Round Robin)是让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。所以,选项D错误。 所以,本题的答案为A。
public class Test { static int i; public int test() { i++; return i; } public static void main(String args[]) { Test test=new Test(); test.test(); System.out.println(new Test().test()); } }
class Base{ public int status=0; Base(int status) {this.status=status;} public void print() { System.out.println("base"); } } class Sub extends Base { public int status; Sub(int status) { super(status-1); this.status=status; } public void printSub() { System.out.println("sub"); System.out.println("status="+status); } public void printBase() { super.print(); System.out.println("status="+super.status); } } public class Test { public static void main(String args[]) { Sub s=new Sub(2); s.printBase(); s.printSub(); } }
[解析] 在SQL语言中,%和表示的是通配符(通配符指的是一种特殊语句,用来进行模糊查询的,在匹配字符串时,可以使用它来代替一个或多个真正字符,当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符),其中“%”表示的是0个或多个字符,而“_”表示的是一个字符。 在本题的查找条件中,要求倒数第三个字母为‘W’,所以,字符‘W’后面有两个其他字符,可以表示成“W__”,并且还要求至少包含4个字母,而当以“%”开头时,它表示的字符可以不存在,所以,开头应加一个“_”,那么查询条件子句应写成WHERE DNAME LIKE '_%W__'。 所以,本题的答案为B。 需要注意的是,除了以上介绍的两种通配符以外,SQL语言中还有两个通配符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]表示不在字符列中的任何一个字符。例如,要求从名为“Persons”的表中选取居住的城市以“A”或“L”或“N”开头的人,可以使用下面的SELECT语句:SELECT*FROM Persons WHERE City LIKE'[ALN]%'。要求从名为“Persons”的表中选取居住的城市不以“A”或“L”或“N”开头的人,可以使用下面的SELECT语句:SELECT*FROM Persons WHERECity LIKE '[!ALN]%'。
[解析] 本题中,选项A、选项B和选项C的调度方法都不满足题目要求,所以,选项A、选项B和选项C错误。 对于选项D,最高响应比优先法(Highest Response_ratio Next,HRN)是对FCFS(First Come First Served,先来先服务)方式和SJF(Shortest Job First,最短作业优先)方式的一种综合平衡。FCFS方式只考虑每个作业的请求时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。因此,这两种调度算法在某些极端情况下会带来不便。HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。响应比R定义如下:R=(W+T)/T=1+W/T,其中,T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。这种算法是介于FCFS和SJF之间的一种折中算法。由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,当采用HRN方式时,其吞吐量将小于采用SJF法时的吞吐量。另外,由于每次调度前要计算响应比,系统开销也要相应增加。等待时问一定,要求服务的时间越短,先运行;要求服务的时间一定,等待时间越长,先运行。所以,最高响应比优先调度是一种既有利于短作业又兼顾长作业的调度方式。所以,选项D正确。
进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统创建了一个主线程,每个线程有自己的堆栈。DLL(Dynamic Link Library,动态链接库)中是否具有独立的堆栈,这个问题不好回答,或者说这个问题本身就有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是由EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈呢?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈呢?以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以,如果是从DLL中动态分配的内存,最好是从DLL中删除;如果是从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃。
在实际使用时,如果不确定运算符的优先级,最好运用括号运算符来控制运算顺序。
常见笔试题:
下面程序的运行结果是什么?
public class Test{
public static void main(String[]args){
byte a=5;
int b=10;
int c=a>>2+b>>2;
System.out.println(c);
}
}
答案:0。由于“+”的优先级比“>>”高,因此程序中的表达式等价于a>>(2+b)>>2,相当于a>>12>>2,因此运行结果为0。
5. 如何用两个栈模拟队列操作?
假设使用栈A与栈B模拟队列Q,A为插入栈,B为弹出栈,以实现队列Q。 再假设A和B都为空,可以认为栈A提供入队列的功能,栈B提供出队列的功能。 要入队列,入栈A即可,而出队列则需要分两种情况考虑: 1)若栈B不为空,则直接弹出栈B的数据。 2)若栈B为空,则依次弹出栈A的数据,放入栈B中,再弹出栈B的数据。 以上情况可以利用前面介绍的栈来实现,也可以采用Java类库提供的Stack来实现,下面代码是采用Java内置的Stack来实现的: public class MyQueue<E>{ private Stack<E>s1=new Stack<E>(); private Stack<E>s2=new Stack<E>(); public synchronized void put(E e){ s1.push(e); } public synchronized E pop(){ if(s2.isEmpty()) while(!s1.isEmpty()) s2.push(s1.pop()); return s2.pop(); } public synchronized boolean empty(){ return s1.isEmpty()&&s2.isEmpty(); } public static void main(String[]args){ MyQueue<Integer>q=new MyQueue<Integer>(); q.put(1); q.put(2); System.out.println("队列首元素:"+q.pop()); System.out.println("队列首元素:"+q.pop()); } } 程序运行结果为: 队列首元素:1 队列首元素:2 引申:如何使用两个队列实现栈? 假设使用队列q1与队列q2模拟栈S,q1为入队列,q2为出队列。 实现思路:可以认为队列q1提供压栈的功能,队列q2提供弹栈的功能。 要压栈,入队列q1即可,而当弹栈时,出队列则需要分两种情况考虑: 1)若队列q1中只有一个元素,则让q1中的元素出队列并输出即可。 2)若队列q1中不只一个元素,则队列q1中的所有元素出队列,入队列q2,最后一个元素不入队列B,输出该元素,然后将队列q2所有元素入队列q1。