(一)TCP与UDP的区别:
1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.流模式(TCP)与数据报模式(UDP);
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证
7、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
8、TCP首部开销20字节;UDP的首部开销小,只有8个字节
9、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP:
TCP编程的服务器端一般步骤是:(简述)
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是: (简述)
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
(二)多线程、多进程、协程
*进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
*线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
*协程:一个程序可以包含多个协程,可以对比于一个进程包含多个线程,因而下面我们
来比较协程和线程:我们知道多个线程相对独立,有自己的上下文,切换受系统控制,而协程
也相对独立;有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协
程来控制。
死锁问题:
死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁。
产生死锁的必要条件:
互斥条件
某资源只能被一个进程使用,其他进程请求该资源时,只能等待,知道资源使用完毕后释放资源。
请求和保持条件
程序已经保持了至少一个资源,但是又提出了新要求,而这个资源被其他进程占用,自己占用资源却保持不放。
不可抢占条件
进程已获得的资源没有使用完,不能被抢占。
循环等待条件
处理死锁的思路:
(1)预防死锁
破坏死锁的四个必要条件中的一个或多个来预防死锁。
(2)避免死锁
和预防死锁的区别就是,在资源动态分配过程中,用某种方式防止系统进入不安全的状态。
(3)检测死锁
运行时出现死锁,能及时发现死锁,把程序解脱出来
(4)解除死锁
发生死锁后,解脱进程,通常撤销进程,回收资源,再分配给正处于阻塞状态的进程。
预防死锁方法:
破坏请求和保持条件:
(1)协议1
所有进程开始前,必须一次性地申请所需的所有资源,这样运行期间就不会再提出资源要求,
破坏了请求条件,即使有一种资源不能满足需求,也不会给它分配正在空闲的资源,
这样它就没有资源,就破坏了保持条件,从而预防死锁的发生。
(2)协议2
允许一个进程只获得初期的资源就开始运行,然后再把运行完的资源释放出来。然后再请求新的资源。
什么叫线程安全
线程安全是在多线程的环境下,能够保证多个线程同时执行时程序依旧运行正确, 而且
要保证对于共享的数据可以由多个线程存取,但是同一时刻只能有一个线程进行存取。
多线程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯一性。