Entry

Java集合框架

守給你的承諾、 提交于 2020-12-16 06:56:30
一、ArrayList与LinkedList的异同 1、都不保证线程安全的 2、底层数据结构不同。ArrayList是数组,LinkedList是双向链表。 3、插入和删除的时间复杂度与元素位置有关。ArrayList在尾部增删时时间复杂度为O(1),在非尾部操作时时间复杂度为O(n-i)。LinkedList增删操作时时间复杂度为O(1)。 4、ArrayList支持快速随机访问(使用get(int index)方法),LinkedList不支持快速随机访问 5、内存空间占用方面。ArrayList造成的空间浪费体现在list列表结尾会预留一定的空间,而LinkList空间花费体现在每个元素要比ArrayList多消耗直接前驱和后驱的空间。 补充:RandomAccess接口 表示实现这个接口的类具有随机访问的功能 二、ArrayList与Vector的区别 1、ArrayList不是线程安全的,Vector所有的方法都是线程安全的。 2、二者的底层数据结构都是数组。当ArrayList空间不够时,默认增长50%,当Vector空间不够时,默认增长一倍。 3、Vector可以设置容量增加的参数,ArrayList不可以。 三、HashMap与HashTable的区别 1、HashMap不是线程安全的,HashTable是线程安全的。 2、效率

再谈ThreadLocal

独自空忆成欢 提交于 2020-12-16 04:48:53
大家对于ThreadLocal肯定很熟悉了,但是真正在项目中使用过的估计就不多了,有的牛人也许已经使用n多次了。 面向人群 对ThreadLocal不是很熟或者熟悉一些但是没用过,甚至用过了也没用去理解他的实现原理的同学。 主要内容 ThreadLocal的简介 ThreadLocal的实现原理 ThreadLocal的 部分源码分析 ThreadLocal在项目中的使用 ThreadLocal简介 每个线程都包含对其本地线程副本的隐式引用变量,只要线程处于活动状态,实例是可访问的; 线程消失后,它的所有副本线程本地实例接受垃圾收集(除非存在对这些副本的其他引用)。 简单理解为每个线程副本,每个线程都有自己的副本,相互之间并不知晓。 ThreadLocal原理 先说JVM虚拟运行时区: 其中虚拟机栈是线程执行方法(字节码)的地方,每创建一个线程实例,就是分配固定大小(Xss设置参数)的内存空间给线程执行方法用,具体结构图如下: 栈帧(每调一个方法就入栈一个栈帧到栈里): 上面已经大概的了解了一下堆栈,那就再来看看线程的堆栈与本地变量的一个关系结构图: 我们知道,线程实例也是一个对象,对象都是存放在堆里面的。从上图可以看出,当创建一个新的线程,那么就会有一个相对应的堆栈空间创建,那个stack部分就可以很好的解析上文提到的一句话“Java线程的创建,除了堆栈空间

再谈ThreadLocal

。_饼干妹妹 提交于 2020-12-15 16:59:07
大家对于ThreadLocal肯定很熟悉了,但是真正在项目中使用过的估计就不多了,有的牛人也许已经使用n多次了。 面向人群 对ThreadLocal不是很熟或者熟悉一些但是没用过,甚至用过了也没用去理解他的实现原理的同学。 主要内容 ThreadLocal的简介 ThreadLocal的实现原理 ThreadLocal的 部分源码分析 ThreadLocal在项目中的使用 ThreadLocal简介 每个线程都包含对其本地线程副本的隐式引用变量,只要线程处于活动状态,实例是可访问的; 线程消失后,它的所有副本线程本地实例接受垃圾收集(除非存在对这些副本的其他引用)。 简单理解为每个线程副本,每个线程都有自己的副本,相互之间并不知晓。 ThreadLocal原理 先说JVM虚拟运行时区: 其中虚拟机栈是线程执行方法(字节码)的地方,每创建一个线程实例,就是分配固定大小(Xss设置参数)的内存空间给线程执行方法用,具体结构图如下: 栈帧(每调一个方法就入栈一个栈帧到栈里): 上面已经大概的了解了一下堆栈,那就再来看看线程的堆栈与本地变量的一个关系结构图: 我们知道,线程实例也是一个对象,对象都是存放在堆里面的。从上图可以看出,当创建一个新的线程,那么就会有一个相对应的堆栈空间创建,那个stack部分就可以很好的解析上文提到的一句话“Java线程的创建,除了堆栈空间

