Docker基础学习
作用概述虚拟机的缺点
资源占用非常多
冗余步骤多
启动慢
容器化技术并不是模拟一个完整的操作系统,有以下区别:
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行应用
容器内的应用直接运行在宿主机的内核,容器没有自己的内核,也没有虚拟硬件,所以轻便
每个容器间互相隔离,每个容器内都有一个自己的文件系统,互不影响
DevOps(开发、运维)应用更快速的交付和部署传统:一堆帮助文档、安装程序Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容使用Docker可以简化部署应用,就跟搭积木一样
升级环环境时:用了docker可以将各种技术打包整体升级
扩展:项目被打包成一个镜像,可以直接从一个服务器迁移到另一个,直接运行
更简单的系统运维容器化后,开发测试环境高度一致
更高效的计算资源利用Docker是 内核级别的虚拟化,可以在一个物理机上可以运行很多个容器实例,可以极致地利用服务器性能
入门镜像与容器当利用docker安装应用时,docker会自动搜索并下载应用镜像(image)镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数 ...
CSAPP_Chapter7
本文章是观看学习B站up九曲阑干大佬所记的笔记,下附大佬的B站主页链接:九曲阑干的个人空间-九曲阑干个人主页-哔哩哔哩视频 (bilibili.com)
链接 —— Linking引入概念链接是将各种代码和数据收集并组合成一个文件的过程,最终得到的文件可以被加载到内存执行
链接的实现
早期:手动完成
现在:链接器完成
应用大型应用程序开发过程中,将各个功能实现分解为更小更容易管理的模块当修改其中的一个模块时,只需要重新编译修改后的模块,无需重新编译其他模块
学习原因1. 构建大型程序时可能遇到缺少库文件或者版本不兼容导致的链接错误
需要我们理解链接器是如何使用库文件来解析引用
2. 避免一些难以发现的编程错误3. 理解编程语言中的作用域规则全局变量和局部变量的区别static属性的实际意义
4. 理解重要的系统概念例如程序的加载和运行、虚拟内存、内存映射……
5. 更好地利用共享库随着共享库和动态链接在现代操作系统中变得越来越重要,链接也逐渐变得复杂
具体示例![[CSAPPJQLG7-1.png]]
![[CSAPPJQLG7-2.png]]
输入该命令可得到可执行程序pro ...
频度链表&哈夫曼树
频度链表相关知识为了完成本关任务,你需要掌握:
建立单链表
单链表排序
建立单链表
频度链表数据结构
123456789typedef struct ListNode{ //结点结构,哈夫曼树与频度链表共用 char c; //结点的字符 int frequency; //字符的频度 char *code; //字符的编码(对哈夫曼树结点有效) struct ListNode *parent; //结点的双亲结点(对哈夫曼树结点有效) struct ListNode *left; //结点的左子树(对哈夫曼树结点有效) struct ListNode *right; //结点的右子树(对哈夫曼树结点有效) struct ListNode *next; //结点的后继结点(对频度链表结点有效)}ListNode,HuffmanTree;
若字符在频度链表中存在,则该字符的频 ...
AttackLab-phase5
提供的指令字节序列
题目描述阶段五要求你对RTARGET程序进行ROP攻击,用指向你的cookie字符串的指针,使程序调用touch3函数。
这一关,允许你使用函数start_farm和end_farm之间的所有gadget。除了第四阶段允许的那些指令,还允许使用movl指令(如图2C所示),以及图2D中的2字节指令,它们可以作为有功能的nop,不改变任何寄存器或内存的值,例如,andb %al, %al,这些指令对寄存器的低位字节做操作,但是不改变它们的值。
提示:
· 官方答案需要8个gadgets。
解题过程第三关的时候我们已知touch3:0x401931
cookie:34 61 66 36 39 32 61 33 00
所需完成的任务
把cookie放入栈中
获取cookie所处位置的地址
将改地址移入%rdi
调用touch3
12mov addr, %rdiret
初步想法
尝试既然说了官方答案是8个gadgets,那就证明我们的当然不会一风顺,也就是说我们需要不断把简单的问题变得复杂,但是这也需要从简单开始
1 获取地址的方法想要或许地址就必须要利用 ...
Huffman文件解码--WHU
【问题描述】
给定一组字符的Huffman编码表(从标准输入读取),给定一个用该编码表进行编码的Huffman编码文件(存在当前目录下的in.txt中),编写程序对Huffman编码文件进行解码。
例如给定的一组字符的Huffman编码表为:
6
1:111
2:0
+:110
*:1010
=:1011
8:100
第一行的6表示要对6个不同的字符进行编码,后面每行中冒号(:)左边的字符为待编码的字符,右边为其Huffman编码,冒号两边无空格。对于该编码表,对应的Huffman树(树中左分支表示0,右分支表示1)应为:
假如Huffman编码文件in.txt中的内容(由0和1字符组成的序列)为:
111011010010110101010011001100
则遍历上述Huffman树即可对该文件进行解码,解码后的文件内容为:
12+8=2*8+2+2
【输入形式】
先从标准输入读入待编码的字符个数(大于等于2,小于等于30),然后分行输入各字符的Huffman编码(先输入字符,再输入其编码,字符和编码中间以一个英文字符冒号:分隔),编码只由0和1组成。 ...
POJ1330——求树中两个结点的最近公共祖先(LCA)
【问题描述】
如图所示是一棵有根树,图中每个结点用1~16的整数标识,结点8是树根。如果结点_x_位于根结点到结点_y_之间的路径中,则结点_x_是结点_y_的祖先。如果结点_x_是结点_y_和结点_z_的祖先,则结点_x_称为两个不同结点_y_和_z_的公共祖先。如果_x_是_y_和_z_的共同祖先并且在所有共同祖先中最接近_y_和_z_,则结点_x_被称为结点_y_和_z_的最近公共祖先,如果_y_是_z_的祖先,那么_y_和_z_的最近共同祖先是_y_。例如结点16和7的最近公共祖先是结点4,结点2和3的最近公共祖先是结点10,结点4和12的最近公共祖先是结点4。编写一个程序,找到树中两个不同结点的最近公共祖先。
【输入形式】
每个测试用例的第一行为树中结点数_n_(2≤n_≤10,000),所有结点用整数1~_n_标识,接下来的_n-1行中的每一行包含一对表示边的整数,第一个整数是第二个整数的父结点。请注意,具有_n_个结点的树具有恰好_n_-1个边。每个测试用例的最后一行为两个不同整数,需要计算它们的最近公共祖先。
【输出形式】
为每个测试用例输出一行, ...
并查集
定义From Introduction to Disjoint Set (Union-Find Algorithm) - GeeksforGeeks
Disjoint Set Two sets are called disjoint sets if they don’t have any element in common,the intersection of sets is a null set
Disjoint Set Data StructureA data structure that stores non overlapping or disjoint subset of elements is called disjoint set data structure. The disjoint set data structure supports following operations:
Adding new sets to the disjoint set.
Merging disjoint sets to a single disjoint set using U ...
HDU1232—畅通工程问题
【问题描述】
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
【输入形式】
每个测试用例的第1行给出两个正整数,分别是城镇数目_n_(n<1000)和道路数目_m_,随后的_m_行对应_m_条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到_n_编号。注意两个城市之间可以有多条道路相通,也就是说:
3 3
1 2
1 2
2 1
这种输入也是合法的。
【输出形式】对每个测试用例,在一行里输出最少还需要建设的道路数目。
【样例输入】
3 3
1 2
1 3
2 3
【样例输出】
0
【样例说明】 测试数据的文件名为in.txt
【评分标准】
该题目有10个测试用例,每通过一个测试用例,得10分。
思路由于老师明说了是并查集的题,所以……就不用动脑子了
并查集
根据给定的已有条件初始化disjoint sets
找到disjoint sets的 ...
线索二叉树
中序线索二叉树代码部分以下内容参考数据结构教程(C++语言描述)(第2版·微课视频版)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169#include<iostream>#include<stack>using namesp ...
树的中等题目
题目【问题描述】
假设二叉树中的每个结点值为单个整数,采用二叉链结构存储,设计算法判断给定的二叉树是否是完全二叉树。假定每棵二叉树节点不超过2000个。
【输入形式】
每个测试是一颗二叉树的括号表示法字符串
【输出形式】
如果是完全二叉树,输出“1”;如果不是完全二叉树,输出“0”
【样例输入】
1(2(4,5),3)
【样例输出】
1
【样例说明】
测试数据的文件名为in.txt 【评分标准】
该题目有10个测试用例,每通过一个测试用例,得10分。
思路
把数据读入,构建成树
层序遍历二叉树。根据完全二叉树的性质,一旦出现空结点,此后就不能再有空结点了。
设计括号表示法建树(non-recursive)12345678910111213141516171819202122232425262728293031323334353637//str为括号表示串,例如str = "A(B(D(,G)),C(E,F))&q ...