9 a7980718

尚未进行身份认证

暂无相关简介

等级
TA的排名 9w+

TCP协议笔记

一、三次握手TCP状态。客户端:1.SYN_SENT 2.ESTABLISHED 服务端:1.SYN_RECVD 2.ESTABLISHED. 1.首先由客户端发起TCP连接,第一个报文段,TCP头部SYN位置为1,随机生成一个ISN, MSS数值(最大报文段 <= 1460),客户端窗口大小,客户端状态变为SYN_SENT。 2.服务端接收到SYN报文段,状...

2019-03-16 23:53:23

glibc nptl库pthread_mutex_lock和pthread_mutex_unlock浅析

一、futex简介 futex全称是fast user-space locking,也就是快速用户空间锁,在linux下使用C语言写多线程程序时,在需要线程同步的地方会经常使用pthread_mutex_lock()函数对临界区进行加锁,如果加锁失败线程就会挂起,这就是互斥锁。但是pthread_mutex_lock并不是立即进行系统调用,而是首先在用户态进行CAS操作,判断其它线程是...

2019-03-16 23:46:38

从汇编语言看java volatile关键字

  一、CPU缓存级别       x86内存变量可以在寄存器中,write buffer中,L1到L3cache中,主存中。寄存器、writebuffer和L1cache或者L2cache是cpu私有的。其中对程序员可编程的是寄存器和主存。cpu如何将变量写到writebuffer和如何写到cache对程序员是透明的。一般cpu读写内存的流程如下:     读内存:         ...

2018-11-11 23:05:54

jdk1.8 Unsafe类 park和unpark方法解析

 park是Unsafe类里的native方法,LockSupport类通过调用Unsafe类的park和unpark提供了几个操作。Unsafe的park方法如下:publicnativevoidpark(booleanisAbsolute,longtime); 第一个参数是是否是绝对时间,第二个参数是等待时间值。如果isAbsolute是true则会实现ms定时。如果i...

2018-11-03 13:59:04

《垃圾回收的算法与实现》 一

  一、GC介绍          1.GC就是为了回收对象,对象是GC的基本单位。一般对象由头和域组成                (1)头主要包括对象大小,对象种类和运行GC所需要的信息。                (2) 对象的域就是对象使用者可访问的部分。比如c语言的结构体成员,java的类成员。域主要包括两种指针和非指针。对于java就是引用类型和基本类型。    ...

2018-11-01 14:04:11

