Fork me on GitHub

socket、handle、context 和 file descriptor

socket、handle、context 和 file descriptor

这四个词的中文翻译是 套接字句柄上下文文件描述符,真的是神翻译啊,翻译成中文也不知道说的是什么东西

socket

socket 本意是 插座,插口

软插口

通信用的软插口

handle

v. 处理 n. 把手

作名词时可以是 门把手,刀柄等

看了很多,摘抄一下

  1. 其实就是对象的 id,靠这个 id 访问对象
  2. 编号 eg: 文件编号 窗口编号
  3. 其实就是数据表里的 id,只不过是操作系统维护的表而已
  4. 跟 unix 中的文件描述符 (fd)作用类似

大佬1的解释

handle 通常是某个数字标记(编号?),通过这个标记(编号)来操作资源。这个编号在不同的场合有不同的叫法,如 ID,如 描述符 (descriptor)。在 Windows 平台,就叫各种 handle

不要将 handle 简单理解成编号,索引。比如分配 16 位的索引,再用 8 位密码将 16 位索引加密。之后将 4 位类型、4 位权限、8 位密码、16 位加密索引打包成一个 32 位的整数作为 handle。这时说这个 handle 是索引就有点不适当了。

用 handle 如何操作真正的资源,是实现的细节。handle 通常被实现为整数,也可以被实现成其他类型。

广义来说,指针也是某种 handle,可以操作对象。但实际语境中,指针跟句柄是有区别的。初次接触到 handle (或者 id),很多人会有迷惑,为什么要用 handle,而不直接用指针呢?

  1. 指针作用太强,可做的事情太多。可做的事情越多,就会越危险。接口设计中,功能刚刚好就够了,并非越多权限越好的。
  2. handle 通常只是个整数,实现被隐藏起来,假如直接暴露了指针,也就暴露了指针类型(有时也可以暴露 void* 指针作为某种 handle)。用户看到越多细节,其代码就越有可能依赖这些细节。将来情况有变,但又要兼容用户代码,库内部改起来就更麻烦。
  3. 资源在内部管理,通过 handle 作为中间层,可以有效判断 handle 是否合法,也可以通过权限检查防止某种危险操作。
  4. handle 通常只是个整数,所有的语言都有整数这种类型,但并非所有语言都有指针。接口只出现整数,方便同一实现绑定到各种语言。

context

本意:上下文

意译:环境

程序执行了部分到了子程序,子程序需要获得结果,要用到程序之前的一些结果(包括但不限于外部变量值,外部对象等)

一些编程构件(如函数)需要考虑到当时的编译 / 运行环境,才能理解它的语义 / 运行结果。

context 是一种有属性的有序序列,给驻留在环境中的对象定义了环境。在对象的激活过程中创建 context,对象被配置为要求某些自动服务,如同步、事务、实时激活、安全性等等。

又如在计算机技术中,相对于进程而言,context 就是进程执行的环境。具体来说就是各个变量和数据,包括所有的寄存器变量,进程打开的文件、内存信息等。

举例: HttpContext

内部主要包括两个成员: Request 请求 和 Response 相应。HttpContext 在被 HttpRunTime 生成之后,会被传入 HttpApplication,然后执行 HttpApplication 的 ProcessRequest() 方法,进入 20 多个管道事件,最后将服务器响应的内容返回到浏览器。

context 应该是程序运行所使用的各种资源,多个程序运行时,系统会为每个程序分配时间,这个程序在规定的时间(片)内未完成,系统应该会保存它的 context ,以便在下一个时间片到来时迅速恢复到原来的运行状态。他应该是程序或子线程的一个静态对象。

维基百科

In computer science, a task context is the minimal set of data used by a task (which may be a process, thread, of fiber) that must to be saved to allow a task to be intertupted, and later continued from the same point. The concept of context assumes significance in the case of interruptible tasks, wherein, upon being interrupted, the processor saves the context and proceedsto serve the interrupt service routine. Thus, the smaller the context is, the smaller the latency is.

The context data may be located in processor registers, memory used by the task, or in control registers used by some operating systems to manage the task.

The storatge memory (files used by a task) is not concerned by the "task context" in the case of a context switch, even if this can be stored for some uses (checkpointing).

fiber 纤程

最轻量化的线程 lightweight threads,是一种 用户态线程 user thread,让应用程序可以独立决定自己的线程要如何运作。操作系统内核不能看见它,也不会为它进行调度。

proceed v. 继续

latency n. 延迟;潜伏


file descriptor

本意:文件描述符

文件描述符维基百科

In Unix and Unix-like computer operating systems, a file descriptor (FD, less frequently fildes) is a unique identifier ( handle ) for a file or other input/output resource, such as a pipe or netrwork socket.

File descriptors typically have non-negative integer values, with negative values being reserved to indicate "no value" lor error conditions.

File descriptors are a part of the POSIX API (Portable Operating System Interface,是 IEEE 制定的一系列标准). Eache Unix process (except perhaps daemons) should have 3 standard POSIX file descriptors, corresponding to the three standard streams:

Interger value Name <unistd.h> symbolic constant <stdio.h> file stream
0 Standard input STDIN_FILENO stdin
1 Standard output STDOUT_FILENO stdout
2 Standard error STDERR_FILENO stderr

StackOverFlow 上对 File Descriptor 的解释

In simple words, when you open a file, the operating system creates an entry to represent that file and store the information about that opened file. So if there are 100 files opened in your OS then there will be 100 entries in OS (somewhere in kernel). These entries are represented by integers like (...100, 101, 102....). This entry number is the file descriptor. So it is just an integer number that uniquely represents an opened file for the process. If your process opens 10 files then your Process table will have 10 entries for file descriptors.

Similarly, when you open a network socket, it is also represented by an integer and it is called Socket Descriptor.

"So it is just an integer number that uniquely represents an opened file in operating system." This is incorrect. That integer uniquely represents an opened file within a process. File descriptor 0, for example, will represent one opened file in one process and a completely different opened file in another process.

更多内容,参考 文件描述符简介




参考资料

Socket 为什么要翻译成套接字

句柄是什么

编程中什么是[Context 上下文]

计算机中的上下文

posted @ 2022-07-04 16:18  icewalnut  阅读(366)  评论(0编辑  收藏  举报