DNS协议
DNS是应用层协议,基于UDP协议, 端口为53 域名结构树例如 www.baidu.com 从后面往前面看,实际上这个域名是www.baidu.com.root, 表示又root管理的com下的baidu的www(主站, 同一级别的还有mail, member,space) 根域名服务器:上面的root就是根域名服务器, 现在有13个, 发送一个请求后,通过任播找到最近的根域名服务器顶级域名服务器:之后根域名服务器会去顶级域名服务器(top level domain, 简称TLD), 有com, cn, net, gov等等权威域名服务器:比如baidu, qq, bilibili等,又顶级域名服务器管理主机: 本地主机 DNS工作流程 DNS查询过程分为两种模式: 迭代: 本地DNS使用轮询迭代的方式查询IP 递归: 浏览器向本地DNS查询IP 和 本地DNS返回浏览器IP使用的是递归的过程 第一步:拿到请求,解析请求响应,发送到解析器DNS客户端(看成一个程序)第二步:解析器发送解析请求到本地DNS服务器(由于本地网络有DNS服务器的IP,...
2024CCPC重庆题解
J. 筛子在n行m列的网格的最左上角的格子上,有一个边长和网格格子边长相等的骰子。 初始,这个骰子1在顶面,2朝前,3朝右,i的背后是7−i, 现在你可以做任意多次操作,每次操作为以下两种:• 若当前骰子所在的格子没有数字,在这个格子上写下骰子底面的数字;• 选择上下左右四个方向的某一个,将骰子沿着这个方向滚一次:选择骰子底面对 应方向的棱,将骰子沿着这条棱旋转九十度。你不能将骰子滚出网格。 . 注.意: .你 .可 .以 .在 .骰 .子 .经 .过 .一 .个 .没 .有 .数 .字 .的 .格 .子 .时 .选 .择 .不 .在 .这 .个 .格 .子 .上 .写 .下 .骰 .子 .底 .面 . 的.数 .字。 你希望最大化最后网格上所有写过数字的格子的数字的和。 解 注意到只要有 2 2的空间,那么经过一系列操作后所有格子都必然可以刻上数字6, 所有只要有一个 2 2空间答案就是 6 * 格子数量,...
操作系统 --进程与线程篇
进程和线程区别 进程(Process) 操作系统资源分配的基本单位 每个进程有自己独立的地址空间(代码段、数据段、堆、栈) 程序一旦运行,就会至少有一个进程 切换开销大,因为需要切换整个内存地址空间、文件描述符等上下文 线程(Thread) 程序执行的最小单位,是 CPU 调度的基本单位 一个进程可以包含多个线程 线程共享进程的地址空间,但有自己独立的栈和寄存器 切换开销小,多个线程共享进程资源,只需切换少量上下文(寄存器、栈指针) 👉 直观类比: 进程 = 公司(独立运作,有资源) 线程 = 公司里的员工(共享公司资源,但干不同的活) ...
操作系统 --基础篇
操作系统的内核(Kernel)和中央处理器(CPU,Central Processing Unit)区别: 操作系统的内核(Kernel)属于操作系统层面,而 CPU 属于硬件。 CPU 主要提供运算,处理各种指令的能力。内核(Kernel)主要负责系统管理比如内存管理,它屏蔽了对硬件的操作。 下图清晰说明了应用程序、内核、CPU 这三者的关系。 用户态和内核态 用户态: 用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限,当需要执行某些特殊权限的时候,例如读写磁盘,网络通信,就需要向操作系统申请资源权限。 内核态: 内核态的权限很大,几乎可以完成对系统的所有操作 操作系统得到指令后,会从用户态转移到内核态,执行对磁盘的操作后将结果返回进程,后转回用户态 虽然拥有更高的权限,但是由于进入内核态时候的上下游调用,开销花费较大,所以要尽量减少进入内核态的次数 用户态: 应用程序,库函数内核态: 进程管理,网络管理,数据管理,内核管理, 设备管理 为什么要有用户态,只要一个内核态不行吗?答: 内核态:CPU...
Go光速入门
Go语言基本语法与使用一、变量 变量声明Go中的变量声明和Java中有所不同,主要有一下几种格式 标准格式 1var 变量名 变量类型 以关键字var开头,最后不用加分号 批量声明 如果我们要声明多个变量,一个一个的声明会比较繁琐,这时就有了批量声明 12345var( 变量1 变量类型 变量2 变量类型 ......) 变量初始化Go语言在声明变量时,自动对变量对应的内存区域进行初始化工作。也就是说,如果我们声明了变量而没有赋值,那么**编译器**会给变量赋各个类型对应的零值。和Java不同,Java只会对成员变量和常量赋默认零值,对于局部变量则会报错 标准格式 1var 变量名 变量类型 = 表达式 类型推导 由于Go是强类型语言,其实我们可以通过给变量赋的值来推导出变量的类型,这就是所谓的类型推导,于是就有了我们下面的这种写法: 1var 变量名 =...
LRU
LRU 核心思想:优先淘汰最不被使用的元素,保留最经常被访问的k个元素,使得o(1)时间内高效完成对数据的查询操作,又兼顾了空间问题 “最近使用”意味着一个数据被读取或者写入后,其“使用时间”被更新到当前时间点。 “最少使用”即最长时间未被访问,则是最“冷”的数据,应被淘汰。 常用于操作系统页面置换,数据库缓存,web缓存等场景 12345678910111213141516171819202122232425262728293031323334353637383940#include<bits/stdc++.h>using namespace std;class LRU {public: LRU() {} LRU(int capacity_) : capacity(capacity_) {} int get(int key) { auto it = mp.find(key); if (it != mp.end()) { ...
codeforce1021div2D_BaggageClaim
题意每个机场都有一个行李索赔区,巴尔贝索沃机场也不例外。在某个时候,Sheremetyevo的一位管理员提出了一个不寻常的想法:将行李索赔传送带的传统形状从轮播更改为更复杂的形式。 假设行李索赔区域表示为大小 n×m 的矩形网格。管理局提出,输送机的路径应通过 p1,p2,…,p2k+1 的单元,其中 pi=(xi,yi) 。 对于每个单元格 pi 和下一个单元格 pi+1 (其中 1≤i≤2k ),这些单元格必须具有共同的侧面。此外,路径必须很简单,这意味着对于没有一对索引 i≠j ,如果单元格 pi 和 pj 的单元格。 不幸的是,路线计划被溢出的咖啡意外宠坏了,只保留了带有奇数指数的细胞: p1,p3,p5,…,p2k+1 。您的任务是确定给定这些 k+1 单元格的原始完整路径 p1,p2,…,p2k+1 的方法数量。 由于答案可能很大,因此输出它模拟 109+7 。 思路首先对于 p2i−1,p2i+1 ,如果 |p2i−1−p2i+1|≠2 的话答案一定是 0 ,即我们无法通过两步的操作从 p2i−1 走到 p2i+1 接下来我们进行建图,如果 p2i−1 与...
CodeforcesRound1018,Div.1+Div.2
A. Wonderful Sticks12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include<bits/stdc++.h>using namespace std;using i64 = long long;void solve() { int n; string s; cin >> n >> s; vector<int> f(n + 1); f[1] = 1; for (int i = 1; i < n; i++) { if (s[i - 1] == '>') { f[i + 1] = 1; } } vector<int> pos; for (int...
