把逻辑地址转变为内存的物理地址的过程称为重定位。
操作系统给每一个程序(进程)分配一个虚拟地址空间,虚拟地址空间映射到磁盘,用到对应数据时再拷贝到内存中并建立虚拟地址和内存地址间关联的页表。所以不是常驻内存的。
发生“抖动”的根本原因是:
同时在系统中运行的进程太多 ,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。
太多的话, 最直接有效的方法当然是撤销部分进程。
1、抖动是什么?
如果分配给进程的存储块数量小于进程所需要的最小值,进程的运行将很频繁地产生缺页中断,这种频率非常高的页面置换现象称为抖动。
2、系统抖动:是指刚被调出的页又立即被调入所形成的频繁调入调出的现象。
3、原因:置换算法选择不当
4、解决办法:优化置换算法;减少进程数;增大内存
并发是同时执行不过微观上是串行的,并行是同时执行,但是是不同的处理器执行,网上有个例子是说并发是一个馒头喂两个人,并行是两个馒头喂两个人。
JCB: Job Control Block:作业控制块
PCB: Process Control Block:进程控制块
内存就绪就是活动就绪,辅存就绪是静止就绪,静止就绪需要转换到活动就绪,才能在时间片到来而进入到运行状态。
同一进程间的线程共享的资源有:
a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
d. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源有:
a. 栈 栈是独享的
b. 寄存器 这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC
线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:
1. 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;
2. 待所有字条加入完毕,每人从箱中取一个字条;
3. 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?输入描述:
输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。输出描述:
对应每一组数据,以“xx.xx%”的格式输出发生无人获奖的概率。示例1
输入
2输出
50.00%
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
//2<=n<=20
int n = scanner.nextInt();
//n的阶乘就是分母
float mom = denominator(n);
//错排算法 求分子
float child = numerator(n);
float ret=(child/mom)*100;
//System.out.println(ret+"%");
System.out.println(String.format("%.2f", ret) + "%");
}
}
/**
* 错排算法 求分子 : f(n) = (n-1)[f(n-2)+f(n-1)] (n>2)
*
* @param n
* @return
*/
private static float numerator(int n) {
if(n==1){
return 0;
}else
if(n==2){
return 1;
}else
return (n-1)*(numerator(n-1)+numerator(n-2));
}
/**
* n的阶乘
*
* @param n
* @return
*/
private static float denominator(int n) {
if(n==1){
return 1;
}
return n*denominator(n-1);
}
}
NowCoder每天要处理许多邮件,但他并不是在收件人列表中,有时候只是被抄送。他认为这些抄送的邮件重要性比自己在收件人列表里的邮件低,因此他要过滤掉这些次要的邮件,优先处理重要的邮件。
现在给你一串抄送列表,请你判断目标用户是否在抄送列表中。输入描述:
输入有多组数据,每组数据有两行。 第一行抄送列表,姓名之间用一个逗号隔开。如果姓名中包含空格或逗号,则姓名包含在双引号里。总长度不超过512个字符。 第二行只包含一个姓名,是待查找的用户的名字(姓名要完全匹配)。长度不超过16个字符。输出描述:
如果第二行的名字出现在收件人列表中,则输出“Ignore”,表示这封邮件不重要;否则,输出“Important!”,表示这封邮件需要被优先处理。示例1
输入
Joe,Kewell,Leon Joe "Letendre, Bruce",Joe,"Quan, William" William输出
Ignore Important!
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()) {
String str = scanner.nextLine();
String cur = scanner.nextLine();
ArrayList list = new ArrayList();
for (int i = 0; i < str.length(); i++) {
String ret = "";
char c = str.charAt(i);
if (c == '"') {
i++;
while (i < str.length() && str.charAt(i) != '"') {
ret += str.charAt(i);
i++;
}
} else if (c == ',') {
i++;
if(str.charAt(i) == '"'){
i++;
while (i < str.length() && str.charAt(i) != '"') {
ret += str.charAt(i);
i++;
}
}else {
while (i < str.length() && str.charAt(i) != ',') {
ret += str.charAt(i);
i++;
}
}
} else {
while (i < str.length() && str.charAt(i) != ',') {
ret += str.charAt(i);
i++;
}
}
list.add(ret);
}
if (list.contains(cur)) {
System.out.println("Ignore");
} else {
System.out.println("Important!");
}
}
}
}