2026.6.8Linux

线程安全的实现:

  1. 互斥锁:本质上就是只有0/1的计数器,通过0/1标记锁的状态

在访问资源之前进行加锁(0),若当前不允许加锁(已经为0),则阻塞在访问资源之后进行解锁(1)

  1. 条件变量:提供两个接口,让线程阻塞的接口,唤醒阻塞线程的接口
  1. 使用时需要搭配一把互斥锁一起使用,条件判断的过程必然是一个临界区操作
  2. 条件判断的过程需要进行循环判断
  3. 若需要互相等待,则不同的角色需要等待中不同的条件变量上

3.信号量:本质上就是一个计数器,提供了两个操作

P操作:计数器-1,若计数器小于0,则阻塞

V操作:唤醒一个线程,计数器+1

同步的实现:使用信号量对资源进行计数,获取资源之前P操作,增加资源之后V操作

互斥的实现:使用信号量初始计数为1,在访问资源之前P操作,访问资源之后V操作

生产者与消费者模型:

应用场景:程序中既要生产数据,又要对数据进行处理的场景

原理:将数据的生产与处理进行解耦(实现一个线程安全的任务队列)

生产者生产数据之后,将数据抛入任务队列中

消费者不断从任务队列中取出数据进行处理

优点:解耦合,支持并发,支持忙闲不均的削峰填谷

实现:

  1. 实现对应的生产者与消费者两类线程
  2. 实现一个线程安全的任务队列

死锁:

概念:多个线程之间因为锁的争抢不当,导致线程间相互等待,若无外力介入无法继续执行的现象

产生:四个必要条件,若四个条件都产生了则会构成死锁

  1. 互斥条件:锁只有一个线程能加
  2. 不可剥夺条件:我加的锁,别人不能解
  3. 持有并等待条件:我加了A锁,然后去请求B锁,加不上B锁,我也不释放A锁
  4. 环路等待条件:线程1加了A请求B锁,线程2加了B锁请求A锁

预防:破坏四个必要条件

  1. 互斥条件:
  2. 不可剥夺条件:
  3. 持有并等待:使用非阻塞加锁lock/trylock,若加锁不成功,则释放已经加的锁
  4. 环路等待条件:大多是因为加锁顺序不一致导致的,因此保证所有线程加锁顺序一致

避免:银行家算法,死锁检测算法

银行家算法思想:

  1. 使用一个矩阵描述总共有多少资源
  2. 使用一个矩阵描述给哪些客户分配了哪些资源
  3. 使用一个矩阵描述哪些客户还需要哪些资源
  4. 对系统运行使用两种状态进行描述:安全、不安全

如果一个客户分配了资源会导致系统进入不安全状态,则不能分配

锁种类的普及:

  1. 乐观锁:总是认为我要访问临界资源的时候,其他线程不会访问
  1. 先获取一下数据原来是多少
  2. 访问数据之前,使用数据的当前值与老的值进行比较是否一致,一致则访问,不一致则重新从第一部开始
  3. 具体实现:CAS锁的实现(课后调研)
  1. 悲观锁:总是认为在访问临界资源时候有其他资源争抢,因此总是在访问前加锁,因此总是在访问前1加锁
  2. 递归锁:常用于递归函数中,同一个线程内可以递归循环加锁
  3. 自旋锁:能加锁则加锁,不能加锁则循环判断能否加锁

常用于对效率要求高,临界区操作比较短小且时间可控较短的场景。否则自旋锁对cpu资源的消耗就会非常高。

读者写者模型:

应场景:读共享写互斥的场景

读共享:大家可以一起读

写互斥:当前写的时候,既不能有人读,也不能有人写

实现:主要在于满足读共享,写互斥需求

读写锁:pthread_rwlock_t

Pthread_rwlock_rdlock加读锁;pthread_rwlock_wrlock加写锁

写者优先:加写锁的时候,若无法加锁,则会标记状态,让后续想要加读锁的线程无法继续加锁

读写锁实现原理:读写锁内部有两个计数器,读者计数和写者计数

加读锁:写者计数为0就能加 加写锁:保证两者计数都为0才能加

线程和进程的区别?

死锁的产生,危害,预防,避免。

网络编程:

  1. 网络编程的前言:网络编程所需要了解的前置知识点

  2. 网络编程:讲解如何编写网络通信客户端与服务器

  3. 多路复用IO实现高性能服务器:学习多路复用IO

  4. 学习网络通信协议栈中的典型协议:HTTP,HTTPS,TCP,UDP,ARP,ETH

网络通信中,网络中的每个主机节点都必须拥有一个唯一标识:IP地址

