day31_0530
选择题
可重入函数可认为是可以被中断的函数,自动变量定义的时候才被创建,函数返回时,系统回收空间,他是的是局部作用域变量,不需要互斥量。可重入函数对全局变量才需要互斥量保护。
执行1条语句约1ns即10的-9次方秒,1G=1024M=1024*1024k=1024*1024*1024byte,每次赋值1byte都要执行一次语句,故至少花费1024*1024*1024*10^-9=1.073741824s
线程的切换要比进程切换花费的时间少,
线程是系统调度的基本单位,进程是资源分配的基本单位
而 线程提高了不同的执行程序间通信的效率。在大多数操作系统中,独立进程间的通信需要内核的介入,以提供和保护通信所需要的机制。但是,由于在同一个进程中的线程共享内存和文件,它们无须调用内核就可以互相通信。--《操作系统精髓与设计原理》
死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
BigEndian指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中
LittleEndian是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中就是爸爸和儿子的关系;
最多有n-1个进程在等待
页面越大,其包含的指令和数据越多,页面数量就越少,每次新页面加载后到下次发生缺页的时间就更长,也就是缺页中断的次数越少。
编程题
美国节日
主要是要找到这年一月一号是星期几,因为它影响每月一号星期几,然后可以根据日历发现他们之间的规律;最后进一步算到第W个星期Q的日期。
public class AmericanFestival { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()) { int year = sc.nextInt(); System.out.println(year + "-01-01"); int X = 0; X = Monday(year, 1, 1);//1月1号的星期几 System.out.printf("%d-01-%02d\n", year, d1(X, 3, 1));//1月的第三个星期一 X = (X+3)%7==0?7:(X+3)%7;//2月1号的星期几 System.out.printf("%d-02-%02d\n", year, d1(X, 3, 1));//2月的第三个星期一 X = Monday(year, 6, 1); System.out.printf("%d-05-%02d\n", year, d2(X));//5月的最后一个星期一 System.out.printf("%d-07-04\n", year); X = (X+1)%7==0?7:(X+1)%7; System.out.printf("%d-09-%02d\n", year, d1(X, 1, 1));//9月的第一个星期一 X = (X+5)%7==0?7:(X+5)%7; System.out.printf("%d-11-%02d\n", year, d1(X, 4, 4));//11月的第四个星期四 System.out.printf("%d-12-25\n", year); System.out.println(); } } //这年已经过了多少天 private static final int[] mouth={31,28,31,30,31,30,31,31,30,31,30,31}; public static int YDay(int y,int m,int d){ int count =0; for (int i = 0; i <m-1 ; i++) { count+=mouth[i]; if(i==2&&leap(y)){ count++; } } return count+d ; } //计算从0000-12-31到Y-M-D一共隔的天数 public static int countDay(int y,int m,int d){ //以356为基础算的天数+闰年的个数+Y年已过的天数 //但是总天数最后要%7,而365=364+1=52*7+1,所以只需要算上那个1就好了,也就是过了多少年 // 所以(y-1)*365可以省略为(y-1) //能被4除的也能被100整除,但不是闰年,比如1500,所以减去(y-1)/100只算(y-1)/400的数 return (y-1)+(y-1)/4-(y-1)/100+(y-1)/400+YDay(y,m,d); } //第W个星期Q的日期 public static int d1(int X,int W,int Q){ return 1+(W-1)*7+(7-X+Q)%7; } //5月的最后一个星期一的日期 public static int d2(int X){ int d=(X==1?7:X-1); return 32-d; } //某年某月的一号是星期几 public static int Monday(int y,int m,int d){ int X=countDay(y,m,d)%7; if(X==0){ X=7; } return X; } //判断是否是闰年 public static boolean leap(int y){ if(y%100==0){ if(y%400==0){ return true; } return false; } if(y%4==0){ return true; } return false; } }
分解因数
import java.util.Scanner; public class Main{ static int[] arr=new int[100]; static int a=0; public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()) { int num = sc.nextInt(); int n = num; System.out.println(num + " = " + yinzi(n)); } } public static String yinzi (int num){ String str=""; for(int i=2;i<=Math.sqrt(num);i++){ while(num%i==0){ str+=i; if(i!=num/i){ str+="*"; }else { str+="*"+num/i; num/=i; } num/=i; } } if(num>1){ str+=num; } return str; } }