三次握手与四次挥手 通过TCP/IP协议的学习,我们可以知道TCP协议是一种面向连接的、可靠的传输协议。其中,为了保证客户端与服务器连接的有效性,就有了本篇文章所要介绍的“三次挥手”;而“四次挥手”则是为了保证连接的正确断开。 1. TCP状态 首先,介绍一下TCP的几个状态: SYN —— 同步序列编号,在建立连接时发送 ACK —— 确认信息,在确认SYN信息时发送,响应信息 FIN —— 关闭连接 RST —— 连接重置 PSH —— 有数据传输 URG —— 紧急指针字段值有效 2. 三次握手 建立TCP连接时会经过如下步骤: 服务器准备接收客户端连接(通过socket API),由于连接是由客户端激发的,因此称为被动打开 客户端调用connect开始主动打开,并发送SYN(syn = i)包,告诉服务器发送数据的序列号 服务器确认(ACK,ack = i+1)客户端发来的信息(SYN),并发送SYN(syn = j),其中含有服务器发送数据的初始序列号。注:SY 继续阅读 >>


王良 18/08/15 08:58:10
关于Java线程的状态网上的说法不一,有的说是6种状态,有的说是5中状态,索性就查看了一下Java源码。Thread类里面有一个枚举类,如下: public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 这个枚举类里面有6种类型,所以Java中的线程有6种状态。 关于各种状态的简单说明: NEW(初始):线程被创建后尚未启动。 RUNNABLE(运行):包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。 BLOCKED(阻塞):线程阻塞于锁。 WAITING(等待):线程需要等待其他线程做出一些特定动作(通知或中断)。 TIME_WAITING(超时等待):该状态不同于WAITING,它可以在指定的时间内自行返回。 TERMINATED(终止):该线 继续阅读 >>


李猛 18/08/15 08:19:50
I/O多路复用的理解 先讲一个大家都比较熟悉的例子吧 小时候咱们都喜欢看《亮剑》、《雪豹》这一类的抗日剧,里面八路军在自己的驻地周围都会24小时分布一些暗哨,每当有鬼子要进行扫荡或者清剿的时候暗哨就会赶紧告诉驻地的八路军,有敌人过来了,赶紧抄家伙干仗了。其实这就和咱们要讲的I/O多路复用有异曲同工之处。 在我们接触I/O多路复用以前,在处理一些比较多的连接或者请求的时候大多数人会去使用类似下面这种方式去处理: while(1) { int cli_fd = accept(listen_fd, (struct sockaddr*)&addrCli, sizeof(addrCli)); ...../*开启一个线程或者开启一个进程*/ } 这么做看着十分的清爽,而且实现起来也相当的简单,但是服务器的主程序会一直阻塞在accept这个函数上,然后会一直去等待connect的到来,这种方法虽然十分的简单,但是在轮询的过程中耗费了大量的CPU时间,并且效率还十分的低下,因此我们要想 继续阅读 >>