IP地址:就是一个数字编号,4字节无符号整形数据

网络中传输的数据中,必须拥有两个字段信息:

  1. 源端IP地址2)目的端IP地址:标识了数据从哪来到哪去

IP地址:

1.4字节无符号整数,在网络中对每个节点主机进行唯一性标识

2.网络中的每个数据都会具备:源端地址,对端地址

IP地址不够用:

  1. DHCP技术:动态地址分配,谁上网就给谁分配IP地址
  2. NAT技术:网络地址转换技术,让多个主机节点,使用同一个IP地址进行通信

IPV6版本的IP地址:16字节,并不向前兼容IPV4

端口:;port,本质是2字符无符号整数

作用:在一台主机上,唯一标识一个网络通信程序保证QQ的消息只会被QQ收到并处理

在网络中的每条数据中,不仅有源端IP地址,对端IP地址,还有源端端口,对端端口,端口描述了数据应该被对方主机上的那个进程处理

网络通信协议:本质:网络通信时的数据格式约定,保证了一台主机发送的数据能够被对方正确解析

为了规范网络通信,让各个不同厂家设备都可以互通使用,这时候就需要订立网络通信协议标准

OSI七层网络协议模型:

将整个网络通信环境划分为七层,每层不同的功能使用指定的协议

应用层:描述各个软件约定的数据格式

表示层:描述数据内容的格式标准(图片,视频,资源)

会话层:描述一次通信生命周期

传输层:描述数据从哪个进程发出来,到哪个进程去(端口)

网络层:描述数据从哪个主机来,到哪个主机去(IP地址)

链路层:描述物理设备的约定(比如双绞线的粗细,抗干扰能力,传输距离)

TCP/IP五层模型:

应用层:程序数据格式约定

传输层:描述通信两端进程 PC计算机

网络层:描述通信两端主机 路由器---对网络的数据进行路由选择

链路层:描述相邻设备通信 交换机---对相邻设备之间进行数据交换传输

物理层: 集线器,信号放大器

五元组:源端IP地址,源端端口,对端IP地址,对端端口,通信协议

网络的叫法:

局域网,城域网,广域网:以通信范围划分的网络

以太网,令牌环网..:以组网方式不同划分的网络

互联网,公网,外网:说的就是广域网(连接所有人的网络),上网说的就是上互联网

私网,内网:通常指内部的局域网络(比如宿舍内使用路由器组件的小型网络)

字节序:存储单元大于1字节的数据中内存中的存取顺序

通常针对的类型:short,int,long,float,double,对应的无符号类型

字节序不考虑数据,考虑的是单个元素的存储单元的大小

一个数据,中存储的时候,有两个顺序:

  1. 二进制的高低位 2.内存的高低地址

小端字节序:低地址存储低位

大端字节序:低地址存储高位

每个主机电脑都有一个概念:主机字节序

主机字节序:到底是大端还是小端,判断标准是什么?取决于什么,取决于CPU架构:X86架构-小端 MIPS架构-大端

字节序对于网络编程的影响:

相同主机传输相同的数据,并没有影响,怕的是不同主机字节序之间的网络通信

网络字节序标准:网络通信时,统一使用大端字节序,作为字节序标准

发送数据时,都转换为大端后,再进行发送

相关推荐
其实防守也摸鱼1 小时前
软件安全与漏洞--Windows底层原理与软件逆向工程基础
linux·网络·数据库·算法·安全·安全架构·软件安全与漏洞
于指尖飞舞1 小时前
java后端面试题(多线程极简)
java·开发语言
IT 行者2 小时前
GitHub Spec Kit 实战(四):读懂和干预 /speckit.plan——AI 最自由发挥的一步
java·人工智能·github·ai编程·claude
独隅2 小时前
IntelliJ IDEA 在 Windows 上的完整安装与使用指南
java·windows·intellij-idea
Misnearch2 小时前
为什么List<int[]> ans = new ArrayList<>()能成功创建
java·object
minji...2 小时前
MySQL数据库 (八) MySQL表的基本查询(下),truncate、group by、聚合函数、分组聚合统计
数据库·mysql·聚合函数·update·分组聚合统计
梦想的颜色2 小时前
从零入门:Docker在Ubuntu上的安装、使用与主流镜像仓库实战(Java/Go/MySQL/PostgreSQL/MongoDB/Nginx
java·ubuntu·docker
乐世东方客2 小时前
备份脚本记录(binlog文件+mysql+mongo)
android·数据库·mysql
暴力求解2 小时前
MySQL---数据类型
数据库·mysql