线程安全的实现:
- 互斥锁:本质上就是只有0/1的计数器,通过0/1标记锁的状态
在访问资源之前进行加锁(0),若当前不允许加锁(已经为0),则阻塞在访问资源之后进行解锁(1)
- 条件变量:提供两个接口,让线程阻塞的接口,唤醒阻塞线程的接口
- 使用时需要搭配一把互斥锁一起使用,条件判断的过程必然是一个临界区操作
- 条件判断的过程需要进行循环判断
- 若需要互相等待,则不同的角色需要等待中不同的条件变量上
3.信号量:本质上就是一个计数器,提供了两个操作
P操作:计数器-1,若计数器小于0,则阻塞
V操作:唤醒一个线程,计数器+1
同步的实现:使用信号量对资源进行计数,获取资源之前P操作,增加资源之后V操作
互斥的实现:使用信号量初始计数为1,在访问资源之前P操作,访问资源之后V操作
生产者与消费者模型:
应用场景:程序中既要生产数据,又要对数据进行处理的场景
原理:将数据的生产与处理进行解耦(实现一个线程安全的任务队列)
生产者生产数据之后,将数据抛入任务队列中
消费者不断从任务队列中取出数据进行处理
优点:解耦合,支持并发,支持忙闲不均的削峰填谷
实现:
- 实现对应的生产者与消费者两类线程
- 实现一个线程安全的任务队列
死锁:
概念:多个线程之间因为锁的争抢不当,导致线程间相互等待,若无外力介入无法继续执行的现象
产生:四个必要条件,若四个条件都产生了则会构成死锁
- 互斥条件:锁只有一个线程能加
- 不可剥夺条件:我加的锁,别人不能解
- 持有并等待条件:我加了A锁,然后去请求B锁,加不上B锁,我也不释放A锁
- 环路等待条件:线程1加了A请求B锁,线程2加了B锁请求A锁
预防:破坏四个必要条件
- 互斥条件:
- 不可剥夺条件:
- 持有并等待:使用非阻塞加锁lock/trylock,若加锁不成功,则释放已经加的锁
- 环路等待条件:大多是因为加锁顺序不一致导致的,因此保证所有线程加锁顺序一致
避免:银行家算法,死锁检测算法
银行家算法思想:
- 使用一个矩阵描述总共有多少资源
- 使用一个矩阵描述给哪些客户分配了哪些资源
- 使用一个矩阵描述哪些客户还需要哪些资源
- 对系统运行使用两种状态进行描述:安全、不安全
如果一个客户分配了资源会导致系统进入不安全状态,则不能分配
锁种类的普及:
- 乐观锁:总是认为我要访问临界资源的时候,其他线程不会访问
- 先获取一下数据原来是多少
- 访问数据之前,使用数据的当前值与老的值进行比较是否一致,一致则访问,不一致则重新从第一部开始
- 具体实现:CAS锁的实现(课后调研)
- 悲观锁:总是认为在访问临界资源时候有其他资源争抢,因此总是在访问前加锁,因此总是在访问前1加锁
- 递归锁:常用于递归函数中,同一个线程内可以递归循环加锁
- 自旋锁:能加锁则加锁,不能加锁则循环判断能否加锁
常用于对效率要求高,临界区操作比较短小且时间可控较短的场景。否则自旋锁对cpu资源的消耗就会非常高。
读者写者模型:
应场景:读共享写互斥的场景
读共享:大家可以一起读
写互斥:当前写的时候,既不能有人读,也不能有人写
实现:主要在于满足读共享,写互斥需求
读写锁:pthread_rwlock_t
Pthread_rwlock_rdlock加读锁;pthread_rwlock_wrlock加写锁
写者优先:加写锁的时候,若无法加锁,则会标记状态,让后续想要加读锁的线程无法继续加锁
读写锁实现原理:读写锁内部有两个计数器,读者计数和写者计数
加读锁:写者计数为0就能加 加写锁:保证两者计数都为0才能加
线程和进程的区别?
死锁的产生,危害,预防,避免。
网络编程:
-
网络编程的前言:网络编程所需要了解的前置知识点
-
网络编程:讲解如何编写网络通信客户端与服务器
-
多路复用IO实现高性能服务器:学习多路复用IO
-
学习网络通信协议栈中的典型协议:HTTP,HTTPS,TCP,UDP,ARP,ETH
网络通信中,网络中的每个主机节点都必须拥有一个唯一标识:IP地址
IP地址:就是一个数字编号,4字节无符号整形数据
网络中传输的数据中,必须拥有两个字段信息:
- 源端IP地址2)目的端IP地址:标识了数据从哪来到哪去
IP地址:
1.4字节无符号整数,在网络中对每个节点主机进行唯一性标识
2.网络中的每个数据都会具备:源端地址,对端地址
IP地址不够用:
- DHCP技术:动态地址分配,谁上网就给谁分配IP地址
- 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,对应的无符号类型
字节序不考虑数据,考虑的是单个元素的存储单元的大小
一个数据,中存储的时候,有两个顺序:
- 二进制的高低位 2.内存的高低地址
小端字节序:低地址存储低位
大端字节序:低地址存储高位
每个主机电脑都有一个概念:主机字节序
主机字节序:到底是大端还是小端,判断标准是什么?取决于什么,取决于CPU架构:X86架构-小端 MIPS架构-大端
字节序对于网络编程的影响:
相同主机传输相同的数据,并没有影响,怕的是不同主机字节序之间的网络通信
网络字节序标准:网络通信时,统一使用大端字节序,作为字节序标准
发送数据时,都转换为大端后,再进行发送