jdk1.8 Unsafe类初探

    在看java原子类时里有很多方法都调用了Unsafe类方法,Unsafe类方法在jdk里没找到源码,然后下载open jdk找到了源码,在/src/share/classes/sun/misc 目录下。定义如下:   public final class Unsafe { private static native void registerNatives(); s...

2018-10-24 01:29:32

红黑树原理及实现

一.二叉搜索树  二叉树是最常用的树形数据结构,二叉树可以分为完全二叉树,满二叉树,平衡二叉树。二叉树应用的最多就是二叉搜索树,二叉搜索树的定义是:设x是二叉搜索树中的一个结点。如果y是x的左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。 也就是左子树小于根节点,根节点小于右子树。          普通的二...

2018-10-19 23:01:58

Memory Consistency and Cache Coherence —— 内存一致性

随着CPU设计技术的提升,为了加快程序执行有了很多优化技术,1.流水线技术,经典的5级流水线(取指,译码,执行,访存,写回)。2.多发射技术,一个cpu内可以有多个同样的流水线部件,这样就可以在一个周期内发射多条指令,实现指令级并行。3.乱序执行技术,为了避免流水线中断,将不相关(数据相关,控制相关)的指令放到一块进行重新排序,这样可以使得不相关的指令并行执行,比如循环展开技术,指令动态调度技...

2018-10-10 00:18:56

CAS操作在ARM和x86下的不同实现

  cmpxchg是X86比较交换指令,这个指令在各大底层系统实现的原子操作和各种同步原语中都有广泛的使用,比如linux内核,JVM,GCC编译器等,cmpxchg就是比较交换指令,了解cmpxchg之前先了解原子操作。   intel P6以及最新系列处理器保证了以下操作是原子的:1.读写一个字节。2.读写16位对齐的字。3.读写32位对齐的双字。4.读写64位对齐的四字。5.读写16位,...

2018-09-27 01:17:08

linux内核上下文切换解析

    linux的上下文切换就是进程线程的切换,也就是切换struct task_struct结构体,一个任务的上下文包括cpu的寄存器,内核栈等,由于1个cpu上的所有任务共享一套寄存器,所以在任务挂起的时候需要保存寄存器,当任务重新被调度执行的时候需要恢复寄存器。每种处理器都提供了硬件级别的上下文切换,比如x86架构下的TSS段,TSS段包括了一个任务执行的所需要的所有上下文,主要有:1.通...

2018-09-22 00:41:53

TCP协议三次握手和四次挥手抓包分析

 TCP协议在双方建立连接的时候需要三次握手,首先客户端发送SYN标志为1的TCP数据包,然后服务器端收到之后,也会发送一个SYN标志置位,并且带有ack应答的数据包,最后客户端再发送给服务端一个应答,这样就建立起了通信。 首先看TCP数据包头部各个字段:     在三次握手和四次挥手过程中,主要看UAPRSF6个标志和seq ack的变化。首先使用telnet程序测试,比如tel...

2018-09-02 20:23:47

linux内核进程创建fork源码解析

    平时写过多进程多线程程序,比如使用linux的系统调用fork创建子进程和glibc中的nptl包里的pthread_create创建线程,甚至在java里使用Thread类创建线程等,虽然使用问题不大,但需要知道底层原理。这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。    进程概念:进程是对正在运行程序的一个抽象。一个进程就是一个正在执行...

2018-08-20 23:25:51

linux内核缺页中断处理

现代处理器大部分都有MMU,除了一些小型嵌入式设备。MMU可以做虚拟地址到物理地址的转换,使用MMU我们就可以使用更多的内存空间,因为程序具有局部性原理,我们可以将暂时用不到的数据存放到磁盘,当访问到时会发生缺页中断,从磁盘中将所需要的数据加载到内存。所以我们可以通过mmu运行程序大小大于内存的程序和打开大于内存的文件。现代处理器通过分段分页机制实现虚拟地址到物理地址转换一般支持二级页表或四级页表...

2018-07-12 22:56:58

linux进程虚拟空间布局

首先看linux进程的虚拟空间内存布局,以i386 32位机器为例每个用户进程的虚拟地址空间为0x0—0xC0000000也就是3GB,其中0x0—0x08000000 128MB地址空间用于捕获空指针,用户空间分为代码段,堆,mmap区,栈。堆的起始地址start_brk依据代码段和数据段的大小确定,堆从低地址往高地址增长,mmap区从高地址往低地址增长当两个区域相撞时则区域耗完,mmap区基地...

2018-07-02 23:10:50

Memory Consistency and Cache Coherence—— cache一致性协议(MESI)

    cache监听一致性主要是获得cache的总线访问权,比如core1和core2同时写入相同的地址,会交由总线进行仲裁,确定哪个核先写入,在获得写入权限后,会通过总线广播使地址失效。一般的smp架构cpu cache结构如下图:其中分为三级cache,第一级和第二级cache是处理器独有的,第三级cache是共享的,L1cache分为指令cache,数据cache。intel co...

2018-06-15 17:53:13

重写equals方法必须重写hashcode

equals方法定义在java的根类Object类,定义如下public boolean equals(Object obj) { return (this == obj);}比较的是引用,也就是对象的地址是否相等,equals在非空对象上需要满足以下特性:1.自反性:x.equals(x) == true,自己和自己比较相等2.对称性:x.equals(y) == y.equa...

2018-06-12 13:47:55

jdk1.8源码阅读PriorityQueue

PriorityQueue是优先队列,可以按照指定的优先级进行排序,比如某个元素优先级最高,当它插入队列时会被插到队列头。jdk优先队列是通过二叉堆实现的,类似堆排序,根节点始终是优先级最高的元素,父结点的优先级要高于左右孩子结点,优先队列的调整时间复杂度是O(logn)。包括从上往下调整和从下往上调整,以满足二叉堆的性质。PriorityQueue的类关系图如下:        package ...

2018-06-07 21:19:29

jdk1.8源码阅读LinkedList

LikedList实现采用了双向链表,并且LinkedList实现了Dqueue接口,所以LinkedList可以当作普通队列和双端队列使用,首先看一下LinkedList的类关系图LinkedList和ArrayList的区别就是继承了AbstractSequentialList,并且实现了Dqueue接口,AbstractSequentialList和AbstractList的主要区别是采用迭...

2018-05-29 23:58:08

jdk1.8源码阅读ArrayList

   ArrayList的实现原理就是大学数据结构书本中的动态数组原理,初始化一个Object数组,然后对Object数组进行插入,扩容,查找,删除等操作。所以可以看出java引用类型所占内存大小是一样的,Object数组类似于c语言中的void*指针数组,每个指针在64位机器上都占8字节, 在hotspot jvm中java引用类型也是占8字节。所以ArrayList无法存放基本类型,只能存放引...

2018-05-28 23:42:02

leetcode 3. Longest Substring Without Repeating Characters---最长不重复子串 C语言版 faster 100%

 最长不重复子串,abcabcbb  则最长的不重复子串是3,abc。 bbbbb 最长不重复子串是b,长度为1,pwwkew最长子串是wke或者kew 为3.解法一:暴力解法       遍历每一个字符串,以次字符串为开头求最长的不重复长度,最后取出最大的,复杂度是O(N^3).int lengthOfLongestSubstring(char* s) { int max ...

2018-03-05 22:38:42

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得