这是置顶的posts 关于ACSA实验室 官网 https://acsa.ustc.edu.cn/ 半个僵尸网站吧,主要没人负责维护内容,内容陈旧,主要大家太忙了。 News 截至21年 11月12日 首届英特尔AI全球影响力嘉年华,AI影响力创造者(Creator)赛道18岁以上组全球最高奖项,以及中国区总冠军。 中国科大在“神威-太湖之光”上首次实现千万核心并行第一性原理计算模拟,后续被评为国家科学技术奖,习主席两院报告有提及 中国科大夺得ISC20国际大学生超算竞赛冠军 林涵师兄获得华为天才少年称号百万年薪
Linux Network Command Guide
ip rule 与 ip route 传统路由 传统路由是基于目的地址来路由,如route命令。但是已经不再被使用。 $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 0.0.0.0 0.0.0.0 U 0 0 0 warp default 202.38.73.254 0.0.0.0 UG 0 0 0 eno0 显示所有的流量都走名为warp的wireguard虚拟网卡。如果第一条wg的路由规则,所有流量原本应该走网关202.38.73.254 参数基本说明 Metric 路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的 (Linux内核不再使用) Ref 是路由项引用次数 (Linux内核不再使用) 相关Flags含义: U 路由是活动的 G 需要经过网关 ! 拒绝路由 n 表示该路由是一个主机路由(而不是网络路由) $ route -6 Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If [::]/0 [::] !
Algorithm
LeetCode解题思路 从问题的反面,所求值的补集,不同的变量来划分讨论情况入手 以简洁的代码解答优先,而不是追求O(n)的算法,导致解法复杂化 辅助数据结构的选择一定要切合题意。 存储中间数据,或者标记已经处理的情况(DP时记录hit值的次数,而不是是否hit,以便回退) 利用二维数组精简讨论的代码int direction[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,-1}, {1,2}, {1,-2}, {-1,2}, {-1,-2}}; LeetCode 常见算法 拓扑排序 拓扑排序常用来确定一个依赖关系集(图关系)中,事物发生的顺序。 带信号量判断的无依赖队列来实现,入队无依赖集合,出队的无依赖元素(add to result)去除后续元素的依赖信号量,信号量为0代表无依赖,可以入队。 无环图(树图)中最长距离 找到图中距离最远的两个节点与它们之间的路径: 以任意节点 pp 出现,利用广度优先搜索或者深度优先搜索找到以 pp 为起点的最长路径的终点 xx; 以节点 xx 出发,找到以 xx 为起点的最长路径的终点 yy; xx 到 yy 之间的路径即为图中的最长路径,找到路径的中间节点即为根节点。 树状数组 https://leetcode-cn.com/circle/article/9ixykn/ https://leetcode-cn.com/problems/range-sum-query-mutable/ 广度搜索确定图中各点对0点最近距离 //input [[0,1],[1,2]] //维护 vector<vector<int>> adj(n); //先找出每个点的有关边 vector<bool> visit(n, false); //维护已访问元素 queue<int> qu; qu.emplace(0); visit[0] = true; int dist = 1; while (!
C++ : stdlib DataStructure
auto 当你想要拷贝range的元素时,使用 for(auto x : range). 当你想要修改range的元素时,使用 for(auto && x : range) 当你想要只读range的元素时,使用 for(const auto & x : range). 容器转换 begin end vector<int>& nums1 unordered_set<int> nums_set(nums1.begin(), nums1.end()); unordered_set<int> result; return vector<int>(result.begin(), result.end()); string 遍历 string s; for(auto && x : s) 打印string printf("%s", your_string.c_str()); //不推荐 cout << your_string; string不同于C语言的char来存储字符串 //复制 str3 = str1; len = str3.size(); //连接 str1 = str1 + str2; strcat( str1, str2); //总长度 len = str3.size(); strlen(s1); C++ string 成员函数 length() 等同于 size(),但是和 C 库函数 strlen() 有着本质区别
Intel Pin
简介 Pin 是一个动态二进制插桩工具: 支持 Linux, macOS 和 Windows 操作系统以及可执行程序。 Pin可以通过pintools在程序运行期间动态地向可执行文件的任意位置插入任意代码(C/C++),也可以attach到一个正在运行的进程。 Pin 提供了丰富的API,可以抽象出底层指令集特性,并允许将进程的寄存器数据等的上下文信息作为参数传递给注入的代码。Pin会自动存储和重置被注入代码覆盖的寄存器,以恢复程序的继续运行。对符号和调试信息也可以设置访问权限。 Pin内置了大量的样例插桩工具的源码,包括基本块分析器、缓存模拟器、指令跟踪生成器等,根据自己的实际需求进行自定义开发也十分方便。 基本原理 基本流程: Pin 会拦截可执行文件的第一条指令,然后对从该指令开始的后续的指令序列重新“compile”新的代码,并执行 Pin 在分支退出代码序列时重新获得控制权限,基于分支生成更多的代码,然后继续运行。 Pin机制类似Just-In-Time (JIT) 编译器, 特点: 只是它的输入不是字节码,而是可执行文件的执行汇编代码(机械码)。 Pin 对所有实际执行的代码进行插桩,但是如果指令没有被执行过,就一定不会被插桩。 工作在操作系统之上,所以只能捕获用户级别的指令。 同时有3个程序运行:应用程序本身、Pin、Pintool。 应用程序是被插桩的对象、Pintool包含了如何插桩的规则(用户通过API编写的插入位置和内容) 三者共享同一个地址空间,但不共享库,避免了冲突。 Pintool 可以访问可执行文件的全部数据,还会与可执行文件共享 fd 和其他进程信息。 API 最重要的是 插桩机制(instrumentation code):插入位置,在什么位置插入什么样的代码 分析代码(analysis code):插入内容,在插桩点执行的代码 基本使用Pintool Debug分析pin tool流程 目标:以样例插桩工具的源码为对象,熟悉pin的debug流程。 以官方教程为例子: uname -a #intel64 cd source/tools/ManualExamples make all OPT=-O0 DEBUG=1 TARGET=intel64 |tee make.log|my_hl ../../../pin -t obj-intel64/inscount0.
Java
java运行的特点 JVM(java虚拟机) Just-In-Time (JIT) 编译器 JIT编译器是一种动态编译技术,它将程序的一部分或者全部源代码或更常见的字节码在运行时编译成机器码,然后将编译后的代码替换原来的代码。 字节码(英语:Bytecode)通常指的是已经经过编译,但与特定机器代码无关,需要解释器转译后才能成为机器代码的中间代码(多为虚拟机代码)。典型应用为Java虚拟机里的Java bytecode。 主要优点是可以在运行时根据程序的运行情况进行优化,从而提高程序的执行效率。 字节码编译是跨平台的,便于移植的。 主要缺点是编译字节码导致的延迟和空间开销较大,因此只有在程序运行时间较长的情况下才能体现出优势。 是提前编译(AOT)和字节码解释器(python的实现)的结合体,它的执行效率介于两者之间。 区别 Java Virtual Machine (JVM) is an abstract computing machine. Java Runtime Environment (JRE) is an implementation of the JVM. Java Development Kit (JDK) contains JRE along with various development tools like Java libraries, Java source compilers, Java debuggers, bundling and deployment tools. Just In Time compiler (JIT) is runs after the program has started executing, on the fly.
Network Services
计算机网络基本概念 20世纪50年代末,正值美苏冷战时期的美国军方设计了军用网络"阿帕网ARPANET", 当时的还只支持同构设备间的连接,TCP/IP的提出标志着万物互联的到来。 多层网络模型 计算机网络体系结构分为3种:OSI体系结构(七层),TCP/IP体系结构(四层),五层体系结构。 OSI模型(开放式系统互联模型Open System Interconnection Model) 也称开放系统互连参考模型,简称OSI/RM(Open System Internetwork Reference Model) 概念清楚,理论也比较完整,但是它既复杂又不实用。 由国际标准化组织(ISO)于1985年提出,并试图成为计算机在世界范围内互连为网络的标准框架,它具有七层网络结构。 TCP/IP模型 互联网协议套件(Internet Protocol Suite,IPS)是多个网络传输协议的集合,它为网际网络的基础通信提供架构支撑。 由于该协议族中最核心的两个协议分别为 TCP(传输控制协议)和 IP(网际协议),因此它也被称为 TCP/IP 协议族(TCP/IP Protocol Suite 或 TCP/IP Protocols),简称 TCP/IP。 1974年,卡恩和瑟夫(Internet 之父)发表的《关于分组交换的网络通信协议》的论文正式提出TCP/IP。 五层体系结构:为了方便学习,折中OSI体系结构和TCP/IP体系结构,综合二者的优点,这样既简洁,又能将概念讲清楚。 五层网络模型各层功能: 应用层:应用层是网络协议的最高层,主要任务通过进程间的交互完成特定网络应用。应用层协议定义的是应用程序(进程)间通信和交互的规则。 对于不同的网络应用需要有不同的应用层协议,在互联网中的应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,等等。 应用层交互的数据单元称为报文。 运输层:有时也译为传输层,它负责为两台主机中的进程提供通信服务,通过端口号进行区分。该层主要有以下两种协议: 传输控制协议 (Transmission Control Protocol,TCP):提供面向连接的、可靠的数据传输服务, 为了提供这种可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制 数据传输的基本单位是报文段(segment); 用户数据报协议 (User Datagram Protocol,UDP):提供无连接的、尽最大努力的数据传输服务,但不保证数据传输的可靠性, 数据传输的基本单位是用户数据报。 网络层:网络层负责为分组网络中的不同主机提供通信服务,并通过选择合适的路由将数据传递到目标主机。 把运输层产生的报文段或用户数据封装成分组或包进行传送。 网络层IP提供的是一种不可靠的服务。只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。 IP层有一个数据报要传,而且数据的长度比链路层的最大传输单元MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。 减小MTU会降低通讯延迟(通讯一次的数据变少),但是每帧里的有效数据占比会变少。 在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫IP数据报。 数据链路层:数据链路层通常简称为链路层。数据链路层在两个相邻节点传输数据时, 将网络层交下来的IP数据报组装成帧,在两个相邻节点之间的链路上传送帧。 以太网数据帧的物理特性是其长度必须在46~1500字节之间 数据链路层将待发送的数据分为多组,并采用循环冗余校验(CRC,Cyclic Redundancy Check)技术为每组数据生成冗余校验码,之后将每组数据和其校验码共同构成一帧后再发送出去。 数据链路层分为上层LLC(逻辑链路控制),和下层的MAC(介质访问控制) 物理层:保数据可以在各种物理媒介(缆线,微波)上进行传输,为数据的传输提供可靠的环境。 考虑信号传输(物理线材,线材接口,电压,频率)以及信道复用,和全双工信道实现等问题。 物理层设备:网卡、光纤、CAT-5网线、RJ-45网线水晶接头、串口、并口 网络报文构建并传输 实例分析 一个HTTP网络请求,如何被多层协议包装,变成网络链路上的二进制,然后又被解析。
BitTorrent
BT简述 BitTorrent (简称 BT) 协议是和点对点(point-to-point)的协议程序不同,它是用户群对用户群(peer-to-peer, 或简写为 P2P) 传输协议, 它被设计用来高效地分发文件 (尤其是对于大文件、多人同时下载时效率非常高)。该协议基于HTTP协议,属于TCP/IP应用层。 将文件划分成多块(默认256Kb一块),每块可以从网络中不同的用户的BT客户端处并行下载。 BT 下载的文件都是别人上传给你的。 BT 下载速度均来自其他下载同一资源的用户上传速度。 上传的用户越多,你的下载速度越快,相反没用户上传你就没有下载速度。 比特彗星,包括其他 BT 软件(迅雷除外,迅雷不是会员会限速,高速通道下载提高的速度一部分就是接触限速后获得的)都不会限制下载速度。 BT分享规则 与迅雷不同,BT旨在“人人为我,我为人人”。用户和用户之间对等交换自己手中已有的资源。如果任何一方试图白嫖另外一方的资源,而自己不愿意上传自己的资源,那么那方就会被人视作吸血者而被踢出这个交换,下场是没有人会愿意和你交换数据,你的下载速度也就归零。 如果把上传速度限制为了10KB/s,10KB/s是BitComet上传最低限速,很大时候就这10KB会被包含DHT查询、向Tracker服务器注册,连接用户所产生的上传全部占满。在下载种子的时候,其他用户连上你是只能拿到1~2KB/s甚至一点都没有的。 现在的BT下载客户端都可以做到智能反吸血,所以基本想和交换数据的用户都把你当作Leecher(吸血鬼)Ban(封禁)处理了,故没有下载速度不足为奇。 一般来说,只要预留50KB/s的上传给其他网页浏览、聊天就可以了,在下载时应该尽量把上传留给那些和你交换资源的用户,这样才不会被他们视作你在吸血进而屏蔽你。 如果上传不足,就应该主动限制自己的下载速度,否则单位时间下载量远超过上传量反而会遭来更多的屏蔽,对下载速度提升更加不利。 BT基本流程 .torrent 种子文件本质上是文本文件,包含Tracker信息和文件信息两部分。Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置。 下载时,BT客户端首先解析种子文件得到Tracker地址,然后连接Tracker服务器。 Tracker服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。 下载者再连接其他下载者,根据种子文件,两者分别告知对方自己已经有的块,然后交换对方所没有的数据。 此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。 下载者每得到一个块,需要算出下载块的Hash验证码与种子文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。 docker部署 以qBit的docker为例,参考linuxsever的docker-compose如下:(qBit相对于Transmission有多线程IO的优势) --- version: "2.1" services: qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest container_name: qbittorrent environment: - PUID=1000 - PGID=1000 - TZ=Etc/UTC - WEBUI_PORT=8080 volumes: - /addDisk/DiskNo4/qBit:/config - /addDisk/DiskNo4/bt:/downloads network_mode: host restart: unless-stopped 然后通过webUI http://222.195.72.218:8080/管理。 如果不想网络通过wireguard,而是本地可以如下设置 测速 先用 https://www.
C & C++
常见函数 类型转换 stoi // string to int atoi // string to int atoi()和stoi()的区别 atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char*类型的,而stoi()的参数是const string*,不需要转化为 const char*; stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error! atoi()不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界; //char to int int(ch) - 48 int(ch-'0') stod stof // string to double /float c_str() // string to char* to_string // int to string static_cast< float >() // int to float std::to_string(someInt).c_str() //int to char* (float) //或者最简单的 to_chars // c++17最快转换 cerr 其他
Family Wi-Fi
Wi-Fi Wi-Fi是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关,也常有人把Wi-Fi当做IEEE 802.11标准的同义术语。 Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词,Wi-Fi还出现在ITAA的一个论文中。但事实上,Wi-Fi一词没有任何意义,也是没有全写的。 WiFi4/5/6 WIFI6 是802.11ax协议,支持2.4GHz和5GHz,支持更多的技术,更高的调制方式。比如 调制模式方面,WiFi 6 支持 1024-QAM,高于 WiFi 5 的 256-QAM,数据容量更高,意味着更高的数据传输速度; 此外,WiFi 6 加入了新的 OFDMA 技术,支持多个终端同时并行传输,有效提升了效率并降低延时,这也就是其数据吞吐量大幅提升的秘诀。 WiFi6通过更优质的Long DFDM Symbol发送机制,将每个信号载波发送时间从WiFi5的3.2μs提升到12.8μs,有效降低丢包率和重传率,使传输更加稳定。 WiFi6容量更大:多用户MU-MIMO技术允许电脑讯网时间多终端共享信道,使多台手机/电脑一起同时上网,从此前低效的排队顺序通过方式变成为“齐头并进”的高效方式。 各种网络及速率 无线路由器发展到现在有IEEE802.11b、IEEE802.11g、IEEE802.11a、IEEE802.11n、IEEE802.11ac标准,对应的无线速率分别是11Mbps、54 Mbps、150 Mbps、300Mbps、1Gbps。这里的无线速率指的是无线传输通过的最高速率。 这里拿300Mbps的无线路由器速率来说一下路由器的传输速度,300Mbps无线路由器指的是传输和接收最大能通过的速率,一般看到的只是传输的速度,也就是只能看到一半的速度,也就是150Mbps,这个是理论速率,但是在实际使用过程中由于环境的干扰,会有衰减。所以在实际使用过程中都只剩下110 Mbps左右。 WLAN WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来。 WLAN起步于1997年。当年的6月,第一个无线局域网标准IEEE802. 11正式颁布实施,为无线局域网技术提供了统一标准,但当时的传输速率只有1~2 Mbit/s。随后,IEEE委员会又开始制定新的WLAN标准,分别取名为IEEE802.11a和IEEE802. 11b。IEEE802. llb标准首先于1999年9月正式颁布,其速率为11 Mbit/s。经过改进的IEEE802. 11a标准,在2001年年底才正式颁布,它的传输速率可达到54 Mbit/s,几乎是IEEE802. llb标准的5倍。尽管如此,WLAN的应用并未真正开始,因为整个WLAN应用环境并不成熟。 目前使用最多的是802. 11n(第四代)和802. 11ac(第五代)标准,它们既可以工作在2.4 GHz频段也可以工作在5 GHz频段上,传输速率可达600 Mbit/s(理论值)。但严格来说只有支持802. 11ac的才是真正5G,现来在说支持2.4 G和5G双频的路由器其实很多都是只支持第四代无线标准,也就是802. 11n的双频,而真正支持ac 5G的路由最便宜的都要四五百元甚至上千元。 移动网络 4G与5G的区别 在有线介质上传播数据,想要高速很容易,实验室中,单条光纤最大速度已达到了26Tbps。 无线电磁波传播,才是瓶颈。 3/4/5G的频率 3G的四种标准和频段:CDMA2000、WCDMA、TD-SCDMA、WiMAX,1880MHz-1900MHz和2010MHz-2025MHz。 4G的频率和频段是:1880-1900MHz、2320-2370MHz、2575-2635MHz。 我国的5G初始中频频段,3.3-3.6GHz、4.8-5GHz两个频段。24.75-27.5GHz、37-42.5GHz高频频段正在征集意见。国际上主要使用28GHz进行试验 路由器 MAC地址20-6B-E7-DB-D7-33 WAN口与LAN口 WAN是英文Wide Area Network的首字母所写,即代表广域网;而LAN则是Local Area Network的所写,即本地网(或叫局域网)。WAN口主要用于连接外部网络,而LAN口用来连接家庭内部网络,两者主要会在标识上面有区别,此外大部分路由器的WAN口只有一个,LAN口则有四个或以上。