笔试强训day35

一、选择题

1、在支持多线程的系统中,进程P创建的若干个线程不能共享的是( )。
A 进程 P 的代码段
B 进程 P 中打开的文件
C 进程 P 的全局变量
D 进程 P 中某线程的栈指针
他的回答: A (错误)
正确答案: D
A、B、C线程共有,D线程私有。
2、操作系统中关于竞争和死锁的关系下面描述正确的是?
A 竞争一定会导致死锁
B 死锁一定由竞争引起
C 竞争可能引起死锁
D 预防死锁可以防止竞争
他的回答: C (正确)
正确答案: C
死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
3、并发是并行的不同表述,其原理相同。
A 错
B 对
他的回答: A (正确)
正确答案: A
并发:多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。
4、线程的切换会引起进程的切换。
A 错
B 对
他的回答: A (正确)
正确答案: A
一个进程也可能包含多个线程,对于同一个进程中的线程间切换,不会引起进程切换;不同进程中的线程切换会导致进程切换。
5、操作系统的所有程序是常驻内存的。
A 错
B 对
他的回答: B (错误)
正确答案: A
对于正在等待事件的进程,可以将其换出外存(部分或全部),以空出更多地内存加载新的进程,使CPU资源充分被利用。
6、把逻辑地址转换程物理地址称为()。
A 地址分配
B 地址映射
C 地址保护
D 地址越界
他的回答: A (错误)
正确答案: B
B.地址映射:为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址
7、在Unix系统中,处于()状态的进程最容易被执行。
A 辅存睡眠
B 内存睡眠
C 内存就绪
D 辅存就绪
他的回答: C (正确)
正确答案: C
在这里插入图片描述

8、进程的控制信息和描述信息存放在()。
A JCB
B PCB
C AFT
D SFT
他的回答: B (正确)
正确答案:C
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
PCB一般包括:
1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字。
2.特征信息:一般分系统进程、用户进程、或者内核进程等。
3.进程状态:运行,就绪,阳塞,表示进程现的运行情况。
4.优先级:表示获得CPU控制权的优先级大小。
5.通信信息:讲程之间的通信关系的反映,中干操作系统会提供通信信道。
6,现场保护区:保护阳塞的进程用。
7.资源需求、分配控制信息。
8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中。
9.其他信息:工作单位,工作区,文件信息等。
9、在()情况下,系统出现死锁。
A 若干进程因竞争资源而无休止地相互等待对方释放已占有的资源
B 有多个封锁的进程同时存在
C 计算机系统发生重大故障
D 资源数大大小于进程数或进程同时申请的资源数大大超过资源总数
他的回答: A (正确)
正确答案: A
死锁是两个进程或者线程都在相互等待对方释放资源,互不相让,就造成了死锁。
10、当系统发生抖动(thrashing)时,可以采取的有效措施是( )。
Ⅰ.撤销部分进程 Ⅱ.增加磁盘交换区的容量 Ⅲ.提高用户进程的优先级
A 仅Ⅰ
B 仅Ⅱ
C 仅Ⅲ
D 仅Ⅰ, Ⅱ
他的回答: D (错误)
正确答案: A
在具有对换功能的操作系统中,通常把外存分为文件区和对换区。前者用于存放文件,后者用于存放从内存换出的进程。
抖动现象是指刚刚被换出的页很快又要被访问。为此,又要换出其他页,而该页又快被访问,如此频繁地置换页面,以致大部分时间都花在页面置换上。
I,撤销部分进程可以减少所要用到的页面数,防止抖动。
Ⅱ和Ⅲ,对换区大小和进程优先级都与抖动无关。

二、编程题

【年会抽奖】
今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:

  1. 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;
  2. 待所有字条加入完毕,每人从箱中取一个字条;
  3. 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
    现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?
    输入描述:
    输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。
    输出描述:
    对应每一组数据,以“xx.xx%”的格式输出发生无人获奖的概率。
    示例1:
    输入
    2
    输出
    50.00%