逆向映射的演进

醉酒当歌 提交于 2020-12-15 06:43:51
一、前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加深入的理解。 二、基础知识 在切入逆向映射的历史之前,我们还是简单看看一些基础的概念,这主要包括两个方面:一个是逆向映射的定义,另外一个是引入逆向映射的原因。 1、什么是逆向映射(reverse mapping)? 在聊逆向映射之前,我们先聊聊正向映射好了,当你明白了正向映射,逆向映射的概念也就易如反掌了。所谓正向映射,就是在已知虚拟地址和物理地址(或者page number、page struct)的情况下,为地址映射建立起完整的页表的过程。例如,进程分配了一段VMA之后,并无对应的page frame(即没有分配物理地址),直到程序访问了这段VMA之后,产生异常,由内核为其分配物理页面并建立起所有的各级的translation table。通过正向映射,我们可以将进程虚拟地址空间中的虚拟页面映射到对应的物理页面(page frame)。 逆向映射相反,在已知page frame的情况下(可能是PFN、可能是指向page descriptor的指针,也可能是物理地址

[多线程] Java线程池应用及原理分析(JDK1.8)

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-13 20:03:00
一 线程池优点   1、线程在创建和销毁时是非常耗费资源的,使用 线程池可以减少创建和销毁线程的次数 ,每个工作线程都可以重复使用。   2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。   对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空。切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。   关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的耗时不好说。   关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当让这个可以通过设置 -Xss 属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。   PS:同样的道理在java程序中也不要随意开启新的线程,特别是高频业务尽量使用线程池,不然很容易导致内存不足,程序崩溃的问题。 二 线程池创建    java.uitl.concurrent.ThreadPoolExecutor 类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池

ucore Lab2 实验笔记

南笙酒味 提交于 2020-12-12 19:41:59
ucore Lab2 lab 2 直接执行 make qemu-nox 会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertion failed: (p0 = alloc_page()) == p2 - 1 1 连续物理内存管理 1.1 page 概览 对物理内存的管理,为了节省空间,也是为了配合接下来的虚拟内存管理,通常以某个比 byte 大一些的单位进行管理,我们称这一单位内存为一" 页(page) ",通常是 4KB.待 pages 初始化完毕后,物理内存示意图如下: 其中绿色代表可以分配的内存,红色代表不可被分配的内存.注意, ucore 规定物理内存可用范围最大不超过 KERNSIZE .函数 page_init 的主要作用就是初始化 pages 也就是所有 page 的所有信息. 注意, pages 以全局指针的形式存在,因为最开始无法知道 page 的数量,所以无法写成数量确定的数组.此数量必须尽快确认,否则后期无法管理. 如何确定 page 的数量 npage 呢? 1.1 探测物理内存布局,获取 pages 大小 npages 可由最大物理内存边界/PGSIZE 得出. 而最大物理内存边界可以借助 BIOS 可以探测并计算出来,参考 探测系统物理内存布局 和 实现物理内存探测

【逆向】ShellCode分析基础

你说的曾经没有我的故事 提交于 2020-12-12 16:23:02
1、shellcode经常与漏洞利用一起使用,或者被病毒等恶意代码用于进程注入。所以它们总是在一个程序中被植入运行。 2、shellcode是一段 与位置无关的代码 。因为它在内存中的位置是随机不可控的,所以在编写shellcode时应该避开对内存地址进行硬编码。 3、shellcode中 包含数据和代码 。所以在以位置无关的方式访问数据时,需要有一个 基础地址(基址)加上或减去偏移的方式来访问 。shellcode通常使用当前指令指针(EIP)作为基础地址来使用。为了在代码执行时获取EIP的值,可以 根据call/pop指令执行原理来变相获取EIP值 。 4、当一个call指令执行时,处理器会将下一条指令地址(函数返回地址)保存到栈上,shellcode可以在一个call指令后面立刻执行pop指令,从栈上取出指令地址作为基础地址来使用。通过基础地址就可以对代码中的数据进行自由访问了。 5、shellcode因为不能硬编码内存地址,所以它在通过API与系统进行交互时,必须自己动态加载获取需要的模块和API地址。为了完成这个任务,shellcode经常使用LoadLibraryA和GetProcess函数。如果shellcode有这两个函数的访问权限,它就可以加载任意模块到系统中并获取导出函数地址。这两个函数都是从Kernel32.dll中导出的

python tkinter 学生信息管理系统

孤者浪人 提交于 2020-12-12 13:53:14
使用tkinter模块,python3.6,主要功能有添加,查询,删除,修改学生信息 使用模版: 1 from tkinter import * 2 import tkinter.font as tkFont 3 import tkinter as tk 4 from tkinter import ttk 最主要也是最难做的是,实现不同功能的界面在同一TK窗口内容的转换,通过把每个界面做成一个Frame框架,用for循环转换界面,来解决这个问题 1 LARGE_FONT= ( " Verdana " , 20 ) 2 3 class Application(tk.Tk): 4 def __init__ (self): 5 6 super(). __init__ () 7 8 self.wm_title( " 学生信息管理系统 " ) 9 10 container = tk.Frame(self) 11 container.pack(side= " top " , fill= " both " , expand = True) 12 container.grid_rowconfigure(0, weight=1 ) 13 container.grid_columnconfigure(0, weight=1 ) 14 15 self.frames = {} 16 # 循环功能界面 17

Vulnhub-靶机-NULLBYTE: 1

家住魔仙堡 提交于 2020-12-12 10:01:59
本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关 靶机下载之后使用仅主机模式加载到本地VMware Workstation工作站,需要发现目标靶机的IP地址,可以使用nmap,netdiscover,或者arp之类的工具 arp-scan 例如:sudo arp-scan -I eth1 -l 当然也是可以使用Windows环境下mac地址扫描工具都是可以的,那么本次演示就是arp-scan工具发现 地址:https://www.vulnhub.com/entry/nullbyte-1,126/ nmap结果如下: 根据扫描的结果发现开放了80 端口,直接访问80端口 然后看都不看习惯使用dirb命令爆破猜测下目标靶机的目录,命令 dirb http://192.168.56.103 发现扫描出来了很多关于phpmyadmin的目录,在这个地方我尝试使用phpmyadmin的渗透技巧去测试,但是都没有结果,包括的方法有,默认账号密码,密码爆破,默认路径,确认目标版本看是否存在Nday,等操作,但实际突破口并不是在这里,于是峰回路转还是再看回来看下刚开始访问的那个首页的默认图片,将目标图片下载下来使用strings命令查看 还是发现了一些敏感信息 kzMb5nVYJw 刚开始以为这是密码,后来尝试发现这是个目录路径

Vulnhub-靶机-TOPPO: 1

只谈情不闲聊 提交于 2020-12-12 09:42:02
本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关 靶机下载之后使用仅主机模式加载到本地VMware Workstation工作站,需要发现目标靶机的IP地址,可以使用nmap,netdiscover,或者arp之类的工具 arp-scan 例如:sudo arp-scan -I eth1 -l 当然也是可以使用Windows环境下mac地址扫描工具都是可以的,那么本次演示就是arp-scan工具发现 地址:https://www.vulnhub.com/entry/toppo-1,245/ 直接nmap扫描 目标开了个80端口,访问看看 发现一个admin目录,访问看看 根据提示是知道目标靶机的密码,但是不知道用户名,这个时候尝试试试看的态度,看用户名是否是ted,通过这个用户名使用ssh去登录目标靶机 居然登录成功 拿到此权限看看是否存在SUID的权限 find / -perm -u=s -type f 2>/dev/null 发现含有类似awk的编译环境,具体可看下面链接了解 https://www.cnblogs.com/GodMode/p/4949370.html 直接使用此命令进行提权 mawk 'BEGIN {system("/bin/sh")}' 这里因为python也存在SUID的权限