进程、线程和文件描述符笔记整理

进程#

进程是程序的运行实例。进程技术提供了两方面特性。

  1. 每个进程好像在独占使用CPU(基于内核的上下文切换机制)
  2. 每个进程好像在独占使用内存(基于内核的虚拟内存机制)

系统运行时,每隔几毫秒,外部的时钟芯片会发起中断(timer interrupt),使得内核能够从用户进程中拿回控制权。内核负责进行进程调度,保存原进程的寄存器和地址空间,切换到下一个进程,加载下一个进程寄存器和地址空间,完成上下文切换。

并发(concurrency)依赖内核的调度,并行(parallelism)依赖CPU多核技术。

子进程#

linux使用fork系统调用生成子进程,子进程与父进程几乎一致

  • 子进程拥有与父进程相同但独立的地址空间,但并不会立即复制,而是利用COW技术(copy on write)减少开销。

  • 子进程会获得一份与父进程相同但独立的文件描述符表。

  • 子进程拥有与父进程不同的pid,但与父进程同属于一个进程组。

  • 子进程不会继承父进程的SIGNAL handler,但会继承父进程的signal mask

  • 子进程中fork返回0,父进程中fork返回子进程的pid

    image-20220425003625459

线程#

一个进程可以创建多个线程

  • 每个进程有自己独立的逻辑控制流
  • 同一进程的线程共享进程的用户空间的代码段、数据段、堆以及shared libraries(这玩意甚至对所有进程都共享),和内核空间的虚拟内存结构、文件描述符等。
  • 而每个线程拥有独立的栈。值得注意的是,同一个进程内,一个线程可以读写另个线程栈内的数据(需要知道对方的地址),也就是说,不同线程的栈是同时存在于内存地址空间中的,并不会相互覆盖(不考虑物理内存换页的情况)。
  • 基于上下文切换,每个线程拥有独立的寄存器、CPU状态码、sp、ip等,但没有独立的内存地址空间。

process = process context + code, data, stack

image-20220425003851150

process = thread + code, data + kernel context

线程之间没有层级关系

image-20220425000806478

在linux中,创建和回收一个进程大概需要20k个时钟周期,而创建和回收一个线程大概只需要10k个时钟周期,或者更少。

文件描述符#

文件描述符(file descriptor)首先在UNIX中使用,并由Linux,MacOS和BSD在内的现代操作系统使用。在Windows中,文件描述符被称为文件句柄。

当一个进程成功打开一个文件,内核会返回一个文件描述符。文件描述符是0~1023之间的整数,它指向文件描述符表的某一项,而文件描述符表的对应的项则指向内核全局文件表(file table)中的某一项条目。文件表的条目包含了文件的inode、偏移、访问限制等信息。所以进程的文件描述符仅对自己有意义,对其他进程是没有意义的。当然,新创建的子进程除外...

File descriptor diagram

全局文件表中的项被至少应该被一个文件描述符索引,否则将被删除。

类unix系统中,前三个文件描述符0,1,2默认为stdin,stdout,stderror。

在Linux中,“一切皆为文件”,所以像网络连接等也被看作是文件描述符。

作者:yuxiayizhengwan

出处:https://www.cnblogs.com/yuxiayizhengwan/p/16188494.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   雨下yi整晚  阅读(580)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示