李佳灏 18/08/14 16:27:10
  前面我们提到输入的数据正好是升序或降序序列时,二叉排序树就会退化成一个单链表,时间复杂度变为 O(N)(如果没看前面,点这里),这是我们所不希望的。我们也提出了解决办法,那就是“平衡”BST树。    AVL树:最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(log{n}),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。 具体代码实现与分析: 1.节点定义 class Node { public: int key = 0; int height = 0; Node *left = nullptr; Node *r 继续阅读 >>


刘生玺 18/08/14 10:28:51
本以为JVM中有一个强大的垃圾收集器,能够实时监控资源并即时清除已经死掉的对象。事实上直到现在为止还没有万能的收集器,我们选择的只是对具体应用最合适的收集器,下面就简单说说集中收集器吧。 Serial 收集器 最基本、发展历史最悠久的收集器,在JDK 1.3.1之前是虚拟机新生代收集的唯一选择。它是一个单线程收集器,在它就行垃圾收集工作时,必须暂停其他所有的线程,直到它收集结束。 具有简单高效的优点(没有线程交互的开销),现在依然是虚拟机运行在Client模式下的默认新生代收集器。 ParNew 收集器 Serial收集器的多线程版本,除了多线程收集之外,与Serial相比并没有太多创新。除了Serial收集器外,目前只有ParNew收集器能与CMS收集器配合工作,是运行在Server模式下虚拟机中首选的新生代收集器。 在单CPU的环境下,ParNew收集器不会比Serial收集器有更好的效果,但是随着CPU数量的增加,对GC时系统资源的有效利用还是有很多好处的。 Parallel 继续阅读 >>


李猛 18/08/14 08:51:34
1、brk释放内存和sbrk分配内存 #include<unistd.h> int brk(void *end_data_segment); 成功返回0,否则为-1 将内存边界设置为参数所指定位置 void *sbrk(intptr_t increment); 成功返回之前的内存边界,失败返回(void*)-1 增加内存边界,返回为新分配内存的起始位置(sbrk(0)就是获得堆位置) 使用的例子 #include <iostream> #include <unistd.h> using namespace std; int main() { int* phead; // 指向首位置 int* pnow; // 指向当前指针位置 pnow = sbrk(0); // 先分配空闲区域 phead = pnow; // 固定首位置不变 for(int i=2; i<10000; i++) { 继续阅读 >>


陈文浩 18/08/13 15:41:54
信号是由用户、系统或者进程发送给目标进程的信息,用来通知目标进程的状态改变或系统异常。 发送信号 kill #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 该函数可以把sig信号发送给pid指定的目标进程 pid 参数 含义 pid > 0 信号发送给PID为pid的进程 pid = 0 信号发送给本进程组内的其他进程 pid = -1 信号发送给除init进程外的所有进程,但发送者需要拥有对目标发送信号的权限 pid < -1 信号发送给组ID为-pid的进程组中的所有成员 特别的如果sig为0的时候,kill函数不发送任何信号。 kill函数成功时返回0,失败返回-1,并设置errno errno 含义 EINVAL 无效的信号 EPERM 继续阅读 >>


李佳灏 18/08/13 15:26:36
生产者——消费者模型顾名思义,就是一个或多个线程往仓库生产东西,另外的线程从仓库拿东西,在咱们的线程池中也有所应用。咱们看看维基的解释: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 说了这么多,大家还是有点晕乎乎的,咱们看代码吧 #include<stdio.h> #include<unistd.h> #include<string.h> #include<pthread.h> //1 : 1 #defi 继续阅读 >>


李佳灏 18/08/13 08:34:37
August 6, 2018 Fix some issue #18 Fix crash when users serach last 3 days log bug tracker Thread 1 "gnome-logs" received signal SIGSEGV, Segmentation fault. 0x00007ffff595f5b4 in g_date_time_to_unix () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 (gdb) bt #0 0x00007ffff595f5b4 in g_date_time_to_unix () at /lib/x86_64-linux-gnu/libglib-2.0.so.0 #1 0x000055555555ea7c in query_set_day_timestamps (query=0x555556772ce0, start_day_offset=<optimized 继续阅读 >>


刘嘉辉 18/08/12 12:27:36
MIT 6.828 在网上一直有很高的地位,但是由于上手难度太难,而且是MIT研究生的课程,让大家都望而却步. 但是如果想要深入透彻的了解计算机系统的架构和设计,这门课又是有很大帮助. 作为一个计算机学生,一个热爱学习,热爱技术的学生,我还是决定要去试试水. 后面将会慢慢讲解我遇到的所有问题和解决办法。如果有任何错误或者建议都可以和我交流。这里贴下我的邮箱 hellochen19970916@gmail.com (90后哦 haha) 本机环境 虚拟机VMware Fusion Ubuntu 16.04.4 参考资料 MIT 6.282 lab1 本人GItHub地址 课程描述 MIT 6.828 fall2017 本篇博客主要讲解本人在环境配置遇到的问题的解决的方法.(初学MIT 6.828课程,如果有错误欢迎指出) 首先 Software Setup You must use an x86 Athena machine; that is, uname -a shoul 继续阅读 >>


陈苏扬 18/08/12 05:01:14