操作系统 --进程补充
...
操作系统 --进程补充
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件) 1. 用户级线程用户级线程是由用户态线程库创建、调度和管理的线程,内核对其不可见,内核只知道进程的存在。 常见线程库: 早期 POSIX 线程实现 协程(coroutine) Go 的 goroutine(本质是用户级调度) 从内核视角看,只能看到进程A, 而从用户视角看可以看到进程A,以及下面的线程1, 2, 3… 2. 内核级线程内核级线程是由操作系统内核直接创建、调度和管理的线程,每个线程都是内核调度的基本单位。 操作系统是可以明确感知内核级线程的存在的,实际上再linux系统里面,内核级线程是轻量的进程,都是用clone出来的,只是分配的资源少? 3. 二者比较用户级线程:...
redis+lua
Lua 的定位 轻量级脚本语言 解释执行 极其简单 嵌入式友好(Redis / Nginx / 游戏引擎) 最常见的 3 个地方 场景 用途 Redis 原子操作、事务逻辑 Nginx (OpenResty) 鉴权、限流、灰度 游戏服务器 配置、热更新 其操作保证原子性 基础语法变量&类型1234local a = 10 --numberlocal b = "hello" --stringlocal c = true -- boollocal d = nil -- nil Lua只有4种基本类型,string -> int用tonumber Lua没有struct,map之类,全靠table实现: 当数组用 12local arr = {1, 2, 3}print(arr[1]) -- 1(下标从1开始) 当map用 12local m = {}m["xx"] =...
ElasticSearch基础
es安装使用docker安装es 拉取镜像 1docker pull elasticsearch:7.12.0 创建docker容器挂在的目录: (windows手动创建) 1234# linux的命令mkdir -p /opt/es/config & mkdir -p /opt/es/data & mkdir -p /opt/es/pluginschmod 777 /opt/es/data 配置文件 1echo "http.host: 0.0.0.0" > /opt/es/config/elasticsearch.yml 创建容器 123456# linuxdocker run --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v...
sync-Pool
1. 引入实现一个简单序列化器,把map[string]int 序列化: 123456789101112func JsonMar1(m map[string]int) (string, error) { var buf bytes.Buffer buf.Write([]byte(`{"data":{`)) for k, v := range m { buf.Write([]byte(`"` + k + `":` + strconv.Itoa(v) + `,`)) } if len(m) > 0 { buf.Truncate(buf.Len() - 1) } buf.Write([]byte(`"}}`)) return buf.String(), nil ...
AES加密算法
AES概念详解什么是 AES?AES(Advanced Encryption Standard)是一种分组对称加密算法,加密单元固定为 128 bit(16 字节)。它支持三种密钥长度: AES-128 → 10 轮 AES-192 → 12 轮 AES-256 → 14 轮 AES 是现代密码学的基石,被广泛用于 HTTPS、VPN、磁盘加密、移动支付等场景。 AES 的数据结构AES 以一个 16 字节的数据块为单位工作,把这 16 个字节组织成一个 4×4 字节矩阵(state),列优先存储: 1234s0 s4 s8 s12s1 s5 s9 s13s2 s6 s10 s14s3 s7 s11 s15 每轮加密都会对这个矩阵进行一系列固定变换。 AES 的四大核心操作AES 的每一轮由四个步骤构成(最后一轮不含 MixColumns): 1. SubBytes(字节代换)使用固定的 非线性 S-box 对每个字节独立替换。S-box 的构造包含: 在 GF(2^8) 中求逆元 进行一次仿射变换 这是 AES...
FTP协议
FTP 全面解析:原理、实现机制与现代应用1. FTP 的设计初衷FTP(文件传输协议)诞生于上世纪 70 年代,是最早的互联网协议之一,目的是: 在网络中可靠地传输文件,同时允许用户对远程文件系统进行一定程度的控制。 当时的网络没有 NAT、没有家庭路由器、没有复杂防火墙,因此 FTP 的协议设计非常简单直观,但这也导致了它在现代环境中问题较多。 2. FTP 的协议工作原理FTP 是一个 基于 TCP 的应用层协议,使用 两个 TCP 连接: 2.1 控制连接(Control Connection) 使用 TCP 端口 21。 长连接,一直保持。 用于发送命令(如 USER、PASS、LIST、RETR、STOR)。 用于接收服务器的响应(如 200 OK、226 Transfer complete)。 2.2 数据连接(Data Connection) 用于真正传输文件内容或目录列表。 在不同模式下,端口不同(见下一节)。 数据连接是 FTP 的最大特点 →...
2023CCPC桂林题解 MGKBHI
M. Flipping CardsM. Flipping Cards 签到, 二分可选的最大中位数,把大于该中位数的视为1,小于该位的视为0, 每次check dp下最大能取到的比该为数字大的次数,大于 n / 2 + 1则状态可达, 其中dp状态0表示还未进入,1表示正在翻转中,2表示此前已经翻转过 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<bits/stdc++.h>using namespace std;using i64 = long long;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<i64> a(n + 1), b(n + 1); for (int i = 1; i <= n; i++)...
ABC432 题解DE
D - Suddenly, A Tempest给定一个默认矩阵,以左下角和右上角顶点表示,初始设置为(0, 0) 和 (X0, Y0) 其中X0, y0 属于【1, 1e8】有N次风暴, 每次风暴分X操作和Y操: X操作输入A, B, 把x坐标小于A的所有矩阵全部向下移动B个单位, 把y坐标大于A的所有矩阵全部向上移动B个单位 Y操作输入A, B, 把x坐标小于A的所有矩阵全部向左移动B个单位, 把y坐标大于A的所有矩阵全部向右移动B个单位 其中求所有N此操作后分成的矩阵块和每个矩阵的个数。 解: 考虑到N比较小,定义一个struct模拟风暴中所有的矩阵块,初始值是默认矩阵块, 用一个vector维护当前所有的矩阵块,初始值只有一个默认矩阵 每次风暴来时候如果X或者Y操作会切割矩阵,...
批量任务Worker池
在日常开发中时常会遇到批量任务: 批量创建, 批量查询, 批量xxx, 如果按照串行编码, 那么任务队列每次都只有一个任务被执行,十分缓慢,我们考虑使用以下一个简易Worker线程工厂(个人简易实现有错误请指出) Controller层:注册下这个方法12345678910111213141516171819package controller import ( "awesomeProject/server" "fmt") func BatchJob() { req := &server.BatchJobReq{ IdList: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,...
