目录
选择题
1.
程序计数器、栈、寄存器是线程私有的。
2.
换页错误:也就是缺页异常/缺页中断。
占用 CPU 能更快得到执行,占用 I/O 能更快加载页相关的数据,这跟性能有关,并不能减少缺页中断。至于使用基于最短剩余时间的调度机制,则和减少缺页中断无关。
3.
主存不足时,可以去辅存加载数据。
4.
在采用虚拟存储技术的存储系统中,一个多任务的操作系统经常将多个不同的程序同时调入主存执行:
1. 首先需要保证这些程序间不会相互覆盖
2. 一个程序不能访问其他程序的数据以及不是分配给它的主存区域
3. 一个程序出错不会破坏其他用户程序和系统程序
为了满足以上条件,采取一种限制方式保护主存中程序的技术被称为存储保护,存储区域保护主要是为了防止地址越界。
5.
强占式静态优先权法,可能会导致进程饥饿,因为优先级高的进程一直抢占优先级低的进程,优先级高的进程一直被执行,但是优先级低的进程长期得不到执行,这种现象就被称为进程饥饿。
非抢占式静态优先权法:优先权不会变,假设有一个最低优先权的线程在等待,那么等优先级高的执行完就轮到 该进程执行了。
时间片轮转调度法:一个时间片内没有完成运行的进程,会返回到绪队列末尾重新排队,等待下一次调度。
非抢占式动态优先权法:因为是动态的,所以等待到的越久,优先级就越高,被执行的可能就越大,所以不会出现饥饿现象。
6.
如果信号量 < 0 ,| 信号量 | = 等待中的进程的个数
7.
8.
如果系统中只有用户态线程,则线程对操作系统是不可见的,操作系统只能调度进程。
如果系统中有内核态线程,则操作系统可以按线程进行调度。
作业:一个作业通常包含几个进程,几个进程会一同完成一个任务(作业)。
9.
如果每条数据是独立的,说明数据之间没有关联性,就只能按照自己的条件进行查询,但是每条数据被访问的概率又相等,所以必须把所有的数据都放入缓存中才能用,但是缓存是非常小的,它存在于内存中,所以把所有的数据都放入内存中就不合适。
增加了多线程,则有更高的吞吐量来读取数据,所以需要加缓存来提高速度。
尺寸太小说明数据就比较小,则可以添加缓存来省下 I/O 读取数据的时间。
有大量访问(高并发),就需要加缓存来提高性能,之后去缓存中读数据。
10.
如题,取指定序号,可以看作是根据下标来找数据,所以用顺序表速度最快。
编程题
1. 养兔子
兔子生娃就是斐波那契问题,画天数图兔子的生存情况就行,如下图:
我们可以先把范围内的斐波那契数给算出来,然后输出的时候再从数组中取即可。
代码实现:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
long[] fib = new long[91];
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < fib.length; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
System.out.println(fib[n]);
}
}
}
2. 收件人列表
如图,这个很简单,看例子 1,先给你一个数字 n,接下来会出现 n 个名字,如果名字里有空格或者逗号,这个名字就需要用双引号括起来输出,如果没有的话就正常正常输出名字,让你返回一串处理好的名字。
思路就是直接遍历你的名字数组,用 String 自带的 contains 方法看看字符串里有没有空格或者逗号,如果有,那就输出用双引号把名字括起来后输出,如果没有就正常输出名字,然后判断下标是不是 n - 1,如果不是,那就输出逗号和空格即可。
代码实现:
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
in.nextLine();// 处理回车和空格
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextLine();
}
// System.out.println(Arrays.toString(arr));
print(n, arr);
}
}
public static void print(int n, String[] arr) {
for (int i = 0; i < arr.length; i++) {
String str = arr[i];
if (str.contains(" ") || str.contains(",")) {
System.out.print("\"" + str + "\"");
} else {
System.out.print(str);
}
if (i != n - 1) {
System.out.print(", ");
}
}
System.out.println();
}
}