Java EE初阶-计算机导论

news/2025/2/23 16:04:44

一、cpu的重要指标 

核心参数

  1. 核心数(Cores)
    • 含义:核心是 CPU 中执行指令的运算单元,核心数代表了 CPU 内独立运算核心的数量。
    • 影响核心数越多,CPU 在同一时间内能够并行处理的任务就越多。例如,在多任务处理场景下,如同时运行办公软件、浏览器、视频播放器等,多核 CPU 可以将不同任务分配到不同核心上同时处理,提高系统的整体运行效率。
  2. 线程数(Threads)
    • 含义线程是 CPU 调度和执行的最小单位,通过超线程技术,一个物理核心可以模拟出多个逻辑线程。
    • 影响:线程数的增加使得 CPU 在处理多线程任务时更加高效。比如在进行视频编辑、3D 渲染等多线程应用程序中,更多的线程可以让程序更快地完成任务。例如英特尔的一些 CPU,通过超线程技术可以让一个物理核心模拟出两个逻辑线程,从而在一定程度上提升 CPU 的多任务处理能力。
  3. 主频(Clock Speed)
    • 含义:主频即 CPU 内核工作的时钟频率,单位是 GHz(吉赫兹),表示 CPU 在一秒钟内能够完成的时钟周期数
    • 影响:一般来说,主频越高,CPU 在单位时间内处理的指令就越多,运算速度也就越快。但主频并不是衡量 CPU 性能的唯一标准,因为不同架构的 CPU 在相同主频下的实际性能可能会有所差异。例如,一款主频为 3.0GHz 的 CPU 在处理某些任务时可能不如另一款主频为 2.5GHz 但架构更先进的 CPU。

缓存参数

  1. 一级缓存(L1 Cache)
    • 含义:一级缓存是 CPU 中速度最快、与 CPU 核心距离最近的缓存,分为数据缓存(L1d)和指令缓存(L1i)。
    • 影响:一级缓存的作用是存储 CPU 近期可能会频繁访问的数据和指令,以减少 CPU 从内存中读取数据的时间。较大的一级缓存可以提高 CPU 的运行效率,尤其是在处理一些对数据读取速度要求较高的任务时,如游戏、科学计算等。
  2. 二级缓存(L2 Cache)
    • 含义:二级缓存的容量比一级缓存大,速度稍慢,用于存储一级缓存未命中的数据。
    • 影响:当一级缓存中没有所需的数据时,CPU 会从二级缓存中查找。二级缓存可以进一步减少 CPU 从内存中读取数据的时间,提高系统的整体性能。在一些对数据处理能力要求较高的应用中,如数据库管理系统、图形处理软件等,较大的二级缓存可以显著提升 CPU 的性能。
  3. 三级缓存(L3 Cache)
    • 含义:三级缓存是 CPU 中容量最大、速度相对较慢的缓存,多个核心共享三级缓存。
    • 影响:三级缓存可以存储更多的数据和指令,当一级和二级缓存都未命中时,CPU 可以从三级缓存中获取数据。在多核心 CPU 中,三级缓存可以提高核心之间的数据共享效率,减少数据传输延迟,从而提升 CPU 在多核心并行处理任务时的性能。

二、不同的 CPU 有不同的指令集

不同的 CPU 系列有不同的指令集,而指令集的差异会导致对应的汇编语言有所不同。

指令集与 CPU 的关系

  • 指令集的定义指令集是计算机硬件的语言系统,它规定了 CPU 能够执行的各种操作,如数据传输、算术运算、逻辑运算、控制转移等。不同的 CPU 系列为了满足不同的应用场景和性能需求,会设计出不同的指令集。
  • 常见的指令集架构
    • x86 架构:由英特尔公司开发,广泛应用于个人计算机、服务器等领域。x86 指令集具有丰富的指令和强大的兼容性,从早期的 8086 到现在的酷睿系列 CPU 都基于 x86 架构进行发展和扩展。
    • ARM 架构:主要应用于移动设备(如智能手机、平板电脑)、路由器嵌入式系统等领域。ARM 指令集具有低功耗、高性能的特点,被众多芯片厂商采用,如苹果 A 系列芯片、华为麒麟芯片等都基于 ARM 架构设计。
    • MIPS 架构:曾经在网络设备、游戏机等领域有广泛应用。MIPS 指令集设计简洁,易于实现,具有较高的执行效率。

