单循环服务器:同一时刻只能处理一个客户端任务
并发服务器: 同一时刻,只能处理多个客户端的任务
实现方法:多进程 多线程 IO多路复用
IO多路复用:
1.阻塞io(fgets scanf recv getchar read)
想要两个io具有同步的方式 | CPU占有率低
2.非阻塞io
使用轮询的方式实现 | cpu占有率高
实现方式:
1.获取原文件描述符的属性fcntl()
2.为文件描述符添加非阻塞属性
3.设置文件描述符属性
fcntl()
常用
F_GETFL 获取 F_SETFL 设置
3.信号驱动io
异步通知的io方式,节省cpu | 只能监测少量io,以轮询的方式可监测多量io
实现方式:
1)为IO设备增加信号驱动属性
O_ASYNC
2)关联SIGIO信号到对应进程
fcntl(fd, F_SETOWN, getpid());
3) 注册SIGIO处理函数
signal
4.io多路复用(多个io通过一个进程监测)
多进程和多线程的主要区别在于以下几个方面:
-
资源管理:
- 多进程:每个进程有自己的内存空间和资源,进程间通信(IPC)通常复杂且开销较大。
- 多线程:线程共享同一进程的内存空间和资源,线程间通信较为简单且高效。
-
开销:
- 多进程:进程创建和销毁的开销较大,因为需要分配和管理独立的内存空间。
- 多线程:线程创建和销毁的开销较小,因为它们共享进程的内存和资源。
-
独立性:
- 多进程:进程间相对独立,一个进程的崩溃不会直接影响到其他进程。
- 多线程:线程之间较为紧密,一个线程的崩溃可能会影响整个进程中的其他线程。
-
使用场景:
- 多进程:适用于需要强隔离和独立运行的任务,如服务器处理多个客户端请求。
- 多线程:适用于需要共享数据和资源的任务,如计算密集型的应用和需要快速响应的应用。