大傻与小火机写字的地方


  • 首页

  • 分类

  • 归档

  • 关于

  • 标签

单个数字

发表于 2018-05-14 | 分类于 面试算法 |

问题

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
阅读全文 »

muduo库Connector TcpClient发起新连接

发表于 2018-05-13 | 分类于 muduo网络库 |

Connector

Connector主要用于发起连接,并带有自动重连的功能,成员主要有一个channel_。Connector只负责建立socket连接,不负责创建TcpConnection。一般也不单独使用,作为TcpClient的成员。主动发起连接比被动接受连接要更复杂,一方面是错误处理麻烦,另一方面是要考虑重试。当socket变得可写时表明连接建立完毕。Connector的实现几个难点:

socket是一次性的,一旦出错(比如对方拒绝连接)。就无法恢复,只能关闭重来。但Connector 是可以反复使用的,因此每次尝试连接都要使用新的socket文件描述符和新的Channel对象。

阅读全文 »

muduo库TcpConnection生存期管理 shared_from_this

发表于 2018-05-13 | 分类于 muduo网络库 |

TcpConnection

TcpConnection class是muduo里唯一默认使用shared_ptr来管理的class,也是唯一继承enable_shared_from_this的class。TcpConnection一旦连接断开,这个TcpConnection对象就没啥用了。它没有发起连接的功能,其构造函数的参数是已经建立好连接的socket fd。

TcpConnection使用Channel来获得socket上的IO事件,构造TcpConnection对象的时候,Channel注册可读,可写,错误,关闭事件。他会自己处理writable事件,而把readable事件通过MessageCallback传达给客户。TcpConnection拥有TCP socket,它的析构函数会closed(fd)。

阅读全文 »

删除排序链表中的数值相同节点

发表于 2018-05-12 | 分类于 面试算法 |

问题

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3
阅读全文 »

平衡二叉树

发表于 2018-05-12 | 分类于 面试算法 |

问题

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as:

a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example 1:

Given the following tree [3,9,20,null,null,15,7]:

    3
   / \
  9  20
    /  \
   15   7
Return true.

Example 2:

Given the following tree [1,2,2,3,3,null,null,4,4]:

       1
      / \
     2   2
    / \
   3   3
  / \
 4   4
Return false.
阅读全文 »

Symmetric Tree 镜像树

发表于 2018-05-11 | 分类于 面试算法 |

问题

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3
But the following [1,2,2,null,3,null,3] is not:
    1
   / \
  2   2
   \   \
   3    3
阅读全文 »

TCP网络编程的本质

发表于 2018-05-10 | 分类于 muduo网络库 |

TCP网络编程最本质是的处理三个半事件

  1. 连接的建立,包括服务端接受(accept)新连接和客户端成功发起(connect)连接。TCP 连接一旦建立,客户端和服务端是平等的,可以各自收发数据。

  2. 连接的断开,包括主动断开(close或shutdown)和被动断开(read返回0)。

  3. 消息到达,文件描述符可读。这是最为重要的一个事件,对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等)。

  4. 消息发送完毕,这算半个。对于低流量的服务,可以不必关心这个事件;另外,这里“发送完毕”是指将数据写入操作系统的缓冲区,将由TCP协议栈负责数据的发送与重传,不代表对方已经收到数据。

muduo库Acceptor TcpServer接收新连接

发表于 2018-05-10 | 分类于 muduo网络库 |

TcpServer供用户直接使用,生命期由用户控制。用户只需设置好callback,再调用start即可。TcpServer内部使用Acceptor来获取新连接的fd。TcpServer会为新连接创建对应的TcpConnection对象。

在TcpServer构造函数中先初始化acceptor成员,acceptor(new Acceptor(loop, listenAddr))

// Acceptor::handleRead函数中会回调用TcpServer::newConnection
// _1对应的是socket文件描述符,_2对应的是对等方的地址(InetAddress)
acceptor_->setNewConnectionCallback(
    boost::bind(&TcpServer::newConnection, this, _1, _2));
阅读全文 »

并发服务器模式的几个问题

发表于 2018-05-09 | 分类于 muduo网络库 |

Linux能同时启动多少个线程?

对于 32-bit Linux,一个进程的地址空间是 4G,其中用户态能访问3G左右,而一个线程的默认栈 (stack)大小是8M,心算可知,一个进程大约最多能同时启动350个线程左右。

多线程能提高并发度吗?

如果指的是“并发连接数”,不能。假如单纯采用 thread per connection
的模型,那么并发连接数大约350,这远远低于基于事件的单线程程序所能轻松达到的并发连接数(几千上万,甚至几万)。所谓“基于事件”,指的是用IO multiplexing event loop的编程模型,又称Reactor模式。

阅读全文 »

Reactor事件处理框架

发表于 2018-05-08 | 分类于 muduo网络库 |

Reactor模式是事件驱动模型的一个实现。它是一个同步的按照事件到达顺序处理事件的分发器。简单的说就是有一个线程不断轮询事件源,然后将其分发给对应的处理器。

餐厅点菜的Reactor模式图
Reactor

阅读全文 »
1…345…11
Shaojie Li

Shaojie Li

学习总结 思考感悟 知识管理

107 日志
15 分类
15 标签
RSS
© 2017 — 2019 Shaojie Li
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4