指令集对汇编语言的影响

  • 汇编语言的本质:汇编语言是一种面向机器的低级编程语言,它使用助记符来表示 CPU 的指令。每条汇编指令都对应着 CPU 指令集中的一条具体指令,因此不同的指令集必然导致不同的汇编语言。
  • 不同汇编语言的差异
    • 指令助记符不同:以 x86 和 ARM 汇编语言为例,x86 汇编中使用 “MOV” 指令进行数据传输,而 ARM 汇编中使用 “MOV”(ARM)或 “LDR/STR”(Thumb)指令来实现类似的数据传输功能,但它们的语法和操作数格式可能会有所不同。
    • 寄存器使用不同:不同的 CPU 架构拥有不同的寄存器组,因此在汇编语言中对寄存器的使用和操作也会不同。例如,x86 架构有通用寄存器(如 EAX、EBX、ECX 等),而 ARM 架构有自己的通用寄存器(如 R0 - R15)。
    • 寻址方式不同:寻址方式是指指令中指定操作数地址的方法。不同的指令集支持不同的寻址方式,这也反映在汇编语言中。例如,x86 汇编支持直接寻址、间接寻址、基址变址寻址等多种寻址方式,而 ARM 汇编的寻址方式也有其自身的特点。

示例对比

x86 汇编示例
; 计算两个数的和
MOV AX, 5    ; 将立即数5传送到寄存器AX
MOV BX, 3    ; 将立即数3传送到寄存器BX
ADD AX, BX   ; 将AX和BX中的值相加,结果存放在AX中
ARM 汇编示例
; 计算两个数的和
MOV R0, #5   ; 将立即数5传送到寄存器R0
MOV R1, #3   ; 将立即数3传送到寄存器R1
ADD R2, R0, R1 ; 将R0和R1中的值相加,结果存放在R2中

通过以上示例可以看出,x86 和 ARM 汇编语言在指令助记符、寄存器使用等方面存在明显的差异,这正是由于它们所基于的指令集不同所导致的。

三、计算机系统中各组成部分之间的层次关系

硬件设备 >> 驱动程序 >> 操作系统内核 >> 系统调用 >> 应用程序

硬件设备

  • 定义:硬件设备是计算机系统的物理组成部分,包括中央处理器(CPU)、内存、硬盘、显卡、网卡、键盘、鼠标等。它们是计算机系统运行的物质基础,为计算机提供了各种计算和输入输出能力
  • 作用:不同的硬件设备具有不同的功能,例如 CPU 负责执行计算机的指令和进行数据处理,硬盘用于长期存储数据,键盘和鼠标则是用户输入信息的设备。硬件设备需要通过特定的方式与计算机系统进行连接和通信。

驱动程序

  • 定义:驱动程序是一种特殊的软件,它是硬件设备与操作系统之间的桥梁。每种硬件设备都需要相应的驱动程序才能在操作系统中正常工作。驱动程序由硬件制造商开发,它了解硬件设备的内部工作原理和通信协议,能够将操作系统的指令转换为硬件设备可以理解的信号
  • 作用:驱动程序的主要作用是实现对硬件设备的控制和管理。它负责初始化硬件设备,使其进入正常工作状态;处理硬件设备的中断请求,及时响应硬件设备的状态变化;提供硬件设备的各种功能接口,使得操作系统和应用程序可以方便地使用硬件设备的功能。例如,显卡驱动程序可以让操作系统和应用程序正确地控制显卡进行图形渲染和显示,声卡驱动程序可以实现声音的播放和录制。
  • 驱动程序是以文件的形式存在于计算机的硬盘或其他存储设备中的。这些文件包含了驱动程序的代码和相关数据,当操作系统启动时,会自动加载和运行必要的驱动程序,以确保硬件设备能够正常工作。例如,在 Windows 操作系统中,驱动程序文件通常以.sys、.dll 等扩展名结尾。

