自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

草根学僧

意在记录学习过程

  • 博客(93)
  • 资源 (2)
  • 收藏
  • 关注

原创 不用==用equals引发的一系列思考

毕业刚工作的时候,带我的小师傅给我说判断相等使用equals不要使用==,第一次写java的我照办了,但是不清楚为什么,之后还是决定真正了解一下java本身。于是开始看jdk源码。这里以Integer为例equal public boolean equals(Object obj) { if (obj instanceof Integer) { r...

2020-04-14 22:32:39 257

原创 java学习

毕业之后干了java,工作也有一年半了,感觉还是自己得把java的东西系统的过一下,用博客来记录自己的学习经历吧,权当笔记。good luck!!!

2020-03-21 10:17:43 179

原创 汇总

说说文件描述符文件描述符就是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针。 文件描述符的操作:返回一个文件描述符,内核会在每个进程空间中维护一个文件描述符表,所以打开的文件都将通过此表中的文件描述符来引用。 每个进程在PCB即进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指

2017-09-04 15:09:37 390

原创 Linux-进程

什么是进程?进程定义: 从定义上来说的话,进程就是一个正在执行的程序、计算机中正在运行的程序的一个实体 其实进程可以看作是由三部分组成的分别是:一段可以执行的程序(运行中的程序)程序所需要的相关数据(变量、工作空间、缓冲区等)程序的执行上下文这最后一部分是根本。执行上下文也被叫做进程状态,是操作系统用来管理和控制进程所需的内部数据。这中内部信息和进程是分开的,因为操作系统不允许被进

2017-08-15 12:59:34 277

原创 数据结构--排序

冒泡void bubble_sort(vector<int>& v){ int size = v.size(); int flag = 0; for (int i = 0; i < size-1;++i){ for (int j = i + 1; j < size;++j){ if (v[i]>v[j])

2017-08-14 16:27:01 1135

原创 数据结构-红黑树相关问题

红黑树的数据结构的定义。enum Color { RED = 0, BLACK = 1 }; struct RBTreeNode { struct RBTreeNode*left, *right, *parent; int key; int data;

2017-08-11 12:16:23 792

转载 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

http://blog.csdn.net/cywosp/article/details/23397179    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。     一致

2017-08-10 16:30:28 843

原创 数据结构--one

单链表单链表简单实现(1)链表和数组的区别数组静态分配内存,链表动态分配内存   数组必须事先定义固定大小,不能适应数据动态增减的情况。当数据增多时,可能超出原先定义的个数,当数据减少时,造成内存浪费。数组中插入、删除都需要移动其他元素。   而链表采用动态分配内存的形式实现,可以适应数据动态地增减的情况, 需要时可以用new/malloc分配内存空间,不需要时用delete/free将已

2017-08-06 12:53:16 351

原创 单链表简单实现

用作复习,简单实现下单链表,这里我自己添加了个尾指针。#include<iostream>using namespace std;template<class T>struct Node{ T _val; Node<T>* _next; Node(const T& val) :_val(val) ,_next(NULL) {}}

2017-08-06 11:02:10 261

原创 C/C++--two

面向对象面向对象设计的三原则:封装、继承、多态。(1)析构函数可以设置为virtual,为什么? 主要是因为多态的存在,例如一个父类指针指向一个子类对象,试想一下如果子类构造函数如果在堆中分配了内存,而析构其析构函数又不是virtual的,这个指针的静态类型是父类类型,那么撤销这个父类指针时,将只会调用父类的析构函数,而不会释放子类占据的内存,造成内存泄漏。 将父类的析构函数设置为virtual

2017-08-05 18:07:20 1104

原创 C/C++--one

C和C++的关系(1)在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”? 答:C++支持函数重载,C语言不支持。函数在被C++编译后在库中的名字与C语言不同。 例如:函数原型为void foo(int x,int y),则该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int这类的名字。 C++提供C连接交换制定符号extern“

2017-08-04 17:48:14 853

原创 http项目总结

HTTP超文本传输协议HTTP(hyper text transfer protocol),主要用于从WWW服务器传输超文本到本地浏览器上。http无状态性http是无状态协议,因为是无状态性,所以协议对事务处理是没有记忆的和独立的,也就是说,同一个客户端第二次访问这个服务器页面时,服务器不知道这个客户端曾经访问过,并且服务器无法分辨不同客户端。 无状态性使得http服务器设计很简单,并且可以有效

2017-07-31 16:11:19 623

原创 子树/最近公共祖先

判断一颗二叉树是是否是另一颗树的子树class Solution {public: bool test(TreeNode* T1,TreeNode* T2) { if(T1==NULL && T2==NULL) return true; if(T1==NULL||T2==NULL||T1->val!=T2->val)

2017-07-30 19:24:18 316

原创 二叉树前中后序/递归/非递归遍历/求链表差集

实现二叉树的前序/中序/后序非递归遍历。 前序: 递归:class Solution {public: /** * @param root: The root of binary tree. * @return: Preorder in vector which contains node values. */ void preorder(TreeN

2017-07-26 09:28:01 292

原创 判断平衡二叉树/二叉树镜像/一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中

判断一棵二叉树是否是平衡二叉树方法一:class Solution {public: /** * @param root: The root of binary tree. * @return: True if this Binary tree is Balanced, or false. */ int depth(TreeNode* root)

2017-07-25 18:42:19 341

原创 FTP服务器总结

FTPFTP是文件传输协议(File Transfer Protocol),是TCP/IP协议组中的协议之一。工作在TCP/IP族的应用层,传输协议是基于TCP的。 FTP是基于C/S模式工作的,且客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。标准命令TCP端口号为21,Port方式数据端口为20。FTP传输模式(1)ASCII模式 假定用户正在拷贝的文件包含的简单

2017-07-24 23:43:04 2588

原创 求二叉树叶子节点的个数/求二叉树第k层的节点个数/一个数组中有一个数字的次数超过了数组的一半,求出这个字符

求二叉树叶子节点的个数int getLeafNode(Node* root) { if(NULL == root) return 0; if(NULL == root->left && NULL == root->right) return 1; return getLeafNode(root->left) + getLea

2017-07-22 23:34:37 380

原创 实现一颗二叉树的层序遍历/给定一个整数N,那么N的阶乘N!末尾有多少个0呢

实现一颗二叉树的层序遍历class Solution { /** * @param root : The root of binary tree. * @return : buttom-up level order a list of lists of integer */public: vector<vector<int>> levelOrderBo

2017-07-21 20:24:13 293

原创 元素出栈、入栈顺序的合法性/计算一个整数二进制位中1的个数。

元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。 bool isLegally(const vector<int>& input,const vector<int>& output) { stack<int> st; int

2017-07-21 20:13:54 391

原创 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) /查找一个字符串中第一个只出现两次的字符

实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) class Stack{public: void push(const int val) { st.push(val); if (st1.empty()) { st1.push(val);

2017-07-19 19:48:21 414

原创 使用两个栈实现一个队列/使用两个队列实现一个栈/空格替换

使用两个栈实现一个队列class MyQueue {public: stack<int> stack1; stack<int> stack2; MyQueue() { // do intialization if necessary } void push(int element) { // write your code he

2017-07-19 16:46:12 224

原创 O(1)时间复杂度删除链表节点/复制带随机指针的链表

在O(1)时间复杂度删除链表节点直接将需要删除节点的写一个节点的val直接赋值给需删除节点,然后删除他的next即可class Solution {public: /** * @param node: a node in the list should be deleted * @return: nothing */ void deleteNode(L

2017-07-17 20:02:50 347

原创 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题

判断两个链表是否相交,若相交,求交点,若带环呢这里只贴判断是否相交代码(无环) 有环或不懂点这里class Solution {public: /** * @param headA: the first list * @param headB: the second list * @return: a ListNode */ ListNod

2017-07-16 22:59:59 236

原创 链表带环问题/设计一个类不能被继承/设计一个类只能在堆(栈)上创建对象

判断链表是否带环?若带环求环的长度?若带环求环的入口点?class Solution {public: /** * @param head: The first node of linked list. * @return: The node where the cycle begins. * if there is no cycle,

2017-07-15 15:37:40 223

原创 逆置、翻转链表/查找单链表的倒数第k个节点/A+B不使用四则运算++ -- 等

逆置/反转单链表非递归:class Solution {public: /** * @param head: The first node of linked list. * @return: The new head of reversed linked list. */ ListNode *reverse(ListNode *head) {

2017-07-14 15:32:00 280

原创 合并链表和求1+2+...+n不用循环、乘除法、循环、条件判断、选择相关的关键字

合并链表这里就不说了,稍微看下代码应该就可以懂了 递归:ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { // write your code here if(l1==NULL||l2==NULL) return l1==NULL?l2:l1; ListNode* hea

2017-07-13 17:04:03 326

原创 TIME-WAIT状态和reuse问题

前言上一篇看了TCP的三次握手与四次挥手,记得四次挥手,主动断开连接的一方最后一个状态就是TIME-WAIT状态,并且一定是主动断开连接的一方,它可能使socket能陷入一种时间比较长的状态,过多的TIME-WAIT会影响新socket的建立。那么TIME-WAIT为什么会存在?它的作用又是什么呢? TCP连接和断开连接状态转换图: TIME-WAIT从上图可以看到,客户端连接在收到服务器的结束

2017-07-02 12:55:50 2397

原创 【[TCP/ip】-TCP三次握手四次挥手

传输控制协议TCPTCP的特点: (1)TCP是面向连接的协议。(使用前先建立连接,结束释放) (2)每条TCP连接只能有两个端点,点对点的。(进程之间一对一)。 (3)TCP提供可靠传输。(传输的数据,无差错、不丢失、不重复、并且按序到达) (4)TCP提供全双工通信。(允许通信双方任意时候都可发送数据) (5)面向字节流的。(TCP把应用进程交下来的数据块看成仅仅是一串的无结构字节流)

2017-07-01 18:21:46 591

原创 I/O复用-select

I/O复用I/O复用的功能就是同时监听多个文件描述符,这样的话程序性能就能得到大大提升。通常,网络程序在下列情况下需要使用I/O复用技术:服务端程序要同时处理多个socket。服务端程序要同时处理用户输入和网络连接。TCP服务器要同时处理监听socket和连接socket。服务器要同时处理TCP请求和UPD请求。服务器要同时监听多个端口,或者处理多种服务。 与多进程和多线程技术相比,I/

2017-06-29 16:34:11 730

原创 代理服务器和NAT技术

一、代理服务器代理服务器是什么 代理服务器(Proxy Server)是一种重要的服务器安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用。代理服务器大多被用来连接INTERNET(国际互联网)和Local Area Network(局域网)。 代理,就是代而劳之的意思。代理服务器就是代理网络用户去取得网络信息,形象的说:它是网络信息的中转站,使得一个网络终端和另一

2017-06-27 19:50:37 1115

原创 最简单的生产者/消费者问题

生产者/消费者问题。可以从下图中看到,有一个容器用来存放数据,我们可以把这个容器当作”交易场所“或者”仓库“,生产者只关心仓库是否存满,不需要关心消费者的情况。消费者也一样,不需要关心具体生产者的情况,具体有多少个生产者,只需要知道仓库中是否有数据,双方甚至都不知道对方的存在。 生产者消费者,是在多线程同步的一个问题,两个固定大小缓冲区的线程,在实际运行是会发生问题,生产者是生成数据放入缓冲区

2017-06-22 16:18:56 605

原创 线程-线程同步

我们知道线程共享同一进程内的资源。如果每个线程使用的变量,其他线程都不会读取个修改,那么就不存在一致性问题。相同的,如果变量只读,多个线程同时读取该变量也不会存在一致性问题。但是,当一个线程可以修改变量,其他线程可以读取或修改变量,那么就要对这些线程进行同步,确保多个线程访问数据安全,不会访问到无效数据。 两个或多个线程同时修改同一变量时,也需要同步。跟前面信号讲的问题相同,考虑增量操作情况。增量

2017-06-18 19:10:46 1396

原创 线程-线程控制

知道了线程与进程关系,下来来学习线程控制 下来将要学习的线程库函数是由POSIX标准定义的,称为POSIX thread或者pthread。在Linux 上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。线程标识:prhread_self #include <pthread.h> pthread_t pthread_self(void);返回值:调用线

2017-06-15 18:28:32 872

原创 线程-线程基础

引言在前面讨论了进程,学习了Linux下进程概念、进程控制以及进程间通信。可以看到相关进程间可以存在一定的共享。 现在我们继续深入进程,了解如何使用多个线程在单进程环境中执行多个任务。进程中的所以线程都可以访问该进程的组成部分,如文件描述符和内存。 先来让我们来学习线程。为什么需要多线程?有些情况需要在一个进程中同时执行多个控制流程,这时候就需要线程了。 比如实现一个图形界面的下载软件,一方面

2017-06-15 14:50:45 715

原创 IPC-共享内存

进程间通信的三大主题纤消息队列、信号量、共享内存,还剩下最后一个模块。下来我们就来看看这最后一个主题:共享内存。共享内存共享内存允许两个或多个进程共享一个给定的存储区。因为共享内存数据不需要在进程和进程之间复制,所以共享内存是最快的一种IPC。 允许两个或多个进程共享一个存储区的意思是,同一块物理内存被映射到这些进程各自的进程地址空间。这样这些进程都可以看到其他进程对共享内存中数据的更新。 另外

2017-06-14 15:48:18 776

原创 IPC-信号量

- 信号量信号量与之前的PIPE、FIFO以及消息队列不同。它是一个计数器,用于为多个进程提供对共享数据对象的访问。信号量在负责数据操作的互斥、同步等功能。学习信号量之前首先先来学习几个基本概念:互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。

2017-06-13 18:05:52 875

原创 IPC-消息队列

什么是消息队列? 消息队列是消息的链接表,储存在内核中,由消息队列标识符标识。每个数据块都被认为有一个类型。接受者进程接收的数据块可以有不同的类型值。消息队列的特点 消息队列不同于管道,消息队列是基于数据块的,而管道是基于字节流的,并且消息队列读取不一定要先入先出,可以根据数据类型读取。还有就是因为管道是随进程的,进程结束管道生命周期也就结束,而对于消息队列来说,是随内核的,就算进程退出,不去

2017-06-09 21:39:05 700

原创 IPC-命名管道(FIFO)

学习了匿名管道,我们知道它的一个不足之处就是没有名字,所以只能在两个相关进程之间使用,而且这两个相关进程要有一个公共祖先进程。那如果两个进程没有血缘关系,也想进行通信该怎么办呢?方法就是命名管道。 命名管道(FIFO):突破了匿名管道只能用于具有血缘关系间的进程通信,它可以使两个互不相干的进程彼此通信。提供了一个路径名与之相关联,以FIFO文件形式存储在文件系统中。与匿名管道相同是,命名管道

2017-05-25 10:41:56 1047

原创 IPC-管道(匿名管道)

管道(Pipe),也被叫做匿名管道,是UNIX系统IPC的最古老、最基本的机制,所以UNIX系统都提供此种通信机制。管道有两个局限性:最开始它是半双工的(即数据只能在一个方向上流动)。现在,某些系统提供全双工管道,但是为了可移植性,我们应该假定系统不支持全双工。管道只能在具有血缘关系的两进程之间使用(兄弟进程、父子进程之类具有公共祖先的进程)。管道是单向的、先进先出、无结构的字节流,它把一个进

2017-05-22 16:55:45 1027

转载 IPC-引言

进程间通信就是不同进程之间进行信息传播和信息交换。但是,我们知道进程的进程空间是相互独立的,一般是不能互相访问的,唯一的例外是共享内存区。另外,系统空间是“公共场所”,各进程均可以访问,所以内核也可以提供这样的条件。此外,还有双方都可以访问的外设。进程间通信(Interprocess communication),简称IPC,是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行

2017-05-21 21:41:12 291

c++ concurrency in action pdf中文版

高并发必备pdf中文版

2017-08-14

Linux高性能服务器

Linux高性能服务器编程

2017-08-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除