(1)在支持多线程的系统中,进程P创建的若干个线程不能共享的是(D)
A. 进程P的代码段
B.进程P中打开的文件
C.进程P的全局变量
D.进程P中某线程的栈指针
栈指针是属于线程私有的
(2)线程的切换会引起进程的切换(A)
A.错
B.对
一个进程可能包含多个线程,对于同一个进程中的线程间切换,不会引起进程切换,不同进程间中的线程切换会导致进程切换
(3)把逻辑地址转换为物理地址称之为(B)
A.地址分配
B.地址映射
C.地址保护
D.地址越界
地址映射:为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址
(4)在Unix系统中,处于()状态的进程最容易被执行(C)
A.辅存睡眠
B.内存睡眠
C.内存就绪
D.辅存就绪
(5)当系统发生抖动时,可以采取的有效措施是(A)
在具有对换功能的操作系统中,通常把外存分为文件区和对换区。前者用于存放文件,后者用于存放从内存中换出的进程
抖动现象是指刚刚被换出的页很快又要被访问。为此,又要换出其他页,而该页又快被访问,如此频繁的置换页面,以致大部分时间都花在页面置换上
撤销进程可以减少所要用的页面数,防止抖动
对换区大小和进程优先级都与抖动无关
对于这道题,和错排问题类似
错排问题:用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作D(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类
对于a错装共有n-1中可能,因此D(n)=(n-1)*[D(n-1)+D(n-2)]
特殊情况D(0)=0,D(1)=0;
思路:对于本题来说,除了要求出错排总数来说,还要求出数值为n时,所有的排列组合情况
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
long d[]= new long[21]; //存放错排的种数
d[0]=0;
d[1]=0;
d[2]=1;
long f[]=new long[21];//存在阶乘
f[0]=1;
f[1]=1;
f[2]=2;
for(int i=3;i<=20;i++){
d[i]=(i-1)*(d[i-1]+d[i-2]);
f[i]=i*f[i-1];
}
while(scanner.hasNextInt()){
int n=scanner.nextInt();
System.out.printf("%.2f%%\n",100.0*d[n]/f[n]);
}
}
}
思路:解析出第一行输入,将所有名字保存在HashSet中,判断第二行输入的名字是否存在
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
while(scanner.hasNextLine()){
Set<String> set=new HashSet<>();
String name=scanner.nextLine();
int i=0;
int end=0;
while(i<name.length()){
if(name.charAt(i)=='\"'){
end=name.indexOf("\"",i+1);
set.add(name.substring(i+1,end));//截取的起始位置i+1,因为i位置是"
i=end+2; //end指向" i需要跳过"和"后面的,
}else {
end=name.indexOf(",",i+1);
if(end==-1){
//分割最后一个名字的情况
set.add(name.substring(i,name.length()));
break;
}
set.add(name.substring(i,end));//截取位置是i,因为i位置指向英文字符
i=end+1;//end指向, i需要跳过,
}
}
name=scanner.nextLine();
if(set.contains(name)){
System.out.println("Ignore");
}else {
System.out.println("Important!");
}
}
}
}
indexOf方法