一些基础知识

时间:2022-12-09 19:29:33

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个元素到另一个空队列,弹出非空队列的最后一个元素。

如果再入栈,则直接插入非空队列。