笔试强训day33

一、选择题

1、若一个用户进程通过read 系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( )。
Ⅰ. 若该文件的数据不在内存中,则该进程进入睡眠等待状态
Ⅱ. 请求 read 系统调用会导致 CPU 从用户态切换到核心态
Ⅲ. read 系统调用的参数应包含文件的名称
A 仅Ⅰ、 Ⅱ
B 仅Ⅰ、 Ⅲ
C 仅Ⅱ、 Ⅲ
D Ⅰ、 Ⅱ和Ⅲ
他的回答: C (错误)
正确答案:A
I,若文件的数据不在内存中,则进程进入睡眠模式的目的是等待内存对磁盘上文件的映射,因为磁盘的读取比较慢,所以事进入睡眠模式。
Ⅱ,read是系统调用,所以CPU从用户态切换到核心态。
Ⅲ.open系统调用应该包含文件的名称,read只是包含输入流。
2、Linux文件权限一共10位长度,分成四段,第三段表示的内容是()?
A 文件类型
B 文件所有者的权限
C 文件所有者所在组的权限
D 其他用户的权限
他的回答: A (错误)
正确答案: C
笔试强训day33_第1张图片

3、关于读写锁的描述,以下正确的是()
A 在任何时刻,获得锁权限的线程只有一个
B 读写锁可以同时存在读者和写者
C 读写锁在写加锁状态时,其他进行写操作线程不会阻塞,一直循环查询读写锁是否可用
D 读写锁在读加锁的状态下,可用进行读共享
他的回答: A (错误)
正确答案: D
读写锁的特性为:
写锁加锁时,其他线程不能再进行读操作(申请加读锁),写操作(申请加写锁),也就是写写互斥,读写互斥。
读锁加锁时,其他线程还能进行读操作,也就是读读并发。
4、进程阻塞的原因不包括________。
A 时间片切换
B 等待I/O
C 进程sleep
D 等待解锁
他的回答: A (正确)
正确答案: A
参考答案:
解析:进程有3个状态:就绪态。执行态、阻塞态。三种状态的转换包含有:
就绪->执行,执行->就绪,执行->阻塞,阻塞->就绪等待I/O、进程sleep、等待解锁等原因都会导致进程暂停。关于"时间片切换",当进程已经获得了除cpu外所有的资源,这时的状态就是就绪态,当分配到了时间片就成了执行态,当时间片用完之前一直未进入阻塞态的话,此后便继续进入就绪态。所以进程的就绪与阻塞是完全不同的。
答案:A
5、在缺页处理过程中,操作系统执行的操作可能是()。
Ⅰ.修改页表 Ⅱ.磁盘 I/O Ⅲ.分配页框
A 仅Ⅰ、 Ⅱ
B 仅Ⅱ
C 仅Ⅲ
D Ⅰ、 Ⅱ和Ⅲ
他的回答: D (正确)
正确答案: D
缺页
是引入了虚拟内存后的一个概念。操作系统启动后,在内存中维护着一个虚拟地址表,进程需要的虚拟地址在虚拟地址表中记录。一个程序被加载运行时,只是加载了很少的一部分到内存,另外一部分在需要时再从磁盘载入。
加载到内存的部分标识为“驻留”,而未被加载到内存的部分标为“未驻留”。操作系统根据需要读取虚拟地址表。如果读到虚拟地址表中记录的地址被标为“未驻留”,表示这部分地址记录的程序代码未被加载到内存,需要从磁盘读入,则这种情况就表示"缺页"。
页框
CPU中添加了能自动把虚拟内存(即逻辑地址)地址转化为物理内存地址的电路,为了简化这种电路,就把 RAM划分为长度为4KB或8KB的块,这种块就叫页框。
内核以页框为基本单位管理物理内存,分页单元中,页指一组数据,而存放这组数据的物理内存就是页框,当这组数据被释放后,若有其他数据请求访问此内存,那么页框中的页将会改变。
6、下面选项中,满足短任务优先且不会发生饥饿现象的调度算法是()。
A 先来先服务
B 高响应比优先
C 时间片轮转
D 非抢占式短任务优先
他的回答: A (错误)
正确答案: B
先来先服务(FCFSFirst Come First Serve)
最简单的调度算法,按先后顺序进行调度。

高响应比优先(HRRNHighest ResponseRatioNext)
综合考虑作业/讲程的等待时间和要求服务的时间,在每次调度时先计算各个作业/进程的响应出,选择响应以最高的作业/进程为其服务。
高响应比优先调度算法是介于FCFS(先来先服务算法)与SIF(短作业优先算法)之间的折中算法,既考虑作业等待时间又考虑作业运行时间,既照顾短作业又不使长作业等待时间过长,改进了调度性能。
响应比=(等待时间+要求服务时间)/要求服务时间

时间片轮转调度(Round-Robin,RR)
用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。

