理解计算机系统_并发编程_几个概念---网络IO模型&位向量

前言

如前贴软件(模块)开发的理解-CSDN博客所述,学习框架(库),需要理解程序模型及概念,并会使用配套api.并发的有些概念有些容易混淆,对此做一些补充理解.

引入

回顾电脑主机和互联网主机,套接字连接过程,计算机中的并发和网络并发,位向量,网络I/O模型

回顾网络模型

网络是基于客户端-服务器模型(C/S)而建立的.客户端和服务器被视为互联网主机 .他们在网络上有唯一身份标识:++IP地址++ .因为IP地址不好记忆,所以衍生了"域名".域名和IP地址可能是一一对应,也可能不是.多个域名可以对一个IP,也可能一个域名有多个IP.这是通过DNS(域名系统)来解析的.

客户端和服务器同时是电脑主机上的进程.因为电脑主机上可以有多个进程,所以理论上一台电脑主机可以同时有多个客户端和服务器.但一般情况下除了自己做网络通信的实验外,不会这样设置.如果要设置,一般通过虚拟机虚拟出多台互联网主机.

回顾套接字连接的过程

套接字连接的基本目的:客户端IP地址+端口号 配对 服务器IP地址+端口号

其中:客户端端口号随机,服务器端口号有几个常用(著名)的:http协议的80,smtp协议邮件25

实现过程:

---准备阶段:客户端调用socket函数,生成文件描述符clientfd;服务器调用socket,bind和listen生成监听描述符listenfd.笔者理解这个过程在硬件层面++检查端口是否处于可用状态++,若端口可用则两边的文件描述符生成成功,有正确返回值.

---连接阶段:客户端发起连接请求,调用connect函数;服务器响应请求,调用accept函数,生成connfd描述符.此后双方开始对描述符进行读写操作,传输数据.

---结束:客户端调用close()函数,服务器收到后也调用close(),关闭连接释放资源.

计算机并发和网络并发

计算机PC不同于单片机,他在操作系统管理下运行多个任务,如何将CPU合理分配给各个任务,这是计算机并发需要解决的问题.并发实现:进程(时间片切换)+信号中断(条件切换)

网络并发:服务器要面对多个客户端的连接,并和他们进行数据传输.网络并发要解决先后问题.

两者不同,但解决方法有一点相同,计算机用进程切换解决并发,而解决网络并发的其中一种方法是使用进程.

位向量

没有找到很明确的定义.笔者用类似文件定义---"文件是一个字节序列"来定义位向量:位向量是一个二进制数序列.

问题来了,既然是个二进制数序列,那么为什么不是布尔型数组?

复制代码
int a[]={0,1,2};         //数组声明并赋值
bool boolset[]=0x12;     //bool数组?

笔者也不知道.可能C语言或者其他语言在设计时不支持这种写法.例如0x12,0o12,12(分别表示十六进制,八进制和十进制),但没有直接表示二进制的.

所以位向量 仅是个逻辑 上的表示,必须进行物理上的声明,用int(32位)或者long(64位)的数据来映射位向量(用char,short也可以).所以位向量的表达必须加上二进制数的个数n.例如1024个位向量,如果用int表达,则是32个整数

复制代码
int bset[32];    //1024个位向量

说明:

位向量是唯一表达二进制序列的方法,但他是个逻辑概念,需用其他类型(如整型或long型数组)进行物理表达.

位向量和掩码的意思基本相同

网络I/O模型

网络I/O模型来自于"Unix 网络编程卷1"这本经典书籍.里面讲了几种网络I/O(即数据传输)的模型.笔者查阅了不少资料和别人的帖子,写得也不是很透彻,这里谈谈自己的看法(以下内容未必准确)

=======================内容分割线==========================================

网络I/O模型和网络并发感觉差不多.网络并发解决的问题是:有多个客户端连接时,服务器如何解决?书上讲的是进程,I/O多路复用和线程.而网络I/O模型解决的问题是:有多个数据传输任务时如何安排CPU

=======================内容分割线==========================================

为什么要提出网络模型?因为CPU不参与数据读写,又不能让CPU闲置.

阻塞I/O

他意思是当进程在读写数据时,CPU一直等待(阻塞),待数据完成传输后再进行余下的工作.

---解读:开始时笔者在这里想了很久,CPU是不是傻了?自己没事做的时候为什么不做点别的呢?后来想到因为模型是一种抽象的理想化的东西.而他应用的场景是服务器只有一个或少数几个客户端连接,CPU不是不想做其他事,而是++无事可做++.而因为提出模型的年代久远,当时的操作系统可能还无法自动做进程切换还不一定.

所以模型是因,不要把模型和具体实现弄混了.

与此对应的非阻塞I/O,意思也差不多,不过他会采用轮询的方式一直盯着数据是否传输完成,再进行余下工作.与阻塞I/O的差别是他不是站在那里等,而是边做另一件事边等.

I/O多路复用

简单地说,把多个连接放入一个进程中,当连接A先读写完数据,CPU去服务连接A

连接的个数在多路复用中是有限制的.

异步I/O

现在的进程机制和线程机制,天然满足异步I/O.当连接进入读写数据阶段时,CPU自动走开去做其他事,当读写完成后,发信号给CPU,并让连接进入就绪队列,等候CPU执行.

思考

网络I/O模型并不是一成不变的.现在的模型因为经典,而且有现成api可用,所以非常流行和受欢迎.如果有那个技术能力,可以自己设计网络I/O模型并实现他(需要有修改内核api的能力,如果内核不能改,要有修改封装内核api函数的能力).

小结

网络编程的几个概念的梳理.

相关推荐
利刃大大16 小时前
【网络编程】四、守护进程实现 && 前后台作业 && 会话与进程组
linux·网络·c++·网络编程·守护进程
jllws16 天前
理解计算机系统_并发编程(1)_并发基础和基于进程的并发
服务器·网络编程·计算机系统
jllws17 天前
理解计算机系统_网络编程(5)_echo客户端和服务器
网络编程·计算机系统
Antonio91511 天前
【网络编程】UDP协议 和 Socket编程
网络·udp·网络编程
jllws114 天前
理解计算机系统_网络编程(3)
网络编程·计算机系统
jllws117 天前
理解计算机系统_网络编程(1)
网络编程·计算机系统
Thanks_ks1 个月前
探秘 Python 网络编程:构建简单聊天服务器
python·网络编程·socket·tcp·客户端·套接字·聊天服务器
矮油0_o1 个月前
5.好事多磨 -- TCP网络连接Ⅱ
服务器·网络·tcp/ip·网络编程·socket
joker D8881 个月前
深入理解:阻塞IO、非阻塞IO、水平触发与边缘触发
linux·网络编程·epoll