操作系统内核

  • 定义:操作系统内核是操作系统的核心部分,它是计算机系统中最底层的软件,直接与硬件设备进行交互。内核负责管理计算机的各种资源,包括 CPU、内存、设备等,为上层的应用程序提供一个稳定、高效的运行环境。
  • 作用:操作系统内核的主要功能包括进程管理、内存管理、设备管理、文件管理等。它通过调度算法来分配 CPU 时间片,确保多个进程可以公平、高效地共享 CPU 资源;通过内存分配回收机制来管理计算机的内存空间,保证程序的正常运行;通过设备驱动程序来控制和管理各种硬件设备;通过文件系统来组织和管理计算机中的文件和文件夹。

应用程序

  • 定义:应用程序是为了满足用户的特定需求而开发的软件,如办公软件、游戏软件、浏览器等。应用程序运行在操作系统之上,通过调用操作系统提供的系统调用和服务来完成各种任务。
  • 作用:应用程序是用户与计算机系统进行交互的主要方式,它为用户提供了各种功能和服务。用户可以通过应用程序来完成文字处理、数据处理、娱乐等各种任务。应用程序的开发通常基于操作系统提供的开发工具和库,利用操作系统的功能来实现自己的业务逻辑。例如,一个办公软件可以利用操作系统的文件管理功能来保存和打开文档,利用操作系统的图形界面功能来显示用户界面。

四、计算机系统中各组成部分之间的交互流程

各组成部分之间的交互流程可以概括为以下几个步骤:

  1. 用户启动应用程序:用户通过操作系统的用户界面(如桌面图标、开始菜单等)启动一个应用程序。操作系统接收到用户的启动请求后,会为应用程序分配必要的系统资源,如内存空间、CPU 时间片等,并将应用程序加载到内存中开始执行
  2. 应用程序请求系统服务:应用程序在运行过程中,可能需要访问计算机的各种资源,如文件、网络、设备等。此时,应用程序会通过调用操作系统提供的系统调用接口来请求操作系统提供相应的服务。例如,应用程序可以调用 “open” 系统调用函数来打开一个文件,调用 “send” 系统调用函数来发送网络数据。
  3. 操作系统处理请求:操作系统接收到应用程序的请求后,会根据请求的类型和参数进行相应的处理。如果请求涉及到硬件设备的操作,操作系统会调用相应的驱动程序来完成具体的操作。例如,当应用程序请求读取文件时,操作系统会调用硬盘驱动程序来从硬盘中读取数据。
  4. 驱动程序与硬件设备通信:驱动程序接收到操作系统的指令后,会与硬件设备进行通信,将操作系统的指令转换为硬件设备可以理解的信号,并控制硬件设备执行相应的操作。例如,硬盘驱动程序会向硬盘发送读取数据的指令,硬盘接收到指令后会将数据从磁盘中读取出来,并通过数据线传输给计算机。
  5. 返回结果给应用程序:硬件设备完成操作后,驱动程序会将操作结果反馈给操作系统,操作系统再将结果返回给应用程序。应用程序接收到结果后,会根据结果进行相应的处理,如显示数据、进行计算等。

以用户使用浏览器访问网页为例,其交互流程如下:

  1. 用户双击桌面上的浏览器图标,操作系统为浏览器分配内存和 CPU 资源,并将浏览器程序加载到内存中运行。
  2. 浏览器程序通过调用操作系统的网络服务接口,向指定的网站发送 HTTP 请求。
  3. 操作系统接收到浏览器的请求后,调用网卡驱动程序,将 HTTP 请求数据封装成网络数据包,并通过网卡发送到网络中。
  4. 网站服务器接收到请求后,处理请求并返回 HTTP 响应数据。
  5. 网卡接收到服务器返回的数据包后,网卡驱动程序将数据包解封装,并将数据传递给操作系统。
  6. 操作系统将数据传递给浏览器程序,浏览器程序解析 HTTP 响应数据,并将网页内容显示在浏览器窗口中。