短作业优先(S]F,shortest|ob First)
SIF是非抢占式的算法。最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成。容易造成饥饿。
7、下列选项中,降低进程优先级的合理 时机 是()
A 进程的时间片用完
B 进程刚完成I/O,进入就绪列队
C 进程持久处于就绪列队
D 进程从就绪状态转为运行态
他的回答: B (错误)
正确答案: A
8、在使用锁保证线程安全时,可能会出现活跃度失败的情况,活跃度失败主要包括
A 死锁
B 饥饿
C 活锁
D 以上全部
他的回答: A (错误)
正确答案: D
活跃度问题是指线程或进程长时间得不到cpu占用。
A.死锁:线程间互相持有锁,并等待对方释放资源,结果谁也得不到执行。
B.饥饿:如每次都执行优先级高的线程,那么优先级低的可能永远执行不到。
C.活锁:活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
9、选择排队作业中等待时间最长的作业优先调度,该调度算法是()。
A 先来先服务调度算法
B 高响应比优先调度算法
C 优先权调度算法
D 短作业优先调度算法
他的回答: A (正确)
正确答案: A
先来先服务(FCFSFirst Come FirstServe)
最简单的调度算法,按先后顺序进行调度。
高响应比优先(HRRNHighest ResponseRatio Next)
综合考虑作业/进程的等待时间和要求服务的时间,在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。
高优先权优先调度算法
指紧迫型作业(优先级高的任务)进入系统后能得到优先处理。
短作业优先(SJF,ShortestJob First)
SF是非抢占式的算法。最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
10、对进程和线程的描述,以下正确的是()
A 父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间
B 改变进程里面主线程的状态会影响到其他线程的行为,改变父进程的状态不会影响到其他子进程
C 多线程会引起死锁,而多进程不会
D 以上选项都不正确
他的回答: C (错误)
正确答案: D
A.父进程和子进程都有自己独立的地址空间;
B.主线程和子线程是并行关系的时候,并没有依赖关系。改变父进程的状态,比如父进程退出的同时,通知子进程退出,那么就可以影响到子进程状态,如果没有任何通知,就不会影响到子进程。
C.如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的发生,也就是进程不能实现同步。

二、编程题

【剪花布条】
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小
饰条来呢?
输入描述:
输入包含多组数据。
每组数据包含两个字符串s,t,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。
花纹条和小饰条不会超过1000个字符长。
输出描述:
对应每组输入,输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就输出0,每个结果占一行。
示例1:
输入
abcde a3\naaaaaa aa
输出
0\n3

【解题思路】:
C语言可以通过strstr函数找,用STL的string库可以通过find函数找,找到以后跳过一个T串的长度。例如:在abcacbcbcabscbc中找cbc,第一次找到了这个位置:abcacbcbcabscbc,找到这个下标后,会跳过整体cbc,也就是从这个位置继续找:abcacbcbcabscbc,否则如果你只跳一个字符,会导致cbcbc会被算成2次,而按照本题的题意,应该算一次。

牛客网ACM模式代码

import java.util.*;
public class Main {
     public static void main(String[] args){
         Scanner sc=new Scanner(System.in);
         while(sc.hasNext()){
             String s=sc.next();
             String t=sc.next();
             int count=cut(s,t);
             System.out.println(count);
         }
     }
    public static int cut(String s,String t){
        int i=s.indexOf(t);
        if(i==-1){
            return 0;
        }
        return 1+cut(s.substring(i+t.length()),t);
    }
}

【客似云来】
NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来;并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝。
于是,这家店的客人从最初一个人发展成浩浩荡荡成百上千人:1、1、2、3、5……
现在,NowCoder想请你帮忙统计一下,某一段时间范围那他总共卖出多少份早餐(假设每位客人只吃一份早餐)。
输入描述:
测试数据包括多组。
每组数据包含两个整数from和to(1≤from≤to≤80),分别代表开店的第from天和第to天。
输出描述:
对应每一组输入,输出从from到to这些天里(包含from和to两天),需要做多少份早餐。

【解题思路】:
老样子,先准备好斐波那契的数组,然后遍历那一段数组,求出他们的和即可。而第80项斐波那契数列是一个17位数,所以需要用long long来解决问题。
然而这个题还有另一个更有意思的思路。斐波那契数列的的前n项和其实是有一个很有意思的公式,斐波那契数列的前n项和,就是第n+2项的值减1,例如前10项的和143,就是第12项的144 - 1的结果。所以,我们如果我们要第n项到第m项的和,那么只要求出前m项的和,减去前n - 1项的和,就能得到结果了。例如要求第3项到第5项的和,我们就只需要用前5项的和减去前2项的和,而公式中的减一在这个过程中抵消掉了,也就是结果直接就是第7项的值减去第4项的值,这样我们在操作的时候就更简单了。就数值而言,第7项是13,第4项是3,差值是10,而2+3+5也是10,结果是正确的。

牛客网ACM模式代码

import java.util.*;
public class Main {
     public static void main(String[] args){
         long[] fib=new long[80];
         fib[0]=1;
         fib[1]=1;
         for(int i=2;i<80;i++){
             fib[i]=fib[i-1]+fib[i-2];
         }
         Scanner sc=new Scanner(System.in);
         while(sc.hasNextInt()){
             int from=sc.nextInt();
             int to=sc.nextInt();
             long count=0;
             for(int i=from-1;i<to;i++){
                count+=fib[i];  
             }
             System.out.println(count);
         }
     }       
}

你可能感兴趣的:(笔试强训,java,开发语言)