首页 > 编程语言 >网络编程记录

网络编程记录

时间:2023-04-15 20:57:35浏览次数:55  
标签:互斥 记录 写锁 编程 网络 共享资源 获取 读锁 线程

  1. IP数据报在传输的过程中虽然是先发送到路由器,再由他转发个目的主机,但是其头部的目标IP地址确实最终的目标主机的IP地址,而不是中转路由器的IP地址。说明IP头部的源端IP地址和目的端IP地址在转发过程中是始终不变的,但帧头部的源端物理地址和目的端物理地址在转发过程中是一直变化的

  2. TCP传输的数据大小受本端拥塞窗口大小和对方的接受窗口大小的影响
  3. 什么是零拷贝:

    原来 8 张图,就可以搞懂「零拷贝」了 - 小林coding - 博客园 (cnblogs.com)

  4. 自旋锁和互斥锁:

    • 互斥锁加锁失败后,线程会释放 CPU ,给其他线程;
    • 自旋锁加锁失败后,线程会忙等待,直到它拿到锁;

    自旋锁和互斥锁在使用层面类似,但是实现层面完全不同:

    当加锁失败时,互斥锁用「线程切换」来应对,自旋锁则用「忙等待」来应对

如果你能确定被锁住的代码执行时间很短,就不应该用互斥锁,而应该选用自旋锁,否则使用互斥锁。

读写锁

  • 当「写锁」没有被线程持有时,多个线程能够并发地持有读锁,这大大提高了共享资源的访问效率,因为「读锁」是用于读取共享资源的场景,所以多个线程同时持有读锁也不会破坏共享资源的数据。
  • 但是,一旦「写锁」被线程持有后,读线程的获取读锁的操作会被阻塞,而且其他写线程的获取写锁的操作也会被阻塞。

读写锁在读多写少的场景,能发挥出优势

另外,根据实现的不同,读写锁可以分为「读优先锁」和「写优先锁」

读优先锁期望的是,读锁能被更多的线程持有,以便提高读线程的并发性,它的工作方式是:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 仍然可以成功获取读锁,最后直到读线程 A 和 C 释放读锁后,写线程 B 才可以成功获取写锁。如下图:

img

而「写优先锁」是优先服务写线程,其工作方式是:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 获取读锁时会失败,于是读线程 C 将被阻塞在获取读锁的操作,这样只要读线程 A 释放读锁后,写线程 B 就可以成功获取写锁。如下图:

img

读优先锁对于读线程并发性更好,但也不是没有问题。我们试想一下,如果一直有读线程获取读锁,那么写线程将永远获取不到写锁,这就造成了写线程「饥饿」的现象。

写优先锁可以保证写线程不会饿死,但是如果一直有写线程获取写锁,读线程也会被「饿死」。

既然不管优先读锁还是写锁,对方可能会出现饿死问题,那么我们就不偏袒任何一方,搞个「公平读写锁」。

公平读写锁比较简单的一种方式是:用队列把获取锁的线程排队,不管是写线程还是读线程都按照先进先出的原则加锁即可,这样读线程仍然可以并发,也不会出现「饥饿」的现象。

乐观锁

前面提到的互斥锁、自旋锁、读写锁,都是属于悲观锁。

悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁

那相反的,如果多线程同时修改共享资源的概率比较低,就可以采用乐观锁。

乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作

放弃后如何重试,这跟业务场景息息相关,虽然重试的成本很高,但是冲突的概率足够低的话,还是可以接受的。

可见,乐观锁的心态是,不管三七二十一,先改了资源再说。另外,你会发现乐观锁全程并没有加锁,所以它也叫无锁编程

标签:互斥,记录,写锁,编程,网络,共享资源,获取,读锁,线程
From: https://www.cnblogs.com/lihaoxiang/p/17321815.html

相关文章

  • Android开发,使用的是OkHttp和Reftrofit,用的是Kotlin协程,用Kotlin写一个网络拦截器,模拟
    首先,我们需要定义一个网络拦截器类,继承自OkHttp的Interceptor接口:classLoginInterceptor:Interceptor{overridefunintercept(chain:Interceptor.Chain):Response{//模拟登录请求,这里可以根据具体情况进行修改valrequest=chain.request().ne......
  • 【记录帖】如何自定义博客园界面
    博客园美化教程大集合----极致个性化你的专属博客(超详细,看这篇就够了)博客园cnblogs:自定义页面风格博客园自定义样式......
  • Oracle12C 调整 sga pga 调优记录
    3.2oracle参数调优查询oracle当前参数配置情况(processs=500;sessions=2280)1)以dba身份登录查看sga和pga情况SGA:SystemGlobalArea是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。SQL>showparametersga;NA......
  • Debian11清除登录记录及操作记录
    1、所有成功登录/登出的历史记录/var/log/wtmplast 2、查看登录失败记录 /var/log/wtmplastb 3、用户最近登录记录 /var/log/lastloglastlog 4、清除上述3个文件办法 ①新建shell脚本nanocl.sh ②填入以下内容#!/bin/bash>/var/log/wtmp>/var/......
  • 使用PDO插入记录
     <?phpheader("Content-type:text/html;charset=utf-8");//设置中国时区date_default_timezone_set('PRC');$dsn="mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";$username="root";$password="root"......
  • jdbc编程基础
    packagecom.local.util;importjava.sql.*;/***@date2023/4/1518:13*@description*/publicclassJdbcUtil{publicstaticfinalStringDRIVER_NAME="com.mysql.cj.jdbc.Driver";publicstaticfinalStringURL="jdbc:mysq......
  • 骗分记录(1)-INOH Round 1
    这场比赛算是骗分的最高境界了——排名#16!首先看T1。第一眼总司令。得到\(10\)pts。但作为骗分高手,不可能就此结束。于是继续。注意到Sub0\(T=3\)。每一组数据只有\(2\)种情况Yes和No。所以一共只有\(8\)种情况。根据测试发现测试点#1\(n=8\),于是再枚举答案,得到\(2......
  • EXCEL VBA编程的一些小结
     最近单位内部的项目里要用到些报表EXCEL的生成,虽说JAVA的POI可以有这能力,但觉得还是可能比较麻烦,因此还是转用.net来搞,用visualstudio2003配合office2003,用到了一些VBA,因此小结并归纳之,选了些资料归纳在这里,以备今后查考首先创建 Excel 对象,使用ComObj:DimExcelIDas......
  • 助力企业网络安全建设,华为云等保合规解决方案值得拥有
    近些年来,随着数字化转型升级的加速,以及数字化业务的不断拓展,企业对互联网信息安全的要求也越来越高了。而在网络信息安全领域,我们国家也很早就出台了《网络安全法》,对企业的等保合规要求也越来越高;然而企业在申请等保的过程中,经常会遇到等保流程长、技术整改难度大以及咨询和测评机......
  • [oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum
    python历史回忆上次内容颜文字是kaomoji把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme虚拟的表情也在真实世界有巨大影响一步步地影响字符编码就是这样一步步发展过来的python也是一步步发展到今天的python究竟是怎么发展的呢?......