五、系统调用

系统调用:操作系统给程序员提供的api(比如有一个程序员想操作一下硬件设备,就需要先通过系统调用,把操作命令告诉系统内核,内核调用驱动程序,进一步操作硬件设备。)

系统调用(System Call)是操作系统提供给用户程序的接口,用于程序向操作系统请求特定的服务。它是用户程序与操作系统内核交互的桥梁。

定义

系统调用是操作系统内核提供给应用程序的一组特殊接口,应用程序通过调用这些接口来请求操作系统内核完成一些特权操作,因为用户程序通常运行在用户态,没有足够的权限直接访问系统资源或执行某些敏感操作,所以需要通过系统调用切换到内核态,让具有更高权限的操作系统内核来完成相应任务。

作用

  • 资源管理:应用程序可以通过系统调用请求操作系统分配和管理各种资源,如内存、文件、设备等。例如,使用malloc函数分配内存时,实际上会调用底层的系统调用来向操作系统申请内存空间。
  • 进程控制:系统调用允许应用程序创建、终止和管理进程。比如,fork系统调用可以创建一个新的进程,exit系统调用用于终止当前进程。
  • 文件操作:应用程序可以使用系统调用来进行文件的创建、打开、读写和关闭等操作。像open系统调用用于打开一个文件,readwrite系统调用分别用于从文件读取数据和向文件写入数据。
  • 设备交互:借助系统调用,应用程序能够与各种外部设备进行交互,如键盘、鼠标、打印机等。例如,通过特定的系统调用可以读取键盘输入或向打印机发送打印任务。
  • 网络通信:在网络编程中,系统调用提供了创建网络套接字、发送和接收网络数据等功能。例如,socket系统调用用于创建一个网络套接字,sendrecv系统调用用于在网络上发送和接收数据。

调用过程

  1. 应用程序准备:应用程序在需要使用系统服务时,会设置好系统调用所需的参数,通常将这些参数存放在寄存器或栈中。
  2. 触发系统调用:应用程序通过执行特定的指令(如 x86 架构中的int 0x80syscall指令)来触发系统调用,这会导致CPU从用户态切换到内核态
  3. 内核处理:操作系统内核接收到系统调用请求后,根据系统调用号(每个系统调用都有一个唯一的编号)来确定具体要执行的操作,并执行相应的内核代码来完成任务。
  4. 返回结果:内核完成系统调用的处理后,将结果返回给应用程序,并将处理器从内核态切换回用户态,应用程序继续执行后续的代码。

常见类型

  • 进程管理类:包括fork(创建新进程)、exec(执行新程序)、wait(等待子进程结束)、exit(终止当前进程)等。
  • 文件操作类:如open(打开文件)、close(关闭文件)、read(读取文件内容)、write(写入文件内容)、lseek(移动文件读写指针)等。
  • 设备管理类:例如ioctl(设备控制操作),可以用于控制各种设备的工作模式、获取设备状态等。
  • 内存管理类:像brksbrk(调整进程的堆内存大小)、mmap(内存映射,将文件或设备映射到进程的地址空间)等。
  • 网络通信类:有socket(创建套接字)、bind(绑定套接字到特定地址和端口)、listen(监听连接请求)、accept(接受连接请求)、connect(建立连接)等。

六、寄存器

寄存器是计算机处理器内部的高速存储部件,是 CPU 的重要组成部分,用于暂时存储数据和指令,在计算机的运行过程中发挥着关键作用。以下为你详细介绍:

基本概念

寄存器是一种由触发器组成的存储电路,具有非常高的访问速度。它直接集成在 CPU 芯片内部,与 CPU 的运算器和控制器紧密相连,能够在极短的时间内完成数据的读写操作,这使得 CPU 可以快速地处理数据和执行指令。

