1 static关键字作用
修饰局部变量
static修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在main函数之前初始化,在程序退出时销毁。(无论是局部静态还是全局静态)
修饰全局变量
全局变量本来就存储在静态区,因此static并不能改变其存储位置。但是,static限制了其链接属性。被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)。
修饰函数
static修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数,声明和定义需要放在同一个文件夹中。
修饰成员变量
用static修饰类的数据成员使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象,所有的对象都只维持同一个实例。 因此,static成员必须在类外进行初始化(初始化格式:int base::var=5;),而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化。
修饰成员函数
用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针,因而只能访问类的static成员变量。静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。例如可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好。
最重要的特性:隐藏
当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。
2 涉及Linux系统调用
3 协议
4 在请求分页存储管理中,当访问的页面不在内存时,便产生缺页中断,缺页中断是属于()。
I/O中断
程序中断
访管中断
外中断
中断类型分为如下两大类:
一、强迫性中断:正在运行的程序所不期望的,来自硬件故障或外部请求。
1、I/O 中断:来自外部设备通道;
2、程序性中断:运行程序本身的中断,如 溢出、缺页中断、缺段中断、地址越界。
3、时钟中断
4、控制台中断
5、硬件故障
二、自愿性中断:用户在编程时要求操作系统提供的服务,使用访管指令或系统调用使中断发生。也称为访管中断。包括执行I/O,创建进程,分配内存,信号量操作,发送/接收消息。
5 红黑树
- 节点是红色或黑色。
- 根是黑色。
- 所有叶子都是黑色(叶子是NIL节点)。
- 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。
6 中断服务函数
中断处理函数的返回值和形参
中断处理函数不能有返回值和形参,因为中断处理函数都是硬件调用(或者叫触发),没有程序给它传递参数,也没有程序接收它的返回值,其参数的传递通过全局变量的方式。
但是要注意,如果在中断服务函数中改变了供其他函数检测的全局变量的值,要使用volatile关键字定义该全局变量。因为主程序可能将该变量读取到寄存器中,以后每次只使用寄存器中的变量副本,这时候通过不使用volatile关键字,会导致中断服务函数中修改该变量的操作被短路。
为什么中断处理函数中不能出现阻塞
1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个task_struct(这点对于softirq和tasklet一样),因此真的休眠了,比如调用了会导致block的例程,内核几乎肯定会死
2、schedule()在切换进程时,保存当前的进程上下文(CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文(在调用中断处理程序后恢复);但在中断处理程序里,CPU寄存器的值肯定已经变化了吧(最重要的程序计数器PC、堆栈SP等),如果此时因为睡眠或阻塞操作调用了schedule(),则保存的进程上下文就不是当前的进程context了.所以不可以在中断处理程序中调用schedule()。
3、中断处理程序是带便进程执行的,它所代表的进程必须总处理TASK_RUNNING状态。当一个中断处理程序正在运行时,他所代表的IRQ线上发出的信号就会暂时被忽略
4、同样也是为了实现中断嵌套进行所付出的代价,如果要保证可以中断嵌套,就中断处理程序必须永不阻塞。
7 关于信号量描述错误的为
信号量只能在线程之间共享
不允许销毁一个正在等待的信号量
用户态使用的信号量分为POSIX信号量和SYSTEM V信号量
信号量有两种基本操作:V操作,信号量加1;P操作,信号量减1(如果信号量为0,则阻塞)
Linux 内核中的信号量使用和用户态的信号量使用有所不同,
1、内核信号量,由内核控制路径使用。
2、用户态信号量分为两种,一种为POSIX,另一种为 SYSTEM V
8 进程和线程的描述正确
每个线程拥有自己的堆栈和局部变量
线程是程序执行的最小单位
进程有独立的地址空间,而线程没有
9 在程序执行过程中,该程序的某一个函数func()中申请的static型变量V有以下哪些特性
V仅能被func()使用
V存在于整个程序执行过程
10 能在Linux内核态执行的是
进程调度
缺页异常
时钟中断
11 主存与cache的地址映射方式有全相联方式、直接方式和组相联方式三种
12 Linux进程间通信方试中,如下哪一种最常用且最高效?
为什么共享内存最高效?
消息队列和管道基本上都是4次拷贝,而共享内存(mmap, shmget)只有两次。
4次:1,由用户空间的buf中将数据拷贝到内核中。2,内核将数据拷贝到内存中。3,内存到内核。4,内核到用户空间的buf;
2次: 1,用户空间到内存。 2,内存到用户空间。