目录
选择题
1.
若文件的数据不在内存中,则进程进入睡眠模式的目的是等待内存对磁盘上文件的映射,因为磁盘的读取比较慢所以是进入睡眠模式。
read 是系统调用,所以 CPU 从用户态切换到核心态。
open 系统调用应该包含文件的名称,read 只是包含输入流。
2.
3.
写锁加锁时,其他线程不能再进行读操作(申请加读锁),写操作(申请加写锁),也就是写写互斥,读写互斥。
读锁加锁时,其他线程还能进行读操作,也就是读读并发。
4.
5.
饥饿现象:低优先级的进程被高优先级的进程抢占,低优先级进程一直不能执行,就导致低优先级进程饥饿的情况。
先来先服务(FCFS):按照先后顺序进行调度。
高响应比优先(HRRN):综合考虑作业/进程的等待时间和要求服务的时间,在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。
高响应比优先调度算法是介于先来先服务算法与短作业优先算法之间的折中算法,既考虑作业等待时间又考虑作业运行时间,既照顾短作业又不使长作业等待时间过长,改进了调度性能。
时间片轮转调度(RR):用于分时系统中的进程调度,每次调度时,总是选择就绪队列的队首进程,让其在 CPU 上运行一个系统预先设置好的时间片,一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。
短作业优先(SJF):SJF 是非抢占式的算法。最短的作业/进程优先得到服务(所谓最短,是指要求服务时间最短),系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直进行下去,直至完成,容易造成饥饿。
6.
B:进入就绪队列时,优先级已经设置好了,此时再降低优先级也不能得到系统的更新。
C:进程持久处于就绪队列,因为已经持久处于就绪队列了,还降低优先级那就更得不到执行了,所以应该是提高优先级才对。
D:进程在运行态时,已经不会去管理优先级了。
7.
活跃度问题指的是线程或进程长时间得不到 CPU 占用。
死锁指的是两个线程间互相持有锁,都在等对方释放资源,结果谁也得不到执行。
饥饿是指优先级高的进程抢占优先级低的进程,优先级高的进程一直占有,优先级低的进程得不到执行。
活锁是指任务或执行者没有被阻塞,但是由于某些条件没满足,导致一直重复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断地改变状态,而死锁的实体表现为等待,活锁有可能自行解开,而死锁绝对不可能解开。
8.
先来先服务按照时间顺序,等待时间最长,那就最先调度。
高优先权优先调度法:优先级高的任务进入系统后就能得到优先处理。
9.
父进程和子进程都有自己独立的地址空间。
主线程和子线程是并行关系的时候,并没有依赖关系,改变父进程的状态,如果没有任何通知,就不会影响到子进程,如果有通知,则可以影响到子进程。
如果多个进程同时占有对方需要的资源且同时请求对方的资源,而它们在得道请求之前不会释放所占有的资源,那么就会导致死锁的发生,也就是进程不能实现同步。
编程题
1. 剪花布条
代码实现:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
String s = in.next();
String t = in.next();
print(s, t);
}
}
public static void print(String s, String t) {
int count = 0;
while (s.length() >= t.length()) {
int index = s.indexOf(t);
if (index == -1) {
// 说明 s 中没有 t,直接 break
break;
} else {
count++;
// 将 t 从 s 中删除
s = s.substring(index + t.length());
}
}
System.out.println(count);
}
}
2. 客似云来
很明显,1,1,2,3,5 是斐波那契数,所以可以先求出第 1 到第 80 个斐波那契数,然后再来计算第 from 个 到第 to 个的斐波那契数的和即可。
代码实现:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
long[] fib = new long[81];
fib[1] = 1;
fib[2] = 1;
for (int i = 3; 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 from = in.nextInt();
int to = in.nextInt();
long sum = 0;
for (int i = from; i <= to; i++) {
sum += fib[i];
}
System.out.println(sum);
}
}
}