通过windows和linux在socket上的几点相同点,来揣测windows和linux在某些实现上的相似
首先,我是一个完全的linux开发初学者,我仅仅在windows做开发,由于兴趣与工作的缘故碰到了通过已有的socket模型搭建好的网络库。下面就说说在windows下,我了解到socket模型(准确是标准socket模型,对于微软封装过的一些模型我不是很清楚)
1,普通阻塞是socket:
普通的socket模型,就是msdn中对socket api族介绍中最简单的那个例子。这种最简单,在执行效率上相对较低,在处理send/recv(sendto/recvfrom)时,函数是处于阻塞的。在简单环境,或者写一些简单的测试工具时,这是一种比较理想的用法。
2,同步 select模型
同步select模型,其实可以是理解为普通阻塞式sokcet的一个扩展,就是利用select来对socket句柄进行监听,避免由于调用send/recv(sendto/recvfrom)时出现阻塞。
3,异步select模型
异步select模型,可以看成是同步select的一种变化。即send/recv(sendto/recvfrom)函数不会阻塞,调用立即返回,并需要同时配合select函数一同使用。
4,IOCP
异步IO模型,使用上可以和异步select模型类比;但这并非标准socket模型。
然后接下来再说一下几个模型的差别:
1,普通socket、select模型,在调用send/recv(sendto/recvfrom)函数时,均会出现一次多余的内存拷贝。即,用户态传如一个buffer时,在转为交给协议栈之前,必须通过内存拷贝的方式,将数据复制到内核态的内存中。
2,windows上select集合最大值大约是64/128(有系统版本决定);换句话说一个调用select函数的线程,最大可监听64/128个socket句柄
*3,据网上各种文档介绍到,select是基于内核态线程轮询完成,具体不详,有待考证!
4,IOCP 和其他几者最大区别在于内存拷贝上,由于IOCP是通过共享内存(即内存映射)。在windows中内存映射属于一个特殊的内存管理器的管辖范围,他即不属于内核态,也不属于用户态内存,当对于内核态或用户态线程来说,只要通过调用内存映射函数,就可以直接访问这块内存(但得到的逻辑地址或许是不同的)。
由于在WSARecv/WSASend之类函数中,提交的均为共享内存,因此无需做任何内存拷贝。所以在IOCP上,性能要更好的多。同时本人的了解范畴也仅限于这一块,对于IOCP的事件投递过程并不是很清楚,但根据《软件调试》一书中对“windows系统调试/windows软件调试”设计的讲述来看,IOCP这种的实现应该是在内核态也同样创建了和用户态以之对应的内核服务线程。
接着再说说linux,刚刚看了一下epoll的介绍。
发现epoll是基于事件回调+内存映射来实现IO上的高效;同时这篇文章也还介绍了几个常用的socket模型在linux中的大概实现。通过这篇文章至少能够看出,linux和windows在对socket的实现上存在很大的相似。
可见linux和windows存在很多相似的地方,如果linux和windows互相对应着学,理解起来可能会快很多。
【心理现象】似曾相似,但又无力改变
—– 似曾相似! ——–
早在很早以前,由于心理压力大,以及当时对心态的调整没有到位,常常会做一些奇奇怪怪的梦;心态的不稳定,常常会导致情绪波动不定。有一些是自身的,有一些是环境造成的。
不过好在经历了一段时间以后,逐渐学会了调整自己的心态;接着年龄的增长,以及阅历的变化,心态的波动正在趋于平稳。虽然有很多想法,但心态还算稳定,就算出现较大的波动,也能够及时的调整回来。
在当初心态不稳定的时候,有两个梦其实我比较在意的。这两个梦一个是关于我工作的,另一个则是关于我生活的。现在回过头去想一想,根据零零散散的记忆,感觉其实也未必是两个梦,或者说是一个梦被切成两个整体;这两个梦都是我自己对未来的一种假设。
其实这两个梦的本身就可以用几句话概括起来:
1,人大约会在什么时候买房
2,人会在什么时候成家
3,人会在什么时候,遇到什么样的关键人物
4,年老会怎么等等
在这个梦里,很多事情都被我潜意识中设想的很美好;而且始终体现了“好事多磨”的情况。实际上,我都一直怕这个梦能够变成真!毕竟人无完人,事情也没有完美的;我显然发现了我自己的这些“设想”中的问题,显然不愿意经历这些问题。但我记得有几句类似的话:
1,越害怕的事情,就越容易成真。
2,越在意的事情,越容易成真
其实我自己也很清楚,真因为我害怕成真,所以我就会刻意的去关注;潜意识中就会按着这种写好的剧本去执行,接着就成真了。于是呢,今天回过头去想想若干年前,确实有些事情,在当时是想都不敢想的,而且切实也有些事情变成也和当初那个梦的内容一模一样了。
这也就是我想说的“似曾相似”,确实有很多事情,让我们感觉到似曾相似,同样我这种过分刻意在乎一个“虚拟化”出来的事情,以至于潜意识中被推动着往这个方向去发展。
—- 无力改变 —-
我想说的无力改变,有两个意思:
1,正因为我刻意在乎梦中的一些事情,导致我的潜意识中存在这么一个情况,然后在一些决策和决定上,就会隐约的按照这个自编自导的“剧本”去进行,想改变都难。
2,如果从另外一个角度去看,当时我其实已经发现梦中一些有问题的地方,并且也已经存在一定的警惕,心中也明白如果刻意在意这个梦的话。势必会让自己按照这部“剧”走下去,不管相似度有多大,但影子总是能看到的。
当时也想就算按照这部“剧”走下去,也要把有问题的部分纠正过来。但事实上,很多地方都没有纠过来。
事后总结了一下,之所以没有纠正过来原因有这么几个:
1,没有经历过显然不知道那是有问题的
2,有些错误或者问题不是立即就会表现出来,而是需要一个量的积累
3,忽视了这个问题
这就是我说的无力改变,有时候想改变或者纠正一些事情,不是因为自己的懒惰,就是因为自己的无知,或缺乏一个仔细分析的行为。
后两者并非所有人都能够达到,但至少懒惰是能够一点一点改善的,所以后续还要避免懒惰这个问题的重复概率。
—- 总结 —-
随着心态的逐渐的趋稳,有些事情也在一点一点的调整中,后续还需要注重平时的积累,同时也要尽力多给自己一些思考问题的时间。
有时候,人败不是败在经验上,就是败在没有给自己留够思考的时间。