【题目解析】:
错排问题举例:
用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作D(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类:

b装入A里,这时每种错装的其余部分都与A、B、a、b无关,应有D(n-2)种错装法。

b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的)n-1份信纸b、c……装入(除B以外的)n-1个信封A、C……,显然这时装错的方法有D(n-1)种。
总之在a装入B的错误之下,共有错装法D(n-2)+D(n-1)种。

a装入C,装入D……的n-2种错误之下,同样都有D(n-1)+D(n-2)种错装法,因此D(n)=(n-1)[D(n-1)+D(n-2)]
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.

【解题思路】:
错排的递推公式是:D(n) = (n - 1) [D(n - 2) + D(n - 1)],也就是第n项为n - 1倍的前两项和。通过这个递推公式可以得到在总数为n的时候,错排的可能性一共有多少种。那么要求错排的概率,我们还需要另一个数值,就是当总数为n的时候,所有的排列组合一共有多少种,那么根据排列组合,肯定是使用的公式来求,也就是n的阶乘。所以结果很简单,就是用公式求出第n项的错排种类,和n的阶乘,然后两者一除,就是概率了。

牛客网ACM模式代码

import java.util.*;
public class Main{
    public static void main(String[] args){
        long d[]=new long[21];// 错排数据
        d[0]=d[1]=0;
        d[2]=1;
        long f[]=new long[21];// 阶乘
        f[0]=f[1]=1;
        f[2]=2;
        // 算N错排数据和阶乘
        for(int i = 3; i <= 20; ++i){
            d[i] = (i-1) * (d[i-1] + d[i-2]);
            f[i] = i * f[i-1];
        }
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            System.out.printf("%.2f%%\n", 100.0*d[n]/f[n]);
        }
    }
}

【抄送列表】
NowCoder每天要处理许多邮件,但他并不是在收件人列表中,有时候只是被抄送。他认为这些抄送的邮件重要性比自己在收件人列表里的邮件低,因此他要过滤掉这些次要的邮件,优先处理重要的邮件。
现在给你一串抄送列表,请你判断目标用户是否在抄送列表中。
输入描述:
输入有多组数据,每组数据有两行。
第一行抄送列表,姓名之间用一个逗号隔开。如果姓名中包含空格或逗号,则姓名包含在双引号里。总长度不超过512个字符。
第二行只包含一个姓名,是待查找的用户的名字(姓名要完全匹配)。长度不超过16个字符。
输出描述:
如果第二行的名字出现在收件人列表中,则输出“Ignore”,表示这封邮件不重要;否则,输出“Important!”,表示这封邮件需要被优先处理。

示例1:
输入
Joe,Kewell,Leon\nJoe\n"Letendre, Bruce",Joe,“Quan, William”\nWilliam
输出
Ignore\nImportant!

【解题思路】:

  1. 通过Scanner的nextLine()方法获取第一行中的名字
  2. 解析出第一行中的所有名字保存在HashSet中
  3. 获取第二行中的名字,检测该名字是否存在,并按照题目的要求进行输出

牛客网ACM模式代码

import java.util.*;
public class Main{
    public static void main(String[] args){
        // 循环处理每组测试用例
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
        // 接收第一行的所有名字,并对名字进行分割,将分割好的名字放在Set
            String name = sc.nextLine();
            int i = 0;
            int end = 0;
            Set<String> s = new HashSet<>();
            while(i < name.length()){
                if('\"' == name.charAt(i)){
            // 名字包含在""中
                    end = name.indexOf('\"', i + 1);
                    s.add(name.substring(i+1, end)); // 参数1:起始位置 参数2:表示末尾位置---注
            //意:该位置的字符不会被截取到,截取到该位置之前的字符
                    i = end + 2;
                }else{
            // 名字没有包含在""中
                    end = name.indexOf(',', i+1);
                    if(-1 == end){
            // 现在要分割的名字是最后一个名字
                        s.add(name.substring(i, name.length()));
                        break;
                    }
                    name.substring(i, end);
                    i = end + 1;
                 }
              }
            // 获取第二行的名字并检测该名字是否在Set中存在
            name = sc.nextLine();
            if(s.contains(name)){
                System.out.println("Ignore");
            }else{
                System.out.println("Important!");
            }
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值