496.com 2

Presto源码分析之Slice

고소한 식빵히어로♥캐릭터토스트 [만개의레시피] 재생수760 |
등록2018.06.20. 신고 좋아요 댓글 0 나중에 보기

Slice是Presto里面用来对内部存款和储蓄器高效地、自由地展开操作的接口。它在Presto里面很要紧,
Presto里面其余八个要害类 Block 就大方用到了它,要丰盛知晓 Block
首先将要先搞清楚 Slice , 今日就先来分析一下 Slice

SWIFT网络报文字传递递流程

以用户A向用户B传递报文为例,报文的传递进度。当中A与B均为参预了SWIFT互连网的金融机构或然能够收发报的部门。

496.com 1

SWIFT网络报文传递图

(1)用户A通过交接SWIFT互连网的客户端登入种类,将编辑好的发送给用户B的电文发送到A所在的地域为主A,即Regional
Processor A。

(2)Regional Processor
A检查收到的报文,校验ISN、HEADECR-V、TAIL、BODY等格式,并将校验结果发送分报中央A,即Slice
Processor A。

(3)Slice Processor A将报文存盘。

(4)Slice Processor A将存盘结果上报给Regional Processor A。

(5)Regional Processor
A依照校验结果,将用户A反馈NAK(Rejected)只怕ACK(Accept)。无论NAK如故ACK,报文都早已存盘到Slice
Processor
A。反馈ACK的报文才会更加发送给用户B。反馈NAK的报文仲由A继续开始展览继续的更换恐怕再发送管理。

(6)Slice Processor A将报文发送给用户B所在的地段主导,即Regional
Processor B。

(7)Regional Processor B存储报文,待用户B登陆SWIFT系统时再传递给用户B。

(8)Regional Processor B创制独一的报文输出编号(Message Output
Number,MON)发送给Slice Processor B。

(9)Slice Processor B校验MOR。

(10)Slice Processor B授权Regional Processor
B能够以MOR编号发送报文给用户B。

(11)Regional Processor B发送报文给用户B。

(12)用户B存款和储蓄收到的报文。

(13)用户B依据收到的报文状态给予Regional Processor
B反馈,UNK(Rejected)恐怕UAK(Accept)。

(14)Regional Processor B创制反馈清单给Slice Processor B。

(15)Slice Processor B存款和储蓄反馈清单。

(16)Slice Processor B将报告清单别本传给Slice Processor A。

(17)Slice Processor A反馈报文接收结果给用户A。

496.com,”나중에 보기”에 저장되었습니다.

大家先来会见Slice的构造。Slice里面是经过多个参数来规定二个内部存款和储蓄器地址:
base , address , size

퍼가기

  • base
    是通过JVM分配出来的内部存款和储蓄器,在JVM规模是int数组、byte数组的靶子,而对Slice来讲那就是大家要操作的内存块
  • address 是大家要操作的地点离 base 这几个指标头的偏移量.
  • size 是大家那块内部存款和储蓄器的大大小小,一般的话正是 base
    底层所对应的内部存款和储蓄器的大小, 可能越来越小一些。
  • #캐릭터토스트
  • #토스트
  • #아이간식
  • #빵
  • #소풍도시락
  • #만개의레시피

大家来拜访基于 byte[] 来成立三个Slice的构造函数就相比形象了:

펼침

 /** * Creates a slice over the specified array. */ Slice(byte[] base) { requireNonNull(base, "base is null"); this.base = base; this.address = ARRAY_BYTE_BASE_OFFSET; this.size = base.length; this.retainedSize = INSTANCE_SIZE + sizeOf; this.reference = COMPACT; }

아이들 간식으로 딱! 좋은맛있는 식빵히어로! 아이들이 직접 데코해도 좋아요
: )캐릭터 토스트 character Toast필수재료식빵 2장 Loaf Bread, 구운
슬라이스 햄 2장 Sliced Ham, 슬라이스 치즈 1장 Sliced Cheese, 땅콩버터
2숟가락 peanut butter, 데코 초코펜 Choco pen 2개1데코 초코팬을 이용해
유산지에 눈, 코, 입을 그려 굳힌다.2식빵에 햄, 치즈를 놓고 다른 식빵으로
덮는다.3덮은 식빵위에 땅콩버터를 바른다.4땅콩버터 위에 굳힌 초코를 붙여
눈, 코, 입을 만들어 완성한다.세상의 모든 레시피 만개의레시피

其中 base 便是这么些 byte数组, address 是多个起点 Unsafe 类里面常量:
ARRAY_BYTE_BASE_OFFSET ,这几个常量表示的是:
byte数组里面第多少个成分的地点离总体byte数组地址头的偏移量。为何会有这般一个偏移量?因为数组不独有有裸的byte数据,还应该有局地元数据在这一个真的的数据在此以前,贰个数组在JVM里面包车型大巴元数据的结构如下:

  • 캐릭터토스트 레시피 보기
  • 만개의레시피 바로가기
  • 만개의레시피 facebook
  • 만개의레시피 youtube

496.com 2数组的内部存款和储蓄器结构

由上航海用教室可知JVM数组的元数据有 class pointer , flags , locks ,
以及贰个数组的尺寸 size 一共是 128 位,也就是 16 个 byte, 而
ARRAY_BYTE_BASE_OFFSET 正好是 16, 意思是说从 byte[] 对象的首地址偏移
16 个字节才是实在伊始保存数据的地方。

咱俩来看看从Slice里面获得多个Byte数据的艺术 getByte 的实现:

 public byte getByte(int index) { checkIndexLength(index, SIZE_OF_BYTE); return getByteUnchecked; } byte getByteUnchecked(int index) { return unsafe.getByte(base, address + index); }