02.IO多路复用实现机制
IO 多路复用实现机制概念说明IO 多路复用有三种实现,在介绍select、poll、epoll之前,首先介绍一下Linux操作系统中基础的概念:
用户空间和内核空间
进程切换
进程的阻塞
文件描述符
缓存 I/O
用户空间 / 内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
进程切换为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进 ...
01.IO多路复用基础
I/O 五种IO模型前言为了加深对 I/O多路复用机制 的理解,以及了解到多路复用也有局限性,在这里我们先回顾下 Unix网络编程中的五种IO模型。
Blocking IO - 阻塞IO
NoneBlocking IO - 非阻塞IO
IO multiplexing - IO多路复用
signal driven IO - 信号驱动IO
asynchronous IO - 异步IO
Unix网络编程中的五种IO模型阻塞IO - Blocking IO最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。
当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。
也许有人会说,可以采用多线程+ 阻塞IO 来解决效率问题,但是由于在多线程 + 阻塞IO 中,每个socket对应一个线程,这样会造成很大的资源占用,并且尤其是对于长连接来说,线程的资源一直不会释放,如果后面陆续有很多连接的话 ...
02.RocketMQ部署
单机部署部署条件:
JDK 1.8.0_322
Maven Apache Maven 3.5.4
下载源码打开 RocketMQ release_notes 页面,我们可以看到 RocketMQ 所有的发布版本。这里,我们选择最新的 RocketMQ 4.6.0 版本。点击进入该版本的发布页面后,我们可以看到两种发布版本:
Source: rocketmq-all-4.6.0-source-release.zip
Binary: rocketmq-all-4.6.0-bin-release.zip
一般情况下,我们可以直接使用 Binary 版本,它是 RocketMQ 已经编译好,可以直接使用的 RocketMQ 软件包。
这里,我们想带着胖友们编译一次 RocketMQ 源码,所以使用 Source 版本。下面,我们开始下载 RocketMQ 4.6.0 Source 源码。命令行操作如下:
12345# 下载$ wget wget http://mirror.bit.edu.cn/apache/rocketmq/4.9.3/rocketmq-all-4.9.3-sourc ...
01.RocketMQ概述
概述阿里巴巴消息中间件起源于 2001 年的五彩石项目, Notify 在这期间应运而生,用于交易核心消息的流转 。
2010 年, B2B 开始大规模使用 ActiveMQ 作为消息内核,随着阿里业务的快速发展,急需一款支持顺序消息,拥有海量消息堆积能力的消息中间件, MetaQ 1.0 在 2011年诞生 。
2012年, MetaQ已经发展到了3.0版本,并抽象出了通用的消息引擎 RocketMQ。 随后,对 RocketMQ 进行了开源 ,阿里的消息中间件正式走人了 公众视野 。
2015年, RocketMQ已经经历了多年双十一的洗礼,在可用性、 可靠性以 及稳定性等方面都有出色的表现。与此同时 ,云计算大行其道, 阿里消息中间 件基于 RocketMQ推出了 Aliware MQ 1.0,开始为阿里云上成千上万家企业提 供消息服务 。
2016 年, MetaQ 在双十一期间承载了万亿级消息的流转,跨越了一个新的里程碑 ,同时 RocketMQ 进入Apache 孵化 。
2016年11月,阿里巴巴正式将RocketMQ捐献给Apache基金会,
2017年9月 ...
8.select poll epoll 区别
select、poll和epoll区别
select单个进程可监视的fd数量受到限制,epoll和select都可实现同时监听多个I/O事件的状态。
select 基于轮训机制
epoll基于操作系统支持的I/O通知机制 epoll支持水平触发和边沿触发两种模式。
1 selectselect本质上是通过设置或检查存放fd标志位的数据结构进行下一步处理。 这带来缺点:
单个进程可监视的fd数量被限制,即能监听端口的数量有限 单个进程所能打开的最大连接数有FD_SETSIZE宏定义,其大小是32个整数的大小(在32位的机器上,大小就是3232,同理64位机器上FD_SETSIZE为3264),当然我们可以对进行修改,然后重新编译内核,但是性能可能会受到影响,这需要进一步的测试 一般该数和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。32位机默认1024个,64位默认2048。
对socket是线性扫描,即轮询,效率较低: 仅知道有I/O事件发生,却不知是哪几个流,只会无差异轮询所有流,找出能读数据或写数据的流进行操作。同 ...
Ping的原理
ping 的工作原理正文IP协议的助手 —— ICMP 协议ping 是基于 ICMP 协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 ICMP 协议。
ICMP 是什么?
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。
里面有个关键词 —— 控制,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死的不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
ICMP 功能都有啥?
ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。
ICMP 目标不可达消息
如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送一个 ICMP ...
No title
(129条消息) 深入理解 MySQL ….md
数据库优化和查询优化方案数据库优化方案
优化索引,sql语句,分析慢查询
设计表的时候严格按照数据库设计规范来设计数据库
使用缓存,把经常访问并且不需要经常变化的数据放在缓存中,能够节约磁盘IO
优化硬件,采用ssd,使用磁盘队列技术(RAID0, RAID1,RAID5)
采用mysql自带的表分区技术,把数据分析分成不同文件,能够磁盘的读写效率
垂直分表,把一些不经常读的数据放在一张表当中,节约磁盘IO
主从分离读写,采用主从复制把数据库的读操作和写操作分离开来
分库分表分机器,数据量特别大的时候,主要的原理是数据路由
选择合适的表引擎,参数上的优化
进行架构级别的缓存,静态化和分布式
不采用全文检索
采用更快的存储方恨少,例如nosql存储经常访问的数据
优化数据库的查询效率
存储引擎的选择,如果数据表需要事务处理,应该考虑Innodb,因为它完全符合ACID的特性,如果不需要食物处理,使用默认存储引擎MyISAM是比较明智的
分表分库主从
对查询进行优化,要尽量避免全表扫描,首先应考虑在shere ...
策略模式
策略模式策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
应用实例:
诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景:
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
一个系统需要动态地在几种算法中选择一种。
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重 ...
海量数据处理
海量数据处理的问题总结所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。
解决办法呢?针对时间,需要采用巧妙的算法配合合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树。针对空间,大而化小,分而治之(hash映射可以做到)。
至于所谓的单机及集群问题,单机就是处理装载数据的机器有限(只要考虑CPU、内存、硬盘间的数据交互)。而集群,机器有多台,适合分布式处理、并行计算(更多考虑节点和节点间的数据交互)。
题目1问题描述给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。
解答思路每个 URL 占 64B,那么 50 亿个 URL占用的空间大小约为 320GB。
5,000,000,000 * 64B ≈ 5GB * 64 = 320GB
由于内存大小只有 4G,因此,我们不可能一次性把所有 URL 加载到内存中处理。对于这种类型的题目, ...
面试杂谈2
面经11.JVM内存分区https://leslieaibin.github.io/2020/11/10/JVM/1.Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F%E7%AE%80%E4%BB%8B/
2.对象加载在哪里,一定不能在栈上吗,为什么不直接在栈上。1、功能和作用:
(1)栈,可以看成是方法的运行模型,所有方法的调用都是通过栈帧来进行的,JVM会为每个线程都分配一个栈区,JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作。当线程进入一个Java方法函数的时候,就会在当前线程的栈里压入一个栈帧,用于保存当前线程的状态(参数、局部变量、中间计算过程和其他数据),当退出函数方法时,修改栈指针就可以把栈中的内容销毁。
(2)堆,唯一的目的就是用于存放对象实例,每个Java应用都唯一对应一个JVM实例,每个JVM实例都唯一对应一个堆,并由堆内存被应用所有的线程共享。
所以,从功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的。
2、性能与存储要求:
(1)栈的性能比堆要快,仅次于位于CPU中的寄存器。但是,在分配内存的时候,存放在 ...