- 博客(75)
- 收藏
- 关注
原创 Java随手记
这时候线程1提交更新,将v的值与旧的预期值A比较,发现11!=10,提交失败了,于是线程1重新获取内存地址v中的当前值,然后重新计算想修改的新值,再次重复一遍之前的提交-比较流程,如果这一次比较后发现没有冲突,就执行Swap,把B的值换进地址v里。不能,假如两个线程都想对i进行i++操作,它们同时调用++方法,线程A读取i为0并计算i+1结果为1,这时线程B也调用++方法,计算i+1结果为1,然后线程A把1写回i,线程B也把1写回i,最终i只增加了1而不是期望的2。
2024-03-11 20:24:43
851
原创 Android随手记
一句话总结:Handler是用于与跨线程通信的,而每个线程都有自己的looper,looper管理线程的任务,所以其实Handler就是用于与looper通信的,在Handler里装哪个looper,最终代码就在哪个线程上跑。Looper.prepare()的内部其实是sThreadLocal.set(new Looper),就是创建一个新的looper,set到当前线程里去,以后在这个线程里拿的looper就是这里来的。init进程是第一个用户空间的进程,也就是第1号进程(第0号进程是linux)
2024-03-07 19:41:49
1107
1
原创 SwipeRefreshLayout和TextView滑动冲突的暴力解决方法
网上查到的解决方案是,给TextView设置onTouchListener,在MotionEvent.ACTION_MOVE的时候禁止其parent获取滑动状态,实际用下来发现时灵时不灵的,思来想去想出了一个最简单暴力的解决方法:在点击TextView的时候禁用下拉刷新功能。
2023-10-19 14:47:38
186
原创 Go 单元测试
单元测试就是在终端使用gotest进行我们自定义的测试,代码编写要求如下Go语言推荐测试文件和源代码文件放在一块,测试文件以_test.go结尾,例如我们需要测试写在mytry.go里的Add函数,则测试文件名为mytry_test.go测试用的函数名为需要测试的函数前加Test,如要测试Add,则测试用函数名为TestAdd有多个待测试函数时,可以用-run来选择运行其中的一个用例-v可以显示每个用例的测试结果。...
2022-07-26 15:56:06
819
原创 etcd学习
应用程序通过 put 将 key 和 value 存储到 etcd 集群中。每个存储的密钥都通过 Raft 协议复制到所有 etcd 集群成员,以实现一致性和可靠性。get函数声明如下:这里 err 并不能反馈出 key 是否存在(只能反馈出本次操作因为各种原因异常了),我们需要通过 GetResponse 判断 key 是否存在......
2022-07-13 09:17:16
345
原创 深入掌握Service
一个例子:创建这个Service后,查看系统为其分配的ClusterIP输出这个Service会监听访问169.169.140.229:8080端口的请求,然后把这些请求发送到集群中拥有label:app=webapp的pod的8080端口上,这样使用者就可以不管pod由于新建或销毁导致的podip变化,直接访问serviceip就可以访问服务当一个Service对象在Kubernetes集群中被定义出来时,集群内的客户端应用就可以通过服务IP访问到具体的Pod容器提供的服务了。从服务IP到后端Pod
2022-07-08 18:04:46
487
原创 深入掌握Pod
ConfigMap供容器使用的典型用法如下。(1) 生成容器内的环境变量。(2) 设置容器启动命令的启动参数(需设置为环境变量)。(3) 以Volume的形式挂载为容器内部的文件或目录。ConfigMap以一个或多个key:value的形式保存在Kubernetes系统中供应用使用,既可以用于表示一个变量的值(例如 apploglevel=info),也可以用于表示一个完整配置文件的内容(例如 server.xml=…)。ConfigMap必须在Pod之前创建,Pod才能引用他,所以静...
2022-07-08 14:19:11
697
原创 k8s学习
集群表示由一个Master和很多Node组成的K8s集群,其中Master指的是集群的控制节点,除Master以外的都是Node,用于进行工作负载命名空间用于多租户的资源隔离,典型的思路是给每个租户分配一个命名空间,每个命名空间相互独立,也即他们相互之间是不可视的,每个k8s集群安装完成之后,Master会自动创建两个命名空间,一个default一个kube-system,用户创建的资源如果没有指定命名空间的话,就会放在default里,而系统相关的资源对象如网络组件等,被安装在kube-system空间中
2022-07-06 18:03:48
524
原创 git学习
更新仓库新建/修改文件新建文件和修改文件都是在git仓库目录下进行的,如果是新建就将新建的文件放到git仓库目录,修改则直接在文件上进行修改,例如:我们编写一个readme.txt文件,内容如下:让后放到git目录下,然后使用git add指令添加,修改也是这个指令然后用commit提交修改这时我们对readme文件进行修改然后可以用git status查看状态上面的输出告诉我们,readme被修改了,但是还没提交我们可以用git diff查看修改了什么然后我们重复之前的操作就可以提交修
2022-07-05 15:57:16
135
原创 go 反射
我们使用reflect.TypeOf 来读取接口变量的reflect.Type运行结果我们可能会疑惑,为什么没看到接口?这段代码看起来只是把一个 float64 类型的变量 x 传递给 reflect.TypeOf 并没有传递接口。其实在 reflect.TypeOf 的函数签名里包含一个空接口:Type类型中的成员函数Name()返回对象的名称,如果是基本对象例如int就返回int,如果是自定的如type intt int,返回的是intt返回对象的静态类型,自定的type intt int,也
2022-07-04 18:11:48
263
原创 tiny webserver笔记
引自:https://blog.youkuaiyun.com/qq_20853741/article/details/113547906SIGPIPEhttps://www.cnblogs.com/lit10050528/p/5116566.htmlsem_init引自:https://blog.youkuaiyun.com/qq_33527943/article/details/80457903
2022-03-25 16:24:58
518
转载 linux常用命令
系统信息arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作cat /proc/cpuinfo 显示CPU info的信息cat /proc/interrupts 显示中断cat /proc/meminfo 校验内存使用cat /pr
2022-03-19 14:44:42
89
原创 vim快捷键
拷贝当前行—yy拷贝当前行向下的5行—5yy粘贴—p删除当前行—dd删除当前行向下的5行—5dd查找某个单词—/目标单词设置文件行号—:set nu取消文件行号—:set nonu到文件首行—gg到文件尾行—G撤销输入—u快速定位到第n行—n shift+g...
2022-03-19 14:32:06
364
原创 2022-3-12
进程间通信管道管道又名匿名管道,这是一种最基本的IPC机制,由pipe函数创建:#include <unistd.h>int pipe(int pipefd[2]);调用pipe函数时在内核中开辟一块缓冲区用于通信,它有一个读端,一个写端:pipefd[0]指向管道的读端,pipefd[1]指向管道的写端。所以管道在用户程序看起来就像一个打开的文件,通过read(pipefd[0])或者write(pipefd[1])向这个文件读写数据,其实是在读写内核缓冲区。一般使用管道的时候是
2022-03-12 11:26:26
2519
原创 2022-3-4
2022-3-4epoll实现多路IO转接边沿触发和水平触发epoll实现多路IO转接#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<arpa/inet.h>#include<ctype.h>int main((int argc, char *argv[]){ int i,n,j; int listen
2022-03-04 15:34:49
80
原创 2022-3-2
2022-3-2pollepollpoll使用select的时候,如果出现文件集合散乱的情况,例如我们需要监听4和1023,这时就需要一个1024的循环,但是其中只有两个标志位是我们需要的,这样会诞生很多无用操作,为了改进这一点,poll出来了fd在不需要使用的时候也赋为-1epoll与poll不同的是,poll使用一个poll的结构体数组来管理文件描述符,而epoll是用一颗红黑树来管理红黑树根节点的创建操作监听红黑树阻塞监听...
2022-03-02 22:24:54
175
原创 2022-3-1
2022-3-1selectselect的相关函数网络字节序转换实现selectselect、poll、epoll都是实现io多路复用的手段select函数有5个参数int nfds:表示管理的数量,例如下图中就应该为8fd_set *readfds:表示应当监听的会发生读操作的文件的文件描述符集合,例如c1用户发送连接请求,这时lfd就会收到c1发来的请求,于是lfd,也就是文件3就会发生读操作fd_set *writefds:表示应当监听的会发生写操作的文件的文件描述符集合fd_set
2022-03-01 14:38:45
407
原创 2022-2-28
2022-2-28非阻塞IO与阻塞IO区别阻塞IO非阻塞忙轮询响应式-多路IO转接非阻塞IO与阻塞IO区别阻塞IO阻塞io就是服务器建立了监听套接字后,直接使用accept建立套接字等待用户连接,如果用户没有及时连接的话,服务器就进入阻塞,直到用户有连接进来为止非阻塞忙轮询非阻塞忙轮询是阻塞io的升级版,他没接到用户连接的时候不是进入阻塞傻等,而是挂起,过了一段时间后再来查看是否连接响应式-多路IO转接再升级版就是多路IO转接服务器会创建一个select\poll\epoll,来进行转
2022-02-28 15:28:08
304
原创 2022-2-23
2022-2-23I/O设备标准协议利用中断减小开销利用DMA进行更高效的数据传送设备驱动程序磁盘驱动器磁盘调度SSTF:最短寻道时间优先SPTF:最短定位时间优先I/O设备标准协议一个简化的设备接口包含三个寄存器:状态寄存器、指令寄存器、数据寄存器,操作系统与该设备的经典交互如下该协议包含 4 步。第 1 步,操作系统通过反复读取状态寄存器,等待设备进入可以接收命令的就绪状态。我们称之为轮询(polling)设备(基本上,就是问它正在做什么)。第2 步,操作系统下发数据到数据寄存器。例如,你可以
2022-02-23 10:26:47
492
原创 2022-2-19
2022-2-19条件变量生产者/消费者(有界缓冲区)问题最终的生产者/消费者方案信号量信号量的定义二值信号量(锁)信号量用作条件变量生产者/消费者(有界缓冲区)问题第一次尝试第二次尝试读写锁哲学家就餐问题一个简单的尝试解决方法条件变量线程可以使用条件变量(condition variable),来等待一个条件变成真。条件变量是一个显式队列,当某些执行状态(即条件,condition)不满足时,线程可以把自己加入队列,等待(waiting)该条件。另外某个线程,当它改变了上述状态时,就可以唤醒一个或者多
2022-02-19 14:19:01
490
原创 2022-2-8
2022-2-8锁休眠代替自旋锁为了让自旋锁不要浪费太多时间在自旋上,最简单的方法就是让线程自旋的时候让出cpu但这里也有个问题,当一个进程有100个线程,且采用轮转调度,那么一个线程持有锁,其他99个线程调用锁,发现被占用然后让出cpu,虽然比一直自旋要更有效率,但99个上下文切换也是很耗时间的休眠代替自旋为了防止前文提到的多个上下文切换,我们使用队列记录下一个应该持有锁的线程这里的flag表示的是锁是否正在被使用,guard表示锁是否正在被其他人读取,当最开始没人使用的时候,flag和
2022-02-08 20:05:19
351
原创 2022-2-7
2022-2-7并发线程的创建共享数据插叙:线程API创建完成锁自旋锁评价自旋锁并发本章将介绍为单个运行进程提供的新抽象:线程线程与进程的不同之处在于,在进行上下文切换的时候,进程需要改变地址空间,也就是需要换新的页表,而线程不需要,不同线程共享同一个地址空间。对于并发,也即多线程而言,与单线程不同的地方在于,单线程的地址空间中只有一个栈,而多线程有多个栈线程的创建可以看到,我们先创建了两个线程,然后使用两个pthread_join来等待线程的结束,但我们无法控制这两个线程哪个先执行,线程被创
2022-02-07 16:26:11
76
原创 2022-1-24
2022-1-24超越物理内存策略简单策略:FIFO利用历史数据:LRU近似LRU考虑脏页超越物理内存策略在内存满了的时候,我们需要将内存中不要用到的页与硬盘中需要用到的页进行替换,那么究竟替换哪一个呢简单策略:FIFO如题,类似一个队列,先进先出利用历史数据:LRU“最不经常使用”(Least-Frequently-Used,LFU)策略会替换最不经常使用的页。同样,“最少最近使用”(Least-Recently-Used,LRU)策略替换最近最少使用的页面。近似LRULRU有一个问题,
2022-01-24 13:22:45
360
原创 2020-1-22
2020-1-22分页分页与分段多级页表超越两级超越物理内存机制分页线性页表有可能会非常耗费空间,假设我们有一个16kb的地址空间和1kb的页可以看到有很大一部分都没被使用分页与分段一种不太好的解决方案是混合分页和分段,也即为每个逻辑分段构建各自的页表我们将进程分为三个段,代码段、堆段和栈段,每个段都与之前提及的分段一样,有一个基址寄存器和界限寄存器,要确认地址引用的哪个段,我们可以使用地址空间的前两位标记,例如00是未使用的段,01是代码,10是堆,11是栈,虚拟地址如下所示在得知使
2022-01-22 19:52:54
433
原创 2022-1-20
2022-1-20分页地址转换旁路缓冲存储器(TLB)上下文切换时(切换进程)TLB替换策略分页在管理内存空间的时候,我们一般对其进行分页处理对于进程而言,它看到的是一共4页的连续空间,每页16字节,而在真实物理空间里,他们的页是被分开放的,类似于虚拟内存的分段为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存一个数据结构,称为页表。页表的主要作用是为地址空间的每个虚拟页面保存地址转换,从而让我们知道每个页在物理内存中的位置。页表是每一个进程的数据结构,如果操作系统运行
2022-01-20 23:12:00
302
原创 2022-1-18
2022-1-18地址转换动态重定位分段我们引用哪个段栈共享支持空闲空间管理底层机制地址转换动态重定位对于程序而言,其地址转换过程的不存在的,程序认为自己的地址就是开始于0kb,结束于固定大小,这就是地址转换的透明性,对cpu而言,实现程序地址到真实物理地址的转换很简单,cpu有两个寄存器,基址寄存器和界限寄存器,基址寄存器存储了程序的真实物理地址的起始点,界限寄存器存储了程序物理地址的终点分段如果我们直接将进程占用的内存连续设定,可能会出现很多未被使用的内存,造成资源浪费,这时我们需要将代码段,
2022-01-20 21:38:23
280
原创 2022-1-14
2022-1-14调度:多级反馈队列基本规则改变优先级降级升级更好的计时方式调度:比例份额基本概念:彩票数表示份额调度:多级反馈队列基本规则多级反馈队列(MLFQ)的基本规则就是,同优先级的进程轮转运行,不同优先级的进程按由高到低运行改变优先级降级如果在长时间占用cpu,但是不包含io的密集运算型程序之后,又进入了一个交互性程序的话由于交互型程序运行时间很短,所以在被移入最低优先级之前就运行完了升级按照上面的想法,让主动放弃cpu的进程保持优先级不变的话,可能会产生下面的情况:有个
2022-01-14 12:26:13
287
原创 2021-12-27
2021-12-27进程与线程进程间通信竞争屏蔽中断锁变量自旋锁互斥锁读写锁进程与线程进程间通信竞争当程序中有大家都能读取的共享变量或文件,就会产生竞争情况,考虑一个假脱机打印程序,该程序有一个脱机打印目录,里面是需要被打印的文件名,in指向最后一个空位,out指向下一个应该被打印的文件。如果进程A想打印文件,它读到in的位置是7,然后发生了中断,转到进程B执行,B也读到in为7,于是B把要打印的文件放入7,然后使in+1,这时B也中断,回到进程A,A将自己的文件也放入7,覆盖了B的文件,然后让i
2022-01-08 16:53:32
342
原创 2021-12-26
2021-12-26进程与线程进程与线程的区别进程中分多线程的好处进程与线程进程与线程的区别进程:一个程序在执行过程中的动作,类似于按照说明书做菜,说明书是程序,人是cpu,各种原料是输入,人按说明书做菜的全过程就是进程线程:是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。区别:地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。资源:线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的
2021-12-26 21:21:06
165
原创 2021-12-15
2021-12-15TCP连接管理与TCP连接管理相关的攻击TCP沾包TCP心跳包UDP如何实现可靠传输cookie和session的区别状态码TCP连接管理与TCP连接管理相关的攻击SYN泛洪是一种TCP拒绝服务攻击,在这种攻击中一个或多个恶意的客户端产生一系列TCP连接尝试(SYN报文段),并将它们发送给一台服务器,它们通常采用“伪造”的(例如,随机选择)源IP地址。服务器会为每一条连接分配一定数量的连接资源。由于连接尚未完全建立,服务器为了维护大量的半打开连接会在耗尽自身内存后拒绝为后续的合法连
2021-12-15 21:00:44
1246
原创 2021-12-12
2021-12-12TCP连接管理TCP连接的建立与终止三次握手与四次挥手TCP连接标志位有 URG、ACK、PSH、RST、SYN、FINURG:紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)ACK:确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效PSH:标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付RST:重建连接标识。当RST=
2021-12-12 17:51:21
1857
原创 2021-12-12
2021-12-12运输层TCP拥塞控制原理慢启动拥塞避免快速恢复运输层TCPTCP在关闭的时候,会互相发出终止报文拥塞控制原理当网络中发生拥塞时,通常表现为丢包,所以当发送端检测到计时器超时或冗余ACK时,就会知道网络拥塞了,这时候TCP会调节发送方的拥塞窗口(cwnd)的长度具体来说就是拥塞发生时,cwnd减小,正常传输时,cwnd增大慢启动当一条TCP连接开始时,其cwnd通常设置为一个MSS的较小值,则其传输速率为MSS/RTT当一条报文被ACK时,发送方就增加一个MSS,如图
2021-12-12 14:35:00
161
原创 2021-12-08
2021-12-08运输层面向连接的运输:TCP序号和确认号估计往返时间运输层面向连接的运输:TCPTCP报文段结构 序号和确认号TCP报文段首部中最重要的字段是序号和确认号,他是TCP可靠传输的关键部分序号:TCP在传输数据的过程中,将数据看成一个无结构、有序的字节流,他会隐式地为数据流中的每一个字节编号,而报文首部中的序号就是传送的该报文中包含的数据的第一个字节的编号,例如当最大传输块(MSS)为1000字节,数据流为500000字节的时候:则第一个报文段的序号是0,第二个是1000,以
2021-12-08 16:26:13
94
原创 689. 三个无重叠子数组的最大和
直接利用三个连在一起的滑块,第一个滑块计算首个最大子数组,第二个滑块计算前一个最大子数组加当前子数组,也就是算两个子数组的最大值,第三个以此类推vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) { vector<int> ans; int sum1 = 0, maxSum1 = 0, maxSum1Idx = 0; int sum2 = 0, maxSum12 = .
2021-12-08 10:37:42
70
原创 2021-12-07
2021-12-07运输层可靠数据传输原理运输层可靠数据传输原理可靠数据传输(rdt)有各种不同版本的协议经完全可靠信道传输:rdt1.0发送端仅发送,接收端仅接收经有差错信道传输:rdt2.0接收端会使用检验和查错,并反馈给发送端圆圈表示状态,横线上方表示发生的事件,横线下方表示作出的响应注意发送端在进入等待ACK或NAK状态的时候,只有接收到来自接收端的ACK(全对)反馈后,才会进入等待调用状态,处在等待ACK或NAK状态的时候,发送方不会从上层获得更多数据了,所以rdt2.0被称为
2021-12-07 21:12:14
1695
原创 2021-12-06
2021-12-06运输层无连接运输:UDPUDP报文段结构运输层无连接运输:UDP为什么有些应用不是用有连接保障的TCP,而使用UDP:1、关于发送什么数据和何时发送的应用层控制更精细使用TCP连接的话,如果应用与服务器间的通路拥挤,TCP会抑制发送端,而UDP没这个烦恼2、无需建立连接TCP连接需要经历三次握手,UDP不用,不会引入连接时延3、无连接状态TCP需要在端系统中维护连接状态,连接状态包括:接收和发送缓存、拥塞控制参数和序号及确认号,UDP不需要维护这些状态所以应用运行在UD
2021-12-06 21:15:35
68
原创 2021-12-1
2021-12-1应用层UDP套接字编程TCP套接字编程应用层UDP套接字编程套接字分组上有目的地址和源地址,目的地址可能由我们指定,源地址也就是发送方的IP地址和端口号,则由底层操作系统自动完成serverName被设定为了字符串’hostname’,这里的’hostname’是我们提供的服务器IP或服务器的主机名的字符串serverPort是端口号这一行创建了该客户的套接字,名字是clientSocket,AF_INET指定了底层网络使用IPv4,SOCK_DGRAM表示我们使用的是U
2021-12-01 21:22:40
904
原创 2021-11-30
2021-11-30应用层DNSDNS工作机理DNS记录和报文应用层DNSDNS提供的服务就是将主机名转换为其IP地址,其做法如下除此之外,在主机拥有别名的情况下,用户还可以调用DNS,获得规范主机名和主机的IP地址,邮件服务器别名同理DNS还可以负责负载分配,有些繁忙的站点会冗余地分配在多台服务器上,这些服务器都有自己的IP地址,当用户访问该站点的时候,DNS会循环地返回站点的IP地址集合,而用户总是向排在最前面的IP地址发出报文,所以DNS就可以分配这些冗余服务器DNS工作机理由于主机的
2021-11-30 21:41:50
1690
原创 2021-11-29
2021-11-29应用层Web和HTTPHTTP报文格式HTTP响应报文cookie条件getSMTP和HTTP应用层Web和HTTPHTTP报文格式HTTP响应报文下面提供一个经典的响应报文该响应报文分为三部分:一个状态行、六个首部行,然后是实体体(表现为data data)实体体是报文的主要部分,它包括了所请求的对象本身状态行分为三个字段:协议版本字段、状态码和相应状态信息首部行:Date指的是服务器从文件系统中检索到请求对象,将该对象插入响应报文并发送响应报文的时间Serve
2021-11-29 21:28:38
930
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人