默认
发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
java socket接收的数据是否可通过FileDescriptor映射内存?
阅读(59747) | 评论(6 收藏 淘帖
socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用,从而实现进程在网络中通信。
当数据从一台计算机传来时,我们的网卡接收到数据包,然后这个数据包经过一系列的“拦截器”(tcp/ip协议实现的方法),最终是将这个被层层“剥削”的数据暂存在内存中吗?通过FileDescriptor是否可以获取到内存中的数据?
java socket源码中FileDescriptor可以映射磁盘,那么这个FileDescriptor是否可以映射内存?
java socket接收的数据是否可通过FileDescriptor映射内存?_1
FileDescriptor:
文件描述符简称fd。文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,用以标明每一个被进程所打开的文件和socket。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。第一个打开的文件是0,第二个是1,依此类推。读写文件也需要使用文件描述符来指定待读写的文件。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。

总结:假如FileDescriptor可以映射内存,那么从另一台计算机传来的数据,在到达应用层之前,已经放在内存中了。通过socket可以获取输出流,这个输出流里面存有FileDescriptor(这个数据存储在内存中的映射),我的理解对不对?
望各位大大校正。


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:网络编程
上一篇:求教IM服务端多服务器如何择优连接的问题下一篇:Android 特效直播实现原理解析
推荐方案
评论 6
我的理解:
这句话“文件描述符它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,用以标明每一个被进程所打开的文件和socket!”
理解:FileDescriptor其实是映射磁盘文件在内存中的位置。(进程中打开文件是以数组形式存的,所以位置就是数组下标)
结论:一个数据包从网卡到应用层后,经过一些列的“拦截”和“剥削”存储在一个结构体中,并且这个结构体是被socket中的FileDescriptor映射的,有了这个映射就可以通过sokcet的输入输出流输入输出数据了。
签名: 该会员没有填写今日想说内容.
引用:木子凤 发表于 2017-02-23 11:41
谢谢群主的解惑。学java一直都有疑惑,集合、异常、io、文件、线程、socket等的本质是什么?我在看javase ...

是的,这一层的知识你在从网络上是基本找不到的,必须要靠自已,因为很多人都没有思考的这么深入。
引用:JackJiang 发表于 2017-02-23 11:09
你理解的东西已经很深了,应该是工作了3年以上了吧。

我的理解是:如果你现在正在用win32的汇编代码写程 ...

谢谢群主的解惑。学java一直都有疑惑,集合、异常、io、文件、线程、socket等的本质是什么?我在看javase部分时,经常问自己,文件是什么?io是什么?假如你没理解它的本质,那么你永远就只是背这些简单的概念, 下次别人问你,文件是什么?你确定自己知道?
签名: 该会员没有填写今日想说内容.
引用:JackJiang 发表于 2017-02-23 11:09
你理解的东西已经很深了,应该是工作了3年以上了吧。

我的理解是:如果你现在正在用win32的汇编代码写程 ...

群主说的很好,可以感觉的出来对技术的追求,向你学习
签名: 该会员没有填写今日想说内容.
补充2楼的回答:如果你对学习汇编这些东西觉得很枯燥,建议可以直接去买一本《程序员的自我修养》https://book.douban.com/subject/3652388/,这本书虽不涉及具体代码,但对于应用层程序员来说,平时涉及到一些底层工作原理,可以找到一些答案。

java socket接收的数据是否可通过FileDescriptor映射内存?_s3724604.jpg
你理解的东西已经很深了,应该是工作了3年以上了吧。

我的理解是:如果你现在正在用win32的汇编代码写程序,是有这种可能性,也就是你说的直接影射关系。但是对于java而已,java跟操作系统隔了一个JVM层,java的api层能不能实现这种映射这要看jvm的实现,很遗憾我没有深入研究过JVM的这一块,所以不能给你确切的回答。

我个人建议:以你现在对问题的追根溯源的态度,建议你按以下学习方法找到你的答案。
1)你可以把Intel的x86汇编再好好过一遍,真正理解了x86汇编,对实地址模式下的计算机编程会有个非常深入的理解;x86下的代码因为不存在保护模式,所以你现在学习中遇到的很多疑问可以从早期的这种OS里找到答案。
2)接着就直接进入Win32的汇编编程,对于保护模式下的编程——具体的说就是使用win32的api编程,会理解的非常深,进而能理解应用层编程(也就是高级语言编程)与操作系统之间的配合关系。不过,保护模式下,再也不能像x86下那样可以为所欲为地干操作系统能干的事,因为原先x86下的一些关键操作现在都被WIndows这种高级操作系统纳入了只有OS才能使用的特权指令了,对但win32 API的调用,仍有助于对应用层程序员理解OS层的东西。

如果以上2点知识,你都储备的差不多了,那么你会发现,自已写个语言、造个编译器也就那么回事,因为所有的应用层功能都不是自已造的轮子,都有或必须由OS层给你实现,而编写高级语言的人也就是调用了这些OS API而已。

以上学习建议,其实是我个人的亲自体会,我也大约是工作了2年左右,随着开发经验的积累,平时的资料已经不能解答平时遇到的一些问题的确切底层原因,所以我果断再回到大学时代已经学过的汇编,通过实际代码,以底层程序代码的视解,重新审视自已对应用层的理解。我认为,对于我后来的工作是非常有帮助的,很遗憾工作中没有机会真正用汇编写代码,但随着我对它了解的深入,也对汇编越来越喜欢,因为其实汇编才是最简单、最直接的语言,小心翼翼地编程才是真正程序员该有的素养,每个开发者对计算机都应抱有敬畏之心。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部