【Java】进程

多线程

  • 进程
    • 进程的管理
    • PCB中的信息
      • pid进程的标识
      • 内存指针
      • 文件描述符表
      • PCB中关于进程调度相关的属性
        • 进程状态
        • 优先级
        • 上下文
        • 记账信息
    • 虚拟空间地址
    • 进程间通信

进程

进程是一个正在运行的程序,没有正在运行的程序不叫进程,同一个程序,运行多次,就可能会产生出多个进程
【Java】进程_第1张图片
晋城市系统分配硬件资源的基本单位

进程的管理

一台正在运行的计算机中,大概率是包含很多进程的,一旦进程的数量变多,就需要考虑如何管理这些进程

进程的管理需要通过先描述在组织的方式进行

先描述每个进程的基本情况,再根据不同的进程进行组织

  1. 描述:在计算机中会使用一个专门的结构体来记录一个进程中的各个属性,这里的结构体主要指C/C++中的结构体 因为操作系统主要是由C/C++来实现的,我们称它为PCB(进程控制块)
  2. 组织:使用一系列的数据结构,把多个进程进行一个有效的组织,随时方便进行遍历查找汇总数据,通常是是使用双向链表这样的方式来组织的(针对于Linux)

当使用双向链表组织时

查看进程的列表,本质上就是在遍历这个链表
创建一个线程,就是创建了一个pcb结构体,并且插入到链表上
销毁一个进程,就是把这个pcb结构体从链表上删除并释放

PCB中的信息

pid进程的标识

同一个系统上,同一时刻中,每个进程的pid一定是不相同的
【Java】进程_第2张图片
有的时候一个exe文件可能涉及到多个进程

内存指针

表示了该进程对应的内存资源是什么样的

在PCB中,内存指针用于指示进程在内存中的位置和相关信息。主要包括以下几种内存指针:

  1. 程序计数器(Program Counter):也称为指令指针,用于记录下一条待执行指令在内存中的地址。每当CPU切换到该进程时,会根据程序计数器的值确定下一条要执行的指令。

  2. 基址寄存器(Base Register):用于指示进程代码段在内存中的起始地址。当进程执行跳转指令或访问代码段中的数据时,会通过基址寄存器加上相对地址来计算实际的内存地址。

  3. 界限寄存器(Limit Register):用于指示进程代码段的大小或界限。当进程访问内存时,操作系统会检查访问的地址是否超出了代码段的界限,以确保进程不会越界访问其他进程的内存空间。

  4. 数据指针(Data Pointers):用于指示进程数据段在内存中的位置和大小。数据指针可以包括堆栈指针、堆指针等,用于管理进程的局部变量、函数调用信息等数据。

这些内存指针在操作系统中起着重要的作用,通过它们可以实现进程的地址映射、内存访问和代码执行等功能。操作系统会负责维护和更新PCB中的内存指针,以确保进程能够正常运行并正确访问内存中的数据和代码段。

文件描述符表

每个进程都会有一个文件描述符表来记录,当前这个进程正在使用哪些文件

操作系统打开一个文件就会产生一个文件描述符,同时会使用文件描述符表,把文件描述符组织起来

需要注意的是,文件描述符表是每个进程独立管理的,不同进程拥有独立的文件描述符表。此外,文件描述符表中的文件描述符并不直接代表文件本身,而是作为索引指向相应的文件结构和I/O资源,操作系统会根据文件描述符进行具体的文件操作。

PCB中关于进程调度相关的属性

pcb中关于进程调度相关的属性也就描述了对应的cpu资源的使用情况

进程状态

进程状态(Process State):用于表示进程的当前状态,常见的状态包括就绪(Ready)运行(Running)阻塞(Blocked)等。进程调度器根据进程状态来确定下一个要执行的进程。

优先级

系统给进程进行调度的时候,也不是完全公平的,会根据优先级的不同,来决定时间分配的权衡,这样可以把系统资源配置给优先级更高,更重要的进程上了

上下文

进程是轮流进行的,一次执行不完,就需要保证下次上cpu运行的时候,能够从上次运行到的位置,继续往后运行,上下文就是来记录这些信息

对于操作系统来说,所记录的上下文是该进程在执行过程中,cpu的寄存器中对应的数据

这些寄存器有的是存一些中间结果,有的是存一些特定含义的数据(例如下一条指令在哪里,当前函数的调用关系),这些寄存器中的数据就需要进程在离开cpu之前,都保存好

这些内容就保存在pcb中的上下文字段中,下次该进程回到cpu执行,就可以把pcb中的上下文里的数据恢复到对应的寄存器中,这个时候,进程就是和上次执行的状态一模一样了

总之,上下文是进程调度中保存和恢复进程执行所需状态信息的关键,它确保了进程能够在正确的地方、正确的时间恢复执行,从而实现多任务处理和进程间的切换。

记账信息

记账信息相当于一个统计信息,会统计每个进程在cpu上都执行了多久,执行了多少条指令,是对进程调度工作进行一个兜底

如果发现给一个线程拍的时间太少,就可以在适当的给这个线程多安排一些时间

虚拟空间地址

每个进程都需要一定的内存资源
早期的操作系统直接把物理内存分配给进程,就带来一个严重的问题,一旦某个进程内部出现bug,使内存越界访问,就可能会影响到其他的进程

所以操作系统后来就引入了虚拟空间地址这样的概念

虚拟地址,并非是物理内存上真实存在的地址,而只是在该进程内存在,不同的进程中,可以存在相同的虚拟地址,但实际上对应到的是不同的物理地址,操作系统可以灵活转换虚拟地址和物理地址

这样设定以后,每个进程的有效的虚拟地址,都是一个固定的范围,进程使用该虚拟地址的内存,都需要操作系统进行转换成物理地址的过程,这个转换过程中,就可以针对虚拟地址是否有效做出一个校验

在虚拟空间地址的加持下,进程就有了’独立性’,每个进程都有自己的虚拟空间地址,一个进程无法直接访问或者修改其他进程虚拟空间地址空间的内容,强化了系统的稳定性

进程间通信

通过虚拟空间地址把进程隔离开了,但有的时候,还需要让进程之间,产生点联系,这就涉及到了进程间通信

  1. 基于文件操作
  2. 基于网络(socket)

你可能感兴趣的:(Java,java,开发语言)