-
面经 - 2024.11.11 深信服
2024-12-11 13:39 -
面经 - 2024.11.11 深信服
2024-12-11 13:11channel 不需要 close 是可以被 gc 掉的,需要 close 也只是需要通知正在读取的协程。
-
求网安博客推荐
2024-11-18 18:01国光、小迪挺不错的
还有先知社区
看雪论坛
v2ex 也有网安板块
会英文可以去 stackoverflow 还有 reddit 的网安板块。
youtube 也有很多入门教程
-
【新人报到】加入摸鱼派,与大家一起探索技术与生活的乐趣!
2024-09-29 13:12鱼排只吹水不聊技术
-
【史官来啦】鱼排大事记征集
2024-06-11 18:39鱼排的第一个漏洞通告捏
-
双方系统状态问题
2024-05-30 12:04你得在本系统回滚的时候也让系统b回滚,这是分布式事务的状态一致性,你可以看看事务这一个概念
-
反代安全
2024-04-11 16:44没有解决办法,只要你暴露在公网就会被别人扫描,这是不可避免的,你能做的就是禁止ip或者添加白名单
-
C 语言的并发原语(二)
2024-01-19 01:47这个涉及到比较底层也比较基础,我只能笼统一点的跟你说让你有个大致的了解。
线程是系统抽象出来的,他们的调度都是由系统来决定,系统对待它们的调度方式是抢占式,谁抢到了cpu就给谁执行。
数据竞争呢就是在线程1需要对数据进行修改,首先它要做第就是要获取到数据然后进行修改,但是在修改的途中呢,被线程2抢占到了cpu这个时候数据还没有被线程1修改所以还是原来的状态,那到的数据自然也是原来的状态了,然后两个线程修改得到的数据相当于只有一个修改成功了。
有了数据竞争的概念后,再来说说线程调度的概念,线程其实没有什么“休眠状态”这个所谓的“休眠状态”只是看起来是在休眠,但其实是线程被 操作系统的调度器中断使其让出cpu的占用,并没有什么“休眠”“中断中”这种状态,被中断的线程也还是会继续参与调度。那么什么时候线程会被中断呢?被动的中断是每个线程都会被分配一个时间这个时间就是这个线程所占用cpu的时间,当时间结束的时候则会被中断然后给其他线程抢到cpu执行,被中断的线程则是重新排队重新抢占cpu。主动的中断就比如我上一篇帖子中说的
thrd_yield
这个就是主动的让调度器中断线程使其重新排队重新抢占cpu,但这个函数并不能保证被中断的线程下次获取到cpu的时间,可能是中断后又立马能抢占到cpu也可能是中断后很久才能抢占到cpu,想要中断后指定特定的时间后才能获取到cpu的则是thrd_sleep
这个“休眠”函数,这个函数中断了线程后会在指定的时间后使其占用到cpu也就是所谓的“唤醒”。有了这一个概念就能更好的理解锁是怎么互斥的了,锁id和线程id进行绑定后当除了绑定的线程以外的线程调用了lock函数则都会被中断直到确保与其绑定的线程拿到cpu执行到unlock与锁id进行解绑,这样就完成了同一时间中只有一个线程在操作数据,并不是什么“被更高优先级打断”。
再来说说你说的自旋锁,自旋锁一般只需要两个状态true和false,当锁没有被占用的时候是false,被占用了是true,第一个线程在获取到锁的时候会锁的状态会被改变变成为true,这个时候其他的线程拿到这个锁的时候就是在做自旋的操作而不是和第一个线程竞争数据了,但死循环也就是所谓的自旋并不是在真的在无休止的占用cpu一直在检查状态,死循环会被识别为长时间占用cpu的代码,所以分配给它的时间会比其他代码长一些,在这段时间里自旋锁里的线程都将是一个线程跑了很长一段时间然后被中断切换到下一个线程,如果切换到了第一个线程,第一个线程执行完了代码解锁了后这个自旋锁的状态就会变为false,待cpu占用的时间耗尽其他线程就会开始抢占cpu,抢占到cpu但线程自旋检查状态发现为false,则会像第一个线程那样将自旋锁的状态改变为true,这样周而复始的操作。
好了,看了这些你应该会有个基础概念了,再深入就是怎么优化锁了,这个你就留给你自己思考吧~回复中有一些不严谨的地方这是为了让你更方便理解说得比较笼统,还是建议你去补一下计算机组成原理还有操作系统的知识~
-
C 语言的并发原语(一)
2024-01-17 16:11勾吧,你py没用过线程是吧
-
C 语言的并发原语(一)
2024-01-17 16:10那里看不懂
-
关于我把物理机网络变成虚拟机内网的网络一件事
2024-01-12 11:38虚拟机的桥接网卡是只要可以上网就行
-
关于我把物理机网络变成虚拟机内网的网络一件事
2024-01-12 11:36虚拟机的桥接网卡可以是同一网段也可以不是同一网段,仅主机的网段则需要都是同一网段
-
关于我把物理机网络变成虚拟机内网的网络一件事
2024-01-12 11:25仅主机这个部分是同一网段,也就是虚拟机里的仅主机网卡和虚拟机中的桥接网卡进行共享来形成网关,物理机中的仅主机网卡则是设置和网关一个网段的ip就可以了。
-
手把手教你手搓对 IPv4 的处理
2024-01-09 14:25快快收藏~
-
手把手教你手搓对 IPv4 的处理
2024-01-08 22:14是分割后的字符串存到字符串数组中返回会产生引用🤣
-
新人报道 - 写个数组摸摸鱼
2023-12-24 10:55索引部分建议更加详细一点,比如n[0]其实也可以这样0[n]来索引。n[0]的索引是一个语法糖,在c中的数组是一个指针,指针的地址是数组的元素中的首地址,n[0]是等价*(n+0),也就是直接*n对元素解引用,*(n+1)就是n[1]。回到0[n]这个部分,c中的1[n]、0[n]等价于*(1+n)、*(0+n),根据小学数学交换律0+n=n+0、1+n=n+1,所以n[0]是等价0[n]。再比如数组的索引也不只是单纯的n+m,数组索引的完整公式是a+i \times s,a是address代表数组的首地址,i是index代表这下标索引,s是type size代表类型大小。对程序来说每个字节都有一个内存地址,int类型是4个字节,想要分配大小为5的int数组,就需要的内存大小就是5*4也就是20个字节,用c的代码表示就是int is[5] = {1, 2, 3, 4, 5},想要获取第三个元素也就是3的时候索引是is[2],is[2]实际上等于is +2\times4,这是在高级语言中的特性不需要手动乘以类型大小进行索引,但是在c语言中这个相对低级一些的语言来说知道这个还是非常重要的,经常会用上。基于这个概念可以得知char[4]是等于一个int,char[8]等于一个long,类型的抽象就是这么来的,取决于你对这块内存一次性读多少。
-
忙吐了
2023-12-22 11:33难受
-
给 wbg 应援
2023-11-16 12:35是俱乐部的名字WBG是微博的lpl(中国)的俱乐部,t1是lck(韩国)的俱乐部
-
Haskell 随笔三 代数数据类型
2023-10-24 22:48"shellRaining/hlchunk.nvim" 我们是中文社区,请说中文
-
编程模式之表驱动
2023-10-20 14:37你甚至都可以说是命令模式😋,设计模式本身都有很多共同点,策略模式本身就是你定好一套对象然后不同的场景对不同的对象调用而已,文中那些初学者例子甚至也都可以叫做策略模式或者命令模式
-
Share: A Modular LunarVim Project
2023-10-18 10:17有个问题,为啥发一直发的英文贴?🤔
-
【可能有点用】像素动画生成器
2023-10-13 10:29整点有大用的
-
编程模式之代理模式
2023-10-11 20:08啥?
-
当我看到有人在分享 java8 stream 特性时。。。
2023-09-27 21:13.maxBy(_.salary)y))
这里应该是.maxBy(_.salary)吧? -
当我看到有人在分享 java8 stream 特性时。。。
2023-09-27 21:09scala这玩意儿的坑不比cpp少,我在图书馆里看到scala的书,厚度比《C++Primer Plus》还厚
不过我跟你也差不多,嫌弃java,不过我更嫌弃的是jvm,依赖jvm的东西都不太喜欢,比如java、kotlin、scala、clojure、groovy等等等等
-
还不知道递归是什么?
2023-09-27 10:51哈哈哈,我的意思是如果不是优化成循环的话只是优化栈,那么这个地方性能上就不是等价与循环
-
还不知道递归是什么?
2023-09-27 10:47为了不造成误解,我已经修改了我结尾的话,将“都在一个位置计算”改为了“出栈入栈保持栈是空的状态”
-
还不知道递归是什么?
2023-09-27 10:40如果按指令集来算优化的话,递归是调用的call这个指令,而循环只是jmp,call的指令是多个指令的封装,严格的说递归并不能在性能上等价循环,只能说在要做的事上等价循环
-
编程模式之代理模式
2023-09-15 10:00跟我说的一个意思呀
-
Haskell 随笔二 λ演算
2023-09-08 10:37我这里属于是把专业名词都给解释了一边了,你直接看大部分介绍的文章帖子都直接上名词并且不解释的
对 go 自己底层来说 any 也只是一个结构体而已,any 通常只有两个指针的大小,一个保存类型信息,一个保存实际的值的指针,在做断言的时候就是检查的这个类型信息。但这些 go 都没暴露给用户,想要安全的知道类型只能通过断言和反射。