主要功能

  • 数据暂存:在 CPU 进行运算时,寄存器用于暂时存放参与运算的数据和运算结果。例如,在进行加法运算时,两个加数会被先存放到寄存器中,CPU 对寄存器中的数据进行加法操作,运算结果也会暂时存放在寄存器里。
  • 指令控制:寄存器可以保存指令地址和指令信息。程序计数器(PC)是一种特殊的寄存器,它存储着下一条要执行的指令的地址,CPU 根据 PC 的值从内存中取出指令并执行。指令寄存器(IR)则用于存放当前正在执行的指令。
  • 地址索引:在访问内存时,寄存器可以作为地址指针,帮助 CPU 快速定位内存中的数据。例如,基址寄存器和变址寄存器可以组合使用,形成复杂的内存地址,用于访问数组、结构体等数据结构。

常见类型

  • 通用寄存器:可用于多种用途,如存储数据、地址等。不同架构的 CPU 通用寄存器数量和名称有所不同。例如,在 x86 架构中,常见的通用寄存器有 EAX、EBX、ECX、EDX 等,它们可以用于算术运算、数据传递等操作。
  • 专用寄存器:具有特定的功能,专门用于完成某些特定的任务。
    • 程序计数器(PC):也称为指令指针寄存器(IP),它始终指向下一条要执行的指令的内存地址。当一条指令被执行后,PC 的值会自动更新,指向下一条指令的地址,从而保证程序能够按顺序依次执行。
    • 指令寄存器(IR):用于存放当前正在执行的指令。当 CPU 从内存中取出一条指令后,会将其存放到 IR 中,然后对 IR 中的指令进行解码和执行。
    • 状态寄存器(PSW):也叫标志寄存器,用于记录 CPU 的状态信息和运算结果的特征。例如,进位标志(CF)表示算术运算是否产生了进位;零标志(ZF)表示运算结果是否为零等。这些标志位可以作为条件判断的依据,用于实现程序的分支和循环控制。
    • 栈指针寄存器(SP):在使用栈这种数据结构时,SP 指向栈顶的地址。栈是一种后进先出(LIFO)的数据结构,常用于函数调用、参数传递和局部变量存储等操作。当进行压栈(PUSH)和出栈(POP)操作时,SP 的值会相应地改变。

重要性

寄存器的高速访问特性使得 CPU 能够快速地获取和处理数据,避免了频繁地从内存中读写数据所带来的延迟。在计算机的运行过程中,大量的数据处理和指令执行都依赖于寄存器的支持。如果没有寄存器,CPU 的运算速度将会受到极大的限制,计算机的整体性能也会大幅下降。

六、进程

描述:使用结构体(pcb 进程控制块)来描述进程属性

组织:通过双向链表,来把多个pcb串在一起

创建一个进程 本质上就是创建一个pcb这样的结构体对象,把他插入到链表中

销毁一个进程 本质上就是把链表上的pcb节点删除掉

任务管理器查看到进程列表,本质上就是遍历这个pcb链表

七、pcb里面描述进程的特征

1.进程标识信息

  • 进程标识符(PID):每个进程都有一个唯一的标识符,用于在操作系统中区分不同的进程。PID 是一个整数,由操作系统在进程创建时分配。PCB 中会存储这个 PID,操作系统通过它来对进程进行各种操作,如调度、终止等。例如,当用户使用 kill 命令终止某个进程时,就是通过指定该进程的 PID 来实现的。
  • 父进程标识符(PPID):记录创建该进程的父进程的 PID。这种父子关系有助于操作系统进行进程的层次管理和资源回收。比如,当父进程终止时,操作系统可以根据 PPID 找到其所有子进程,并进行相应的处理。

