Linux工具-nsenter
参考文献
nsenter Command Examples in Linux
nsenter
nsenter 是一个 Linux 实用程序,允许您在正在运行的进程的命名空间中运行命令。命名空间是 Linux 内核的一项功能,可为进程提供隔离的环境,并被 Docker 等容器技术用来创建隔离的容器。
使用 nsenter,您可以在正在运行的进程的命名空间中运行命令,从而有效地允许您访问该进程的环境。这对于各种任务都很有用,例如调试进程、检查容器的文件系统或使用类似 chroot 的操作更改进程的根目录。
nsenter 对于管理 Docker 容器特别有用,因为它允许您进入容器的命名空间并执行操作,就像您在容器本身内部一样。这对于排除容器问题或执行维护任务而无需启动新容器特别有帮助。
使用说明
12345678910111213141516171819202122232425262728# nsenter --help用法: nsenter [选项] [<程序> [<参数>...]]以其他程序的名字空间运行某个程序。选项: -a, --all ...
算法-负载均衡算法
参考文献
随机算法
随机算法,顾名思义就是从可用的服务节点中,随机挑选一个节点来访问.
在实现时,随机算法通常是通过生成一个随机数来实现,比如服务有 10 个节点,那么就每一次生成一个 1~10 之间的随机数,假设生成的是 2,那么就访问编号为 2 的节点.
采用随机算法,在节点数量足够多,并且访问量比较大的情况下,各个节点被访问的概率是基本相同的.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162/* * Copyright 2009-2016 Weibo, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obta ...
DICOM-DCMTK
参考文献
DCMTK
123456789安装命令:apt-get install dcmtk操作命令:./echoscu -d -aet TEST -aec PACS 192.168.11.60 10088./movescu -d -S -aec DCM4CHEE -aem PACS -k QueryRetrieveLevel=STUDY -k StudyInstanceUID=1.1.1.1.1 192.168.11.1 11112./findscu -d -S -aec PACS 192.168.11.60 10088 -k QueryRetrieveLevel=STUDY -k StudyDate -k StudyDescription -k StudyInstanceUID
在Windows上操作
1234567891. 解压压缩包,进入bin文件夹下,开启CMD窗口2. echo 测试: .\echoscu.exe -d -aet SELF_PACS -aec {PACS AET} {PACS IP} {PACS端口} ...
DICOM-文件解析
参考文献
https://plastimatch.org/dicom_tutorial.html
https://saravanansubramanian.com/makingsenseofdicomfile/
DICOM Elements
DICOM 对象由 DICOM 元素或 DICOM 属性组成.
每个 DICOM 元素都有一个标签、称为 VR(值表示的缩写)的数据类型、长度和值.各行以标签号 (gggg,eeee) 开头,然后是 VR 代码,然后是值(字符串打印在方括号中),然后是井号 (#),后跟元素值长度、逗号,然后是值多重性和标签名称.这张取自 DICOM 标准第 5 章的图中显示了 DICOM 编码元素的方式.
Tags 标签
每个 DICOM 元素都有一个唯一定义该元素及其属性的标签,就像条形码定义超市中的产品一样. DICOM 标签由两个短数字组成,称为“组”和“元素”.彼此相关的 DICOM 标签有时具有相同的组.
Value Representation 价值表示
VR 用两个字符代码表示. VR定义了元素的数据类型. UI 代表唯一标识符,US ...
知识点-大端和小端
参考文献
[嵌入式er笔记]大端小端详解(含代码及详细注释)
计算机中“大端”“小端”是指什么
大端小端真正引入计算机领域,是来自于一位网络协议的早期开创者Danny Cohen,他第一次使用这两个术语指代字节顺序,后来慢慢被大家广泛接受.
字节顺序说的到底是什么,先复习一个基础知识:
位(bit): 计算机中的最小数据单位,计算机存储的都是二进制0和1.
字节(Byte): 字节是存储空间的基本计量单位,也是内存的基本单位,也是编址单位.例如,一个计算机的内存是4GB,就是该计算机的内存中共有4×1024×1024×1024个字节,意味着它有4G的内存寻址空间.
换算关系:
1 GB = 1024 MB
1 MB = 1024 KB
1 KB = 1024 Bytes
1 Byte = 8 bits
【Q】: 思考一个问题,通常描述32位二进制数据,为什么是用8个十六进制数呢?如0x1A2B3C4D
**【A】: **十六进制(hex)是一种逢16进1的进位制.十六进制的数码有1,2,3,4,5,6,7,8,9,A(10),B(1 ...
JUC-Collection-PriorityBlockingQueue
参考文献
Java多线程进阶(三四)—— J.U.C之collections框架:PriorityBlockingQueue
PriorityBlockingQueue
PriorityBlockingQueue,是在JDK1.5时,随着J.U.C包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于堆实现.
PriorityBlockingQueue是一种无界阻塞队列,它具有以下特点:
元素按照权重大小的顺序出队:与其他阻塞队列不同,PriorityBlockingQueue是一种优先级队列。元素不是按照FIFO(先进先出)的方式出队,而是根据元素的权重来确定优先级,权重较小的元素先出队。
无需指定最大容量:与ArrayBlockingQueue不同,创建PriorityBlockingQueue时无需指定最大容量,它是真正的无界队列。它只受系统内存大小的限制,没有预设的最大容量。
元素必须可比较:由于PriorityBlockingQueue是基于元素权重排序的,因此队列中的元素必须可比较。这意味着元素必须实现Comparable接口,以便进行排序。
插入元 ...
JUC Collection-LinkedBlockingQueue
参考文献
Java多线程进阶(三三)—— J.U.C之collections框架:LinkedBlockingQueue
LinkedBlockingQueue
LinkedBlockingQueue是在JDK1.5时,随着J.U.C包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于单链表实现.
LinkedBlockingQueue除了底层数据结构(单链表)与ArrayBlockingQueue不同外,另外一个特点就是:它维护了两把锁——takeLock和putLock。
takeLock用于控制出队的并发,putLock用于入队的并发。这也就意味着,同一时刻,只能只有一个线程能执行入队/出队操作,其余入队/出队线程会被阻塞;但是,入队和出队之间可以并发执行,即同一时刻,可以同时有一个线程进行入队,另一个线程进行出队,这样就可以提升吞吐量。
属性
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 ...
JUC Collection-ArrayBlockingQueue
参考文献
JUC集合: BlockingQueue详解
ArrayBlockingQueue(基于数组的阻塞队列)
队列的容量一旦在构造时指定,后续不能改变;
插入元素时,在队尾进行;删除元素时,在队首进行;
队列满时,调用特定方法插入元素会阻塞线程;队列空时,删除元素也会阻塞线程;
支持公平/非公平策略,默认为非公平策略。
公平策略,是指当线程从阻塞到唤醒后,以最初请求的顺序(FIFO)来添加或删除元素;
非公平策略指线程被唤醒后,谁先抢占到锁,谁就能往队列中添加/删除顺序,是随机的。
属性
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { /** * 内部数组 ...
JUC Collection-BlockingQueue
参考文献
JUC集合: BlockingQueue详解
BlockingQueue
BlockingQueue是Java中的一个接口,用于在多线程环境下实现线程间的安全数据交换.它通常用于生产者-消费者场景,其中一个线程负责向队列中放入对象,另一个线程负责从队列中取出对象.
在这个场景中,生产线程会不断地创建新对象并将其插入到队列中,直到队列达到其容量上限.一旦队列达到临界点,生产线程在尝试插入新对象时会被阻塞.它会一直等待,直到消费线程从队列中取走一个对象.消费线程则会一直从队列中取出对象.如果消费线程尝试从空队列中提取对象,它也会被阻塞,直到生产线程将一个对象放入队列中.
BlockingQueue的实现类有多种,包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等.不同的实现类有着不同的特性和适用场景,但它们都遵循上述的基本原理.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 ...
Java并发编程(十六)-JUC Collections
参考文献
JUC Collections 集合框架
Queue
Blocking Queue阻塞队列
java.util.concurrent.ArrayBlockingQueue:最基础且开发中最常用的阻塞队列,底层采用数组实现的有界队列,初始化需要指定队列的容量.
ArrayBlockingQueue 是如何保证线程安全的呢?它内部是使用了一个重入锁ReentrantLock,并搭配 notEmpty、notFull 两个条件变量Condition来控制并发访问.从队列读取数据时,如果队列为空,那么会阻塞等待,直到队列有数据了才会被唤醒.如果队列已经满了,也同样会进入阻塞状态,直到队列有空闲才会被唤醒.
java.util.concurrent.LinkedBlockingQueue:内部采用的数据结构是链表,队列的长度可以是有界或者无界的.
初始化不需要指定队列长度,默认是Integer.MAX_VALUE.LinkedBlockingQueue 内部使用了takeLock、putLock两个重入锁ReentrantLock,以及notEmpty、notFull两 ...