网络UDP和TCP的区别UDP(用户数据报协议) 是无连接的,不保证数据包的顺序和完整性,适用于实时应用。UDP的特点:
无连接:不需要建立连接即可发送数据。
不可靠:不保证数据包的顺序和完整性,可能丢包。
速度快:由于没有连接建立和确认机制,传输速度较快。
适用场景:实时视频、音频传输,在线游戏等。
TCP(传输控制协议) 是面向连接的,保证数据包的顺序和完整性,适用于需要可靠传输的应用。TCP的特点:
面向连接:在传输数据前需要建立连接(三次握手)。
可靠传输:通过确认机制、重传机制保证数据包的顺序和完整性。
流量控制和拥塞控制:通过滑动窗口、拥塞控制算法防止网络拥塞。
适用场景:文件传输、邮件、网页浏览等。
三次握手和四次挥手三次握手:建立TCP连接的过程,确保双方都准备好进行通信。
客户端发送SYN包(同步序列编号)请求建立连接。
服务器收到SYN包,回复SYN-ACK包(确认同步序列编号)。
客户端收到SYN-ACK包,发送ACK包(确认序列编号),连接建立。
四次挥手:断开TCP连接的过程,确保双方都同意断开连接。
客户端发送FIN包(结束标志)请求断 ...
多态内存资源文章说得很详细(虽然我还是不怎么懂,做个笔记吧)https://github.com/MeouSker77/Cpp17/blob/master/markdown/src/ch29.md
多态分配器这玩意最直接的用法就是控制容器的内存,打个比方在我使用vector容器时一般情况下会这么用
1234567891011121314#include<iostream>#include <vector>using namespace std;class node{public: node(){ cout << "build node!" <<endl; }};int main(){ vector<node> arr; arr.resize(10); return 0;}
不难发现这个这个类构造了10个对象,但是众所周知vector 存储元素的实际位置是在堆上,并且vector在资源不足时会自动进行扩容以 ...
惊群效应惊群问题
惊群问题是计算机科学中,当许多进程等待一个事件,事件发生后这些进程被唤醒,但只有一个进程能获得CPU执行权,其他进程又得被阻塞,这造成了严重的系统上下文切换代价。
解决办法
不希望把所有进程都唤醒,就采用定点唤醒某一个进程的做法
比如说C++在std::condition_variable满足条件,线程唤起时,其实际上并不会唤起所有等待的线程,而是随机唤起一个正在等待的线程。这样做的达到的结果跟唤起所有线程一起争抢锁资源的结果一样,但是可以很大程度上避免系统上下报文的切换
尽量避免进程上下文切换。
采用合适的任务分配策略,减少正在等待线程的数量
参考资料 https://zh.wikipedia.org/wiki/%E6%83%8A%E7%BE%A4%E9%97%AE%E9%A2%98
拓展资料nginx是如何解决惊群效应的https://segmentfault.com/a/1190000044210775
虚假唤醒https://zhuanlan.zhihu.com/p/652823880https://www.cnblogs.com/angdh/p/18267978https://cloud.tencent.com/developer/article/1557403
应用层引起的虚假唤起这种虚假唤起是由不合理的代码逻辑引起的,具体看代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <condition_variable>#include <iostream>#include <thread>#include <queue>#include <string>using namespace std::chrono_literals;std::condition_variable cv;std::mutex mtx;std::queue<std::string> ...
计算机语言
未读构造时有无()的区别 当有()时,会将申请到的成员变量的空间初始化,没有时则不会
1234567891011121314151617#include <iostream>#include <stdio.h>using namespace std;class foo {public: //foo() { cout << "foo's constructor" << endl; } //~foo() { cout << "foo's destructor" << endl; } int a;};int main() { char buf[sizeof(foo)]; foo* a = new (buf) foo;//不会将申请到的int空间初始化 char buf2[sizeof(foo)]; foo* b = new (buf2) foo();//则会将申请到的int空间初始化为0。 pr ...
计算机语言
未读brpc-http:proto的使用官方文档:https://brpc.apache.org/zh/docs/client/access-grpc/issues:https://github.com/apache/brpc/issues/1647
他实际上会先解析http的头部的 Content-Type 字段当Content-Type 中的值为,application/x-protobuf,application/proto,application/grpc 时,他将以protobuf来解析http的包体而其他情况将会 将其以其他情况解析(默认json)源码片段
12345678910111213141516171819202122232425262728293031323334if (ct.starts_with("grpc")) { if (ct.size() == (size_t)4 || ct[4] == ';') { if (is_grpc_ct) ...
code-server 安卓手机termux环境搭建在这里是使用的termux这个app。如果手机没有root会有一些限制,比如说无法挂载磁盘,无法访问手机文件。但是跑一些服务是完全没有问题的。
先把termux下载好
安装ssh查看ip
12345678910111213141516# 安装ssh相关依赖 pkg install opensslpkg install openssh# 创建ssh密钥ssh-keygen -Assh-keygen# 设置密码passwd# 查看用户名和ipwhoamiifconfig# 开启ssh服务sshd
code-server安装官方文档https://coder.com/docs/code-server/latest/termux
1234567891011121314151617# 先在电脑上用 ssh连接上手机 (在电脑端链接手机敲太难受了)ssh username@ip -p 8022# 安装相关依赖pkg install -y tur-repo python python3pkg install -y code-servertermu ...
ngnix引用自大佬的博客:https://www.cnblogs.com/hanease/p/15890509.html
基本命令1234nginx -t 检查配置文件是否有语法错误nginx -s reload 热加载,重新加载配置文件nginx -s stop 快速关闭nginx -s quit 等待工作进程处理完成后关闭
默认配置123456789101112131415161718192021222324252627282930313233343536373839# 工作进程的数量worker_processes 1;events { worker_connections 1024; # 每个工作进程连接数}http { include mime.types; default_type application/octet-stream; # 日志格式 log_format access '$remote_addr - ...
openresty入门搭建安装依赖 pcre-devel openssl-devel gcc curl
下载安装包 官网: https://openresty.org/en/download.html
下载最新版
123456wget https://openresty.org/download/openresty-1.19.9.1.tar.gztar -zxvf openresty-1.19.9.1.tar.gzcd openresty-1.19.9.1/./configuresudo make -j6sudo make install
要是报
1gmake[1]: cc: Command not found
则是没有cc指令(其实就是gcc)可以先看看gcc的位置,再创建软链接
12gccPath=$(which gcc)ln -sf $gccPath /bin/cc
再添加环境变量,以及赋权
123echo 'export PATH=$PATH:/usr/local/openresty/bin' >> ~/.bashrcsudo c ...
进程和线程的通信进程间通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字(socket)共六种
1.管道本质:管道的本质其实就是内核中的一块缓冲区,多个进程通过访问同一个缓冲区就可以实现进程间的通信。分类:匿名管道,命名管道
1.1匿名管道没有具体的文件描述符,只能适用于具有亲缘关系的进程间通信,父进程在创建管道的时候操作系统会返回管道的文件描述符,然后生成子进程时,子进程会通过拷贝父进程的pcb来获取到这个管道的描述符。读写特性:1. 没数据 read 阻塞。2. 满数据,write 阻塞。3. 所有读端pipefd[0]关闭,调用 write 导致异常退出进程。4. 所有写端pipefd[1]关闭,调用 read 读完数据,返回0。
1.2命名管道命名管道也是内核中的一块缓冲区,但是它具有标识符,这个标识符是一个可见于文件系统的管道文件,能够被其他进程找到并打开管道文件来获取管道的操作句柄。open打开命名管道的特性:1. 若文件以只读打开,则会阻塞,直到文件被以写的方式打开。2. 若文件以只写打开,则会阻塞,直到文件被以读的方式打开。
管道的特性:(1).半双工通信(数据 ...
进程1.什么是进程?程序:程序是指令和数据的集合进程:进程就是程序的一次执行过程,是系统进行资源分配和调度的基本单位
2.如何操作进程?设立了PCB (进程控制块),其内容如下。标示符:描述本进程的唯一标示符,用来区别其他进程。状态:任务状态,退出代码,退出信号等。优先级:相对于其他进程的优先级。程序计数器:程序中即将被执行的下一条指令的地址。内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据:进程执行时处理器的寄存器中的数据。I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。 其他信息CPU对进程的调度使用CPU通过PCB中的内存指针来找到程序在内存中的地址,通过上下文数据来记录运行中程序的各种信息,通过程序计数器来找到这个程序即将执行的下一条指令的地址。
3.进程的状态三种基本状态:就绪、运行、阻塞五种状态:新建状态,就绪状态,运行状态,阻塞状态,退出状态。
4.子进程当我们在一个已经创建的进程内通过fork创建一个新的进程时,这个 ...
僵尸进程和孤儿进程1.什么是进程?程序:程序是指令和数据的集合进程:进程就是程序的一次执行过程,是系统进行资源分配和调度的独立单位
2.为什么需要进程?引入多道程序技术后为了方便管理,完成对各个程序的并发执行,引入了进程
3.如何操作进程?操作系统为了能够使每个程序能够独立运行,在操作系统中为其配置了一个数据结构,也就是我们通常所说的PCB(Process Control Block),PCB 是进程运行相关的信息集合。
孤儿进程:父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程。孤儿进程最终会被init进程(进程号为1)所收养,因此init进程此时变成孤儿进程的父进程,并由init进程对它们完成状态收集工作。(linux下,init是内核启动的第一个用户级进程,init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。)
僵尸进程:一个进程使用fork创建子进程,如果子进程退出执行后,父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。如果进程不调用w ...