2.进程状态信息

  • 当前状态:PCB 中会明确记录进程当前所处的状态,如运行态、就绪态、阻塞态、创建态或终止态。这些状态反映了进程在其生命周期内的不同阶段和活动情况。操作系统根据进程状态来进行调度和资源分配。例如,只有处于就绪态的进程才有机会被调度到 CPU 上运行。
  • 状态转换信息:除了当前状态,PCB 可能还会记录进程状态转换的相关信息,如进入阻塞态的原因、从阻塞态恢复到就绪态的条件等。这些信息有助于操作系统更好地管理进程的状态转换。

3.进程调度信息

  • 优先级:PCB 中存储了进程的优先级,用于操作系统进行进程调度时确定进程的执行顺序。优先级高的进程通常会优先获得 CPU 资源。例如,实时进程的优先级通常较高,以确保它们能够及时响应外部事件。
  • 调度相关时间信息:包括进程已经使用的 CPU 时间、上次调度的时间等。这些信息可以帮助操作系统实现公平调度时间片轮转等调度算法。例如,在时间片轮转调度算法中,操作系统会根据进程已经使用的 CPU 时间来判断是否需要将其暂停,转而调度其他进程。

4.进程资源信息

  • 内存信息:记录进程的内存使用情况,如进程的代码段、数据段和堆栈段在内存中的起始地址和大小(内存指针)。操作系统通过这些信息来管理进程的内存分配和回收,确保进程之间的内存空间相互隔离。
  • 文件描述符表:PCB 中包含一个文件描述符表,用于记录进程打开的文件和设备。每个文件描述符对应一个打开的文件或设备,进程可以通过文件描述符来进行文件的读写、设备的控制等操作。
  • I/O 设备信息:记录进程使用的 I/O 设备,如正在使用的磁盘、打印机等。操作系统根据这些信息来协调进程对 I/O 设备的访问,避免设备冲突。

5.进程上下文信息

  • 寄存器值:PCB 中保存了进程在执行过程中的各种寄存器值,如程序计数器(PC)、栈指针(SP)、通用寄存器等。当进程被暂停执行时,这些寄存器值会被保存到 PCB 中;当进程再次被调度执行时,操作系统会从 PCB 中恢复这些寄存器值,使进程能够继续之前的执行状态。
  • 程序状态字(PSW):记录了进程的执行状态和一些控制信息,如标志位(如进位标志、零标志等)、中断允许位等。PSW 对于操作系统进行中断处理和异常处理非常重要。

八、进程调度相关的属性

1)进程的状态

1. 运行态(Running)

  • 定义:进程正在占用 CPU 并执行其程序代码。在单 CPU 系统中,同一时刻只有一个进程处于运行态;而在多 CPU 系统中,可能有多个进程同时处于运行态。
  • PCB 体现:PCB 中会有相应的标志位来表明该进程正处于运行态,同时记录当前进程在 CPU 上执行时的各种寄存器值,如程序计数器(PC),它指向进程下一条要执行的指令地址,还有通用寄存器的值等,这些信息能让进程在运行过程中保持其执行现场。
2. 就绪态(Ready)

  • 定义:进程已经准备好运行,只等待操作系统分配 CPU 资源。处于就绪态的进程已经具备了运行的所有条件,只是由于 CPU 被其他进程占用,暂时无法执行。
  • PCB 体现:PCB 中状态字段会标记为就绪态。操作系统会将所有处于就绪态的进程组织成一个就绪队列,通过 PCB 中的指针等信息将这些进程连接起来,方便操作系统进行调度,选择下一个要运行的进程。
3. 阻塞态(Blocked)

  • 定义:也称为等待态,进程因等待某个事件(如 I/O 操作完成、等待信号量等)而无法继续执行,主动放弃 CPU 进入等待状态。在事件未发生之前,进程不能被调度执行。
  • PCB 体现:PCB 状态标记为阻塞态,并且会记录进程等待的事件类型和相关信息。例如,如果进程在等待磁盘 I/O 操作完成,PCB 中会记录对应的磁盘设备号、要读写的数据块地址等信息。操作系统会将处于阻塞态的进程组织成不同的阻塞队列,每个队列对应一种等待事件。
