首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内核块是如何读写sys调用的?

内核块是如何读写sys调用的?
EN

Stack Overflow用户
提问于 2021-01-02 00:02:12
回答 1查看 328关注 0票数 2

从我之前的问题Does close() on socket on one end, closes on the other end as well?中,我了解到当一端发送FIN时,内核将停止阻止读取(因为FIN之后内核不再“期望”更多的数据,从而停止阻塞)。但这个问题是专门针对套接字的。因为read()write()可以用于任何文件描述符(任何设备类型,例如,我可以从管道、套接字、char设备等读取)。根据所有这些设备类型,内核会执行某种阻塞操作。例如,通过管道,内核阻塞read(),直到管道的写入端被close()编辑(直到它“不希望”有更多的数据进入)。但问题是,如果内核按设备类型进行“某种阻塞”,并自行决定何时“期望”某些数据,何时不“期望”某些数据,

  1. 甚至“阻塞”部分是如何实现的?也就是说,进程如何在某一时刻停止其执行,并“等待”输入?(是“阻塞”的行为)。它是如何在内核级实现的?(我怀疑有某种缓冲,但我真的很想知道exec implementation)

  1. 如果内核可以阻止和停止进程的执行,那么我也可以在用户级别执行吗?也就是说,我是否可以以编程方式停止进程的执行,在某个地方创建随机缓冲区,然后等待其他进程的输入?这就是为什么我询问内核实现的原因,因为我希望在用户空间中模仿相同的行为。

如果可能的话,甚至提供一些关于内核部分的解释性资源(例如,好书)(我猜是关于内核中的IO设备实现的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-02 00:49:14

这是一个过于宽泛的话题,无法进行彻底的讨论,但以下是一些基本知识。

首先,有两件事可以阻止一个进程:进程外部的中断和进程内部的某些指令,我称之为陷阱指令。在这两种情况下,计算机处理器的行为在很大程度上是相似的:

每当进程正在执行时,处理器就会不断地从内存中读取指令,执行这些指令,并保持有关进程的信息,包括要执行的下一条指令的地址和包含该进程数据的各种寄存器。当中断或陷阱指令中的一条发生时,处理器保存下一条指令的地址,并可能为该进程保存一些其他数据,将某些内部处理器状态设置为特权模式,并将控制转移到(开始执行指令处)一个特殊地址。

这个地址对于中断和陷阱可能是不同的,对于不同的中断和不同的陷阱也可能是不同的。不管是什么,操作系统都在这个地址放置了特殊的软件。它是软件“处理”中断或陷阱(或跳转到软件做它)。

该软件保存处理器中的数据,用于被中断或被困的进程。它将其存储在操作系统为每个进程维护的一些数据结构中。

现在,进程不再执行了。操作系统正在执行,除非操作系统将该进程的数据从数据结构恢复到处理器寄存器,然后将控制传输回进程的指令,否则该进程将不会再次执行。这是通过一些特殊的从中断返回或从陷阱返回指令来完成的,这些指令可以为进程恢复处理器状态的最后一点,这样它就可以在中断时恢复执行。

因此,操作系统阻塞进程的方式就是不恢复进程的执行。对于操作系统来说,进程很大程度上是它操作的数据,它选择如何处理这些数据。

当进程试图从套接字读取时,它会调用包含陷阱指令的例程。该例程设置一些数据,表示进程希望从套接字读取,然后执行trap指令。陷阱导致进程停止执行,内核开始执行。内核中的陷阱处理程序查看通过例程传递的数据,并看到它是读取套接字的请求。它为此调用了其他一些软件。如果该软件看到没有套接字可用的数据,它只会让进程挂起,然后返回到内核中的其他软件。

然后内核通常会查看是否有任何其他进程可以运行。如果是这样,它将选择其中之一并开始运行它。如果不这样做,它将使处理器处于低功耗模式,等待中断。

在将来的某个时候,一些数据可能会到达套接字。网络设备可能会向处理器生成一个中断,或者某个其他进程可能调用一个例程来发送数据。无论系统以何种方式获取数据,当管理套接字的软件看到它有新的数据时,它将检查是否有进程在等待来自套接字的数据。如果是这样,它将告诉内核进程不再需要等待。如果没有其他任何阻塞进程,它将准备运行。当内核决定是进程再次使用处理器(或者一个处理器,如果有几个可用的话),它将恢复上面描述的进程。

通常,您无法在用户代码中自己实现这些过程。它们需要对硬件的特权访问。操作系统通常为进程提供通信方式,您可以使用系统调用来实现类似于此的通信。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65534857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档