从系统的角度讲,数据是怎么被传输的?

从系统的角度讲,数据是怎么被传输的?

每一次创建进程就创建进程控制块PCB,进程控制块的核心实现就是task_struct,task_struct是一个结构体;

在task_srtruct中有一个files指针,用于指向文件的结构体,文件结构体当中就有一个文件描述符数组,数组的索引号就是文件描述符,用于打开文件;

每个文件都有一个inode,socket文件里的inode就指向内核当中socket结构体,在这个结构体当中会有一个发送队列和接收队列。发送队列/接收队列都存在很多的sk_buff,这个sk_buff就是网络当中各个抽象层的数据包。

为什么每一层要使用相同的结构体?

不需要每次传递都进行拷贝,如果拷贝会浪费很多cpu性能

具体的实现:
sk_buff当中有一个叫做data的指针

每次接收和发送就靠里面的data指针的移动

  • 接收就是逐步剥离首部的过程:

因此指针指向整个数据包的过程是向后移动的,也就是data指针的值一直在增加

  • 发送就是逐步增加首部的过程:

所以在数据加上头部之前,需要预留出一部分头部的空间,之后在每一层加上头部时data指针的值就减少,向前移动,指向到新加上的头部的开始位置

以下就是整个进程操作数据发送接收的流程


欢迎批评指正!

### 操作系统层面的工作原理 当 Java 进程从磁盘读取文件时,操作系统通过一系列复杂的机制来完成数据传输和管理。以下是这一过程的详细解析: 1. **用户空间与内核空间的隔离** Java 应用程序运行在用户空间,而文件的实际读取操作是由内核空间完成的。Java 进程无法直接访问磁盘硬件,必须通过系统调用来请求内核进行文件读取操作。这种方式确保了系统的安全性和稳定性,同时避免了用户进程对硬件的直接操作可能导致的问题[^4]。 2. **DMA 技术的应用** 在文件读取过程中,操作系统使用了直接内存访问(DMA)技术。内核首先通过 DMA 将文件内容从磁盘读入内核空间的缓冲区(buffer)。这种方式避免了 CPU 的直接参与,从而提高了数据传输的效率。随后,Java 进程再从内核缓冲区将数据复制到用户空间的应用程序缓冲区,完成数据的读取过程[^1]。 3. **文件描述符与文件对象** 文件读取操作涉及到文件描述符(file descriptor)的概念。在 Linux 系统中,进程通过文件描述符访问文件。文件描述符是一个非负整数,它指向内核中的文件对象(struct file)。文件对象包含了文件的状态信息和操作函数指针,使得进程可以通过统一的接口访问不同的文件类型。这种设计体现了面向对象的思想,简化了文件操作的复杂性[^3]。 4. **虚拟内存机制** 为了进一步提升 I/O 效率和处理能力,操作系统采用了虚拟内存机制。虚拟内存通过使用虚拟地址取代物理地址,使得每个进程拥有独立的地址空间。这种机制不仅提高了内存的利用率,还允许进程在访问文件时不需要关心物理内存的具体分配情况。通过虚拟内存,文件读取操作可以更高效地进行,减少了数据复制的开销[^1]。 5. **文件系统的组织与访问** 文件系统的组织方式也影响着文件读取的效率。数据的读取按柱面进行,而不是按盘面进行。这意味着在一个磁道写满数据后,会在同一柱面的下一个盘面继续写入数据。这种方式提高了硬盘的读写效率,确保了数据的快速访问[^5]。 6. **Java 文件操作的跨平台特性** Java 作为一门跨平台的语言,通过 JVM 对不同操作系统的文件管理 API 进行了封装。开发者只需使用 JDK 提供的文件操作 API,即可完成对文件的读取和写入操作,而无需关心底层操作系统的具体实现。这种封装不仅简化了开发过程,还确保了 Java 应用程序在不同平台上的兼容性[^2]。 ### 示例代码 以下是一个简单的 Java 示例,展示了如何从磁盘读取文件内容: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FileReadExample { public static void main(String[] args) { String filePath = "example.txt"; // 文件路径 try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); // 输出文件内容 } } catch (IOException e) { e.printStackTrace(); // 处理异常 } } } ``` 在上述代码中,`FileReader` 和 `BufferedReader` 用于从磁盘读取文件内容。Java 的文件读取操作最终会通过 JVM 调用操作系统提供的底层 API,完成数据从磁盘到用户空间的传输。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值