4. 创建态(New)

  • 定义:进程正在被创建的过程中。操作系统需要为新进程分配 PCB、初始化相关信息、分配内存空间等,在这些操作完成之前,进程处于创建态。
  • PCB 体现:此时 PCB 处于初始化阶段,部分信息可能还未完全设置好。操作系统会逐步填充 PCB 中的各项内容,如进程 ID、初始状态等。
5. 终止态(Terminated)

  • 定义:进程已经执行完毕或者因某种原因(如程序出错、被外部强制终止等)而终止。操作系统需要进行一些善后工作,如释放进程占用的资源(内存、文件描述符等)。
  • PCB 体现:PCB 状态标记为终止态,操作系统会根据 PCB 中的信息来回收进程所占用的各种资源,之后再释放 PCB 本身所占用的内存空间

进程状态转换

  • 创建态 -> 就绪态:当操作系统完成了新进程创建的所有初始化工作后,将进程放入就绪队列,进程状态从创建态转换为就绪态。
  • 就绪态 -> 运行态:操作系统的调度程序从就绪队列中选择一个进程,为其分配 CPU 资源,该进程状态从就绪态变为运行态。
  • 运行态 -> 阻塞态:当运行中的进程需要等待某个事件时(如发起 I/O 请求),主动放弃 CPU 进入阻塞态。
  • 阻塞态 -> 就绪态:当进程等待的事件发生(如 I/O 操作完成),操作系统会将该进程从阻塞队列移到就绪队列,进程状态从阻塞态变为就绪态。
  • 运行态 -> 终止态:进程执行完毕或者遇到严重错误、被外部强制终止等情况,进入终止态。

2)优先级

先给谁排 给谁排多少

3)上下文(存档的内容)

操作系统在进行进程间切换的时候 就需要把进程执行的“中间状态”记录下来,保存好

下次这个进程再上cpu运行的时候,就可以恢复上次的状态好继续向下执行

存档,读档

进程的上下文,就是cpu中的各个寄存器的值 (寄存器:CPU内置的存储数据的模块,保存的就是程序运行过程中的中间结果)

保存上下文 就是把这些CPU寄存器的值记录保存到内存中(pcb中)

恢复上下文 就是把内存中的这些寄存器值恢复回去

4)记账信息

1. 操作系统,统计每个进程在cpu上占用的时间和执行的指令数目,根据这个来决定下一阶段如何调度

2. 内存管理:虚拟地址 MMU硬件设备 (虚拟地址映射物理地址)操作系统内核发现地址越界 直接反应错误(谁出bug谁崩溃 不会对其他进程造成影响)

当物理内存不足时,操作系统可以将暂时不用的内存页面交换到磁盘上,需要时再换回来,从而为程序提供一个比实际物理内存大得多的虚拟内存空间

3. 进程之间相互交互的问题 在隔离性的基础上 创建一个公共区域来交换数据

共享内存

  • 原理:共享内存是一种最为高效的进程间通信(IPC)方式。操作系统会在物理内存中开辟出一块特定的区域,多个进程可以将这块区域映射到它们各自的虚拟地址空间中。这样,不同进程就可以直接对这块公共的物理内存区域进行读写操作,如同访问自己的内存空间一样,从而实现数据的快速交换。
  • 示例:在 Linux 系统中,可以使用shmget函数来创建共享内存段,使用shmat函数将共享内存段映射到进程的地址空间。多个进程通过这种方式连接到同一个共享内存段后,就能进行数据的交互。例如,一个数据采集进程将采集到的数据写入共享内存,另一个数据分析进程从共享内存中读取数据进行分析。

消息队列

  • 原理:消息队列是一种异步的通信方式,它在操作系统内核中创建一个队列数据结构作为公共区域。进程可以将消息(数据块)放入队列中,也可以从队列中取出消息。消息队列按照一定的规则进行管理,如先进先出(FIFO),确保消息的有序传递。
  • 示例:在 Unix 和 Linux 系统中,使用msgget函数创建或获取一个消息队列,使用msgsnd函数将消息发送到队列中,使用msgrcv函数从队列中接收消息。比如,在一个多进程的日志处理系统中,各个进程将日志消息发送到消息队列,日志处理进程从队列中取出消息进行统一的存储和分析。

管道

  • 原理:管道是一种半双工的通信方式,分为无名管道(Pipes)和命名管道(FIFOs)。无名管道通常用于具有亲缘关系的进程(如父子进程)之间的通信,它是一个特殊的文件,在内存中开辟一块缓冲区作为公共区域。数据从管道的一端写入,从另一端读出。命名管道则可以在任意两个进程之间进行通信,它有一个对应的文件路径名,多个进程通过该路径名来访问这个管道。
  • 示例:在 Linux 系统中,使用pipe函数创建无名管道。例如,父进程可以将数据写入管道,子进程从管道中读取数据。命名管道可以使用mkfifo函数创建,不同进程可以通过读写该命名管道文件来实现数据交换。

共享文件

  • 原理:多个进程可以同时访问同一个文件,将文件作为公共的数据交换区域。进程可以将数据写入文件,其他进程从文件中读取数据。为了保证数据的一致性和完整性,通常需要使用文件锁等机制来进行并发控制
  • 示例:多个进程可以对一个文本文件进行读写操作。例如,一个进程将统计数据写入文件,另一个进程定时从文件中读取数据进行展示。在数据库系统中,多个客户端进程可以通过共享数据库文件来进行数据的交互和共享。


http://www.niftyadmin.cn/n/5863565.html

相关文章

链表-基础训练(二)链表 day14

两两交换链表中的节点 题目示意: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 原先我的思路是图像上的思路,但是我感觉还是很复杂…

使用docker开发镜像编译

前言 搭建参考的是官网文档 环境 wsl2 wsl2内存分配和禁用swap 在window主机中,按下快捷键win+r,输入%UserProfile%,会跳转到用户目录,在该目录下,如果没有wsl配置文件,则创建一个.wslconfig,文件类型应为WSLCONFIG,而不是文档类型 我是用vscode来创建的,进入到.wslco…

Spring Boot定时任务原理

Spring Boot定时任务原理 在现代应用中,定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持,通过注解驱动的方式,开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理…

将产品照片(form.productPhotos)转为 JSON 字符串发送给后端

文章目录 1. 前端 form.productPhotos 的当前处理a. 组件绑定b. 当前发送逻辑 2. 如何将 form.productPhotos 转为 JSON 字符串发送给后端a. 修改前端 save() 方法b. 确保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代码,我将分析如何将产品照片&a…

模块化设计的力量:从「乐高积木」看组合式开发如何降低软件工程风险

引言:当汽车工厂开始制造积木 想象一家汽车工厂,如果每生产一辆新车都需要重新设计螺丝、焊接发动机、调试轮胎,生产效率将极其低下。但现实中,所有车企都采用「模块化生产」——发动机、变速箱、底盘等核心部件独立开发&#xf…

学习PostgreSQL专家认证

认证途径:由 PostgreSQL 联盟分会授权机构提供的认证考试,出的相关认证。这些认证考试通常具有较高的权威性和认可度,能够证明考生在 PostgreSQL 领域的专业能力。 厂商认证:一些数据库厂商或培训机构也会提供自己的 PostgreSQL 认…

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试!

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试! 01 加解密的意义 现阶段的渗透测试让我发现越来越多的系统不只是在漏洞修补方面做了功夫,还对一些参数进行加密,干扰爬虫或者渗透测试的进行。 在我小白阶段看到下图这种加密方式…

容器和虚拟机选择对比

1. 概述 如果主要需求是学习和测试 Ubuntu 下的命令行工具或服务型应用,推荐使用 Docker Docker 更轻量、更高效,适合快速搭建和销毁环境。 启用 WSL 2,Docker Desktop 是一个非常好的选择。 如果需要完整的桌面环境或进行复杂的系统级开…