理解文件IO和套接字

第一部分:dos系统下对磁盘的读写

此部分参考《汇编语言》王爽 清华大学出版社

以3.5英寸软盘为例:2面 * 80磁道 * 18扇区 * 512字节。对磁盘的访问由磁盘控制器进行,只能以扇区为单位对磁盘进行读写。BIOS提供了对磁盘读写的中断例程,为我们封装了对硬件的复杂操作,我们可以用它对磁盘进行读写。当然如果你熟悉底层硬件,精通如何控制磁盘控制器,你也可以自己写一个程序完成读写操作。

中断例程为13h。以下是程序所需的参数:ah 存放13h的功能号(2是读扇区);al 读取的扇区数; ch 磁道号;cl 扇区号;dh 面号;dl 驱动器号;es:bx 指向接收数据的内存区。设置好参数,调用程序就OK了。

反过来,写数据也是差不多的,写扇区的功能号是3。

第二部分:c语言的文件IO

打开文件代码:FILE * fp = fopen(v1, v2); v1是文件名,v2代表打开方式。解释一下:fopen是c标准库函数。当我们用fopen函数打开文件时,会在内存中创建两个区域。一个是文件信息区,其实是一个FILE结构体,存放文件相关信息,包括文件数据缓冲区位置。一个是文件数据缓冲区,用来存放要输入输出的文件数据。这两个区域应该都在操作系统内核中。然后把文件信息区的地址赋给了声明的指针,这样这个指针就能代表这个文件了。一般对文件的读写函数,其参数都是这样的一个指针。

关闭文件:fclose(fp); 撤销文件信息区和文件数据缓冲区。当然,我们都知道底层压根就没有撤销这种概念,其实就是指针不再指向文件信息区,那两块区域也就没人要了。

c语言的文件IO内容非常多,这里我们只是简明扼要的理解其过程。

第三部分:java文件IO

一般来说,整个文件的读写过程如下:读文件,先把数据从硬盘复制到操作系统内核,再从内核复制到程序内存;写文件则是反过来。但是一般来说,我们写程序还是会再建一块缓冲区,作为程序数据和操作系统内核之间的缓冲。

java中负责IO的基类是两个抽象类InputStream和OutputStream,它们有read和write的相关方法。基本流按字节读写,没有缓冲区,不方便使用。

第四部分:socket

套接字也是一种文件。当我们新建一个socket套接字时,一般也会在操作系统内核开辟两块区域。一块存放套接字信息,包括网络通信的相关信息和缓冲区的信息;另一块就是缓冲区,我们从缓冲区读取信息或者向缓冲区写入信息。新建套接字会返回一个文件描述符,这个文件描述符就是我们找到该套接字的依据。显然,套接字由操作系统内核管理起来。实际上,建立TCP连接的过程对程序员来说就是几行代码的事,但三次握手的具体过程是由TCP/IP协议栈自动完成的。发送信息也是一样,我们只是向套接字缓冲区内写入信息,内核中的TCP/IP协议栈会从缓存中读取信息并发送出去。包括确认、重传等机制也是由TCP/IP协议栈负责实现的,基本上和我们程序员没有关系,都是内核的事。我们在编程时最多也就能对TCP/IP协议栈的一些属性进行设置,比如TCP NODELAY。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值