1、函数调用过程
2、系统调用过程
系统调用本质上是应用程序请求OS内核完成某功能时的一种过程调用,但它是一种特殊的过程调用,它与一般的过程调用有下述几方面的明显差别(《计算机操作系统》汤小丹,梁红兵):
(1)运行在不同状态。调用程序运行在用户态,被调用程序运行在系统态。
(2)状态转换通过软中断进入。先由用户态转换为系统态,经核心分析后,才能转向相应的系统调用处理子程序(例程)。(模式切换,current指针还是指向当前运行的进程)
(3)返回问题。采用了抢占式调度方式的系统中,在被调程序执行完成后,要对系统中所有要求运行的进程做优先权分析。当调用进程任然有最高优先级时,才返回到调用进程继续执行;否则,将引起重新调度。此时,将把调用进程放入就绪队列。
(4)嵌套调用。
下面图是盗来的,地址在这里,里面讲的Linux系统调用过程个人觉得还是不错的。
3、进程(线程)上下文切换
上下文切换和模式切换定义和区别,网上可能有好几个版本的说法,但是这个我觉得挺靠谱,http://www.linfo.org/上的资源。
4、java内存模型
5、java nio系列
6、两个概念:
Cache:高速缓存(一级,二级)
Buffer:磁盘缓冲区(在内存中开辟的用于缓冲低速设备的数据)
Linux系统中free命令显示的buffer和cache的概念:
buffer:作为buffer cache的内存,是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区。
cache:作为page cache的内存, 文件系统的cache,是memory的缓冲区。如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。
7、简单malloc和free库函数的实现
在这里。这只是简单的实现,帮助了解通用的malloc和free的实现,专业点的请看glibc中的malloc和free。
8、Auth2授权机制
9、git远程操作指南
10、select、poll、epoll详解
11、二叉树三种遍历的递归和非递归实现
一、计算树的高度
int calcHeight(Node root){
if (root == null){
return 0;
}
if (root.left == null && root.right == null){
return 1;
}
int leftHeight = calcHeight(root.left);
int rightHeight = calcHeight(root.right);
if (leftHeight > rightHeight ){
return leftHeight + 1;
}
return rightHeight +1;
}
12、java发生类初始化的情况
1、使用new实例化一个对象,读取或者设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,调用一个类的静态方法的时候。
(通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。)
2、使用reflect包的方法对类进行反射调用的时候,如果类没有初始化,则先触发初始化。
3、初始化一个类时,如果父类还未初始化则先触发父类的初始化。
4、虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个类。
类加载的准备阶段:对被static修饰的类变量分配内存并初始化为数据类型的零值。
类加载的初始化阶段(是类加载的最后一步,到了初始化阶段才真正开始执行类定义中的java程序代码(字节码))
13、java单例模式详解
14、用两个栈来实现队列和用两个队列来实现栈
1、两个栈实现队列
假设有两个栈s1,s2,开始都为空。
第一步:入队列的时候先压入s1。
第二步:出队列的时候先判断s2是否为空,如果为空则弹出s1中s1.size-1个元素到s2中,弹出s1中最后一个元素最为出队列的元素。
若不为空,则直接从s2中弹出一个元素作为出队列的元素。
2、两个队列实现栈
假设有两个队列q1,q2,开始都为空。
第一步:入栈操作,若q1,q2都为空,则进q1
第二步:出栈时选择一个非空队列出queue.size-1个元素到另一个空队列,弹出非空队列的最后一个元素。
如果再入栈,则直接插入非空队列。