我的理解: 这句话“文件描述符它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,用以标明每一个被进程所打开的文件和socket!” 理解:FileDescriptor其实是映射磁盘文件在内存中的位置。(进程中打开文件是以数组形式存的,所以位置就是数组下标) 结论:一个数据包从网卡到应用层后,经过一些列的“拦截”和“剥削”存储在一个结构体中,并且这个结构体是被socket中的FileDescriptor映射的,有了这个映射就可以通过sokcet的输入输出流输入输出数据了。 |
引用:木子凤 发表于 2017-02-23 11:41 是的,这一层的知识你在从网络上是基本找不到的,必须要靠自已,因为很多人都没有思考的这么深入。 |
引用:JackJiang 发表于 2017-02-23 11:09 谢谢群主的解惑。学java一直都有疑惑,集合、异常、io、文件、线程、socket等的本质是什么?我在看javase部分时,经常问自己,文件是什么?io是什么?假如你没理解它的本质,那么你永远就只是背这些简单的概念, 下次别人问你,文件是什么?你确定自己知道? |
引用:JackJiang 发表于 2017-02-23 11:09 群主说的很好,可以感觉的出来对技术的追求,向你学习 |
补充2楼的回答:如果你对学习汇编这些东西觉得很枯燥,建议可以直接去买一本《程序员的自我修养》https://book.douban.com/subject/3652388/,这本书虽不涉及具体代码,但对于应用层程序员来说,平时涉及到一些底层工作原理,可以找到一些答案。 |
你理解的东西已经很深了,应该是工作了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年左右,随着开发经验的积累,平时的资料已经不能解答平时遇到的一些问题的确切底层原因,所以我果断再回到大学时代已经学过的汇编,通过实际代码,以底层程序代码的视解,重新审视自已对应用层的理解。我认为,对于我后来的工作是非常有帮助的,很遗憾工作中没有机会真正用汇编写代码,但随着我对它了解的深入,也对汇编越来越喜欢,因为其实汇编才是最简单、最直接的语言,小心翼翼地编程才是真正程序员该有的素养,每个开发者对计算机都应抱有敬畏之心。 |