计算机语言
未读构造时有无()的区别 当有()时,会将申请到的成员变量的空间初始化,没有时则不会
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 ...
操作系统
未读多路IO复用https://blog.csdn.net/qq_46312987/article/details/124213418
零拷贝优化传统的网络编程中,将磁盘文件写入网卡需要进行四次拷贝和四次上下文切换。磁盘文件–DMA拷贝->(内核态)缓存区–CPU拷贝->(用户态)用户缓存区–CPU拷贝->(内核态)socket缓冲区–DMA拷贝->网卡。
DMA拷贝:DMA的原理是CPU将需要迁移的数据的位置告诉给DMA,包括源地址,目的地址以及需要迁移的长度,然后启动DMA设备去完成相应的操作,最后通过中断反馈给CPU,结束。
Mmap优化:mmap通过内存映射,将内存缓冲区中的数据映射到用户缓冲区,由此让用户空间共享内核空间的数据。
常用的IO模型阻塞IO:假设建立一个socket连接,如果这个连接的客户端一直不发数据,那么服务端线程将会一直阻塞在read函数上不返回。
非阻塞IO:将read函数改造成:如果没有数据到达网卡时,立即返回一个错误值,而不是阻塞地等待。这样就需要用户线程循环调用read,直到返回值不为-1,再开始处理业务。注意:非阻塞的read, ...
计算机网络
未读time_waittime_wait状态如何产生?由上面的变迁图,首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。
time_wait状态产生的原因1)为实现TCP全双工连接的可靠释放假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源(client方的local_ip,local_port)不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。如果主动关闭一方不维护这样一个TIME_WAIT状态,那 ...
计算机网络
未读TCP握手挥手数据传输三次握手过程第一次握手客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态(请求连接),等待服务器确认
第二次握手服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态(接收到SYN的状态,连接套接字状态);
第三次握手客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕并完成接收后,客户端和服务器进入ESTABLISHED状态(已经建立了连接状态),完成三次握手。
SYN:同步序列编号(Synchronize Sequence Numbers),是TCP/IP建立连接时使用的握手信号。ACK:确认字符(Acknowledge character),在数据通信中,接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。
第三次握手就是为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误。
传输数据过程a.超时重传:超时重传机制用来保证TC ...
go的多进程虽然说可以直接用go的协程直接起子进程,但是为了保证当起子进程时父类的结构尽可能简单,变采用主进程起子进程的形式
异步起进程主进程起进程,起协程监听子进程的执行情况,可以使后台的子进程跑满制定数量
123456789101112131415161718192021222324252627282930313233343536373839404142package mainimport ( "log" "os" "strconv")var processChan = make(chan int, 10)func processListen(process *os.Process) { p, _ := process.Wait() exitCode := p.ExitCode() log.Println("process finish ExitCode: ", exitCode) <-processChan}func main() { poolsize := 8 f ...









