在Intel i386 CPU中,提供了TSS与TR用于任务切换,但是Linux出于效率的考虑自己实现了任务切换。但Linux内核还是使用了TSS,用于完成系统堆栈空间的自动切换(从用户空间进入系统空间时的堆栈切换)。 进程调度与切换 三种不同应用的需求:交互式,批处理,实时 调度政策:内核为系统中 ...
分类:
系统相关 时间:
2020-04-30 17:25:02
阅读次数:
79
栈迁移 当我们的rop链过长时很可能栈空间不够,并且ebp之前的空间其实只是填充一些没什么用的数据 栈迁移机理 与传统的pop_ret类似,利用level_ret实现栈的迁移,都是寻找很小短的零碎代码,进行拼接,和拼积木很像。 level ret//拆解 mov ebp,esp//esp跟着ebp走 ...
分类:
其他好文 时间:
2020-04-30 13:27:11
阅读次数:
109
算法 第八章 Morris遍历/搜索二叉树/跳表等(完结) Morris遍历 + Morris遍历实现二叉树的先中后序遍历,时间复杂度O(n), 额外空间复杂度O(1) + 如果使用递归/非递归版本都是使用栈来完成二叉树遍历,因为只有指向子指针没有指向父指针,有额外的栈空间。 + Morris遍历实 ...
分类:
编程语言 时间:
2020-04-21 18:52:39
阅读次数:
92
哪些变量是局部变量? 方法体中定义的 变量 和 方法的 形式参数(方法声明中) 局部变量和成员变量的比较: 1. 在类中定义的位置不同 2. 在内存中的位置不同 局部变量: 存储在,方法对应栈空间的栈帧中的 成员变量: 存储在,堆空间中的对象的存储空间中 3. 生命周期不同 局部变量: 随着栈帧的创 ...
分类:
其他好文 时间:
2020-04-06 20:28:00
阅读次数:
60
Go 协程,可以理解成轻量级的协程 Go主线程,一个主线程可以起多个协程 Go协程的特点: 有独立的栈空间 共享程序堆空间 调度由用户控制 package main import( "fmt" "time" ) func SayHello(){ for i:=0;i< 5;i++{ fmt.Prin ...
分类:
其他好文 时间:
2020-04-05 16:58:25
阅读次数:
84
1、反转链表 "力扣地址" 实现方法一:三指针遍历,pre+cur+next;时间复杂度O(n),空间复杂度O(1)。 实现方法二:递归解法,1+ (reverse(2,3));时间复杂度O(n),空间复杂度O(n)(递归调用要占用系统栈空间)。 2、删除链表的节点 "力扣地址" 解法:增加dumm ...
分类:
编程语言 时间:
2020-04-05 13:47:46
阅读次数:
84
第二章主要学习的是线性表,其中包含了顺序表以及链表,顺序表有两种结构体定义,一种是指针,再申请相应数组空间,一种是直接定义数组,前者数组为堆空间,后者则为栈空间,如果数组长度过大,得考虑空间是否充足问题,因而前者适用性更好; 链表主要为单链表,循环链表,双向链表;主要涉及到删除、查找、插入等操作,在 ...
分类:
其他好文 时间:
2020-04-03 13:40:10
阅读次数:
70
1. JVM会先去方法区中寻找相应类的.class文件(即Person.class),若存在则加载到内存中(如果该类存在父类,则先加载父类),不存在则将相关.class加载到方法区中 2. 如果 p 定义在主方法中,则会在栈空间开辟一个变量空间 p 3. 在堆内存给对象分配空间 4. 对对象中的成员 ...
分类:
其他好文 时间:
2020-03-29 21:30:48
阅读次数:
101
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的 ...
分类:
编程语言 时间:
2020-03-29 17:52:47
阅读次数:
93
栈相关面试题 举例栈溢出的情况?(Stack Overflow):固定大小栈的栈帧爆掉 通过-Xss设置栈的大小:OOM ,可变大小栈扩容时,没有更多的内存可供扩容 调整栈大小,就能保证不溢出吗? 不能,如果自己调用自己(递归)的话,栈空间大可以多跑,在一定程度上可以抱保证递归类问题递的更深,死循环 ...
分类:
其他好文 时间:
2020-03-25 23:18:01
阅读次数:
73