首页 > 系统相关 >进程上下文切换

进程上下文切换

时间:2024-12-30 19:25:41浏览次数:8  
标签:中断 保存 PCB 切换 进程 上下文 内核

进程由哪些部分组成?进程上下文又由哪些部分组成?

进程的组成:

进程控制块(Program control block)(灵魂)

  • 建立进程——建立PCB
  • 撤销PCB——销毁进程

程序(躯体)

  • 代码(code)
  • 数据(data)
  • 堆和栈(stack和heap)(栈:保存返回点、参数、返回值、局部变量  堆:动态变量)

进程的地址空间 

内核空间1G,用户空间3G。

一般来说进程的地址空间指的是用户空间

 进程到底有哪些组成部分 

 

进程的上下文:

  • 物理实体(代码和数据,在地址空间)
  • 支持进程运行的环境(PCB、内核栈、reg)

具体: 

  • 进程的程序块、数据块、运行时的堆和用户栈等组成的用户空间信息是用户级上下文,也就是地址空间
  • 寄存器(reg)是硬件上下文(寄存器上下文),即进程的现场信息 
  • PCB、内核栈等内核信息是系统级上下文 

进程上下文切换

  • 总的来说,下降进程的上下文保存,上升进程中曾经被保存的上下文重新放到被执行的环境中。
  • 在进程上下文切换过程中,OS把换下进程的寄存器上下文保存到系统级上下文(理论上在PCB,实际上PCB很小因此保存在内核栈中,通过stack指针找到)
  • 用户级上下文和系统级上下文一起构成了一个进程的整个存储器映像

何时发生进程上下文切换?

下降进程自身造成切换/外界强制下降进程和上升进程切换

下降进程的现场和断点保存在哪里?是PCB吗?

现场就是寄存器,断点就是PC寄存器。前面已说,理论上在PCB,实际上在内核栈

用户栈和内核栈(中断栈)

每个进程(线程)两个栈:

 

tip:因为上下文切换是由中断驱动的,所以内核栈也叫中断栈。不过IA32将内核栈和中断栈分开,ARM体系结构两者完全一样

CPU硬件的中断响应

基本流程

1、关中断(“中断允许位”自动清0):使CPU处于禁止中断状态,以防止新中断破坏SP、断点(PC)、程序状态字(PSW)等

2、保存断点和中断状态:将用户栈指针、断点、程序状态字(PSW)保存到内核栈

  • SP(SS:ESP)
  • PC(CS:EIP)
  • PSW,在IA-32中是EFLAGS寄存器

为什么要先保存SP?

因为下降进程,它的硬件上下文要保存到PCB或是内核栈中,既然要保存到内核栈,SP就必须由本来用户态时指向用户栈,而改为指向内核栈,这说明SP首先发生变化,故而在将硬件上下文保存到内核栈时,首先要保存SP。之所以知道内核栈的位置,以linux的PCB,即task_struct为例,PCB中有指向本进程内核栈的指针,可以通过PCB找到内核栈

3、识别中断事件,得到“中断类型号”,根据此号,到中断向量表中读取对应的中断服务程序的入口地址 


中断向量表

 

具体流程 

中断发生前:

 中断发生:

 

总结

shell进程和hello进程的例子

进程切换必须由操作系统接管控制权

shell里面运行一个hello程序

进程切换还需要改变当前进程空间

模式切换:CPU还是在同一进程中运行或在在中断上下文时,因此还需要改变进程空间 

  1. 保存当前进程的硬件上下文,对Linux系统而言,硬件上下文大部分(SP/PC/PSW等)保存在struct thread_struct thread中,通用寄存器(eax/ebx)保存在内核栈
  2. 修改当前进程的PCB, 比如将其运行状态由运行态改为就绪或者等待,并将该PCB加入相关队列
  3. 调度另外一个进程
  4. 修改被调度进程的PCB, 状态改为运行(系统上下文)
  5. 将“当前进程”的存储管理数据改为被调度进程的存储管理(页表、TLB)(用户级上下文)
  6. 恢复新进程的硬件上下文,让PC指向新进程代码

标签:中断,保存,PCB,切换,进程,上下文,内核
From: https://blog.csdn.net/LFY20031120/article/details/144818695

相关文章

  • 进程的创建--multiprocesssing模块
    进程的创建使用multiprocessing模块创建进程multiprocessing是process模块的高级封装,其对于进程的操作提供了非常多的操作,所以是工作中操作进程的最常用模块。基本使用代码:importos,timeimportmultiprocessingdefwatch(): print("watch-id=",id(watch)) fori......
  • Linux(Debian)下部署.NET Core网站(守护进程)
    守护进程(可选)sudonano/etc/systemd/system/opac.service键入文本[Unit]Description=opacOPAC[Service]WorkingDirectory=/usr/share/opacExecStart=/usr/bin/dotnet/usr/share/opac/OPAC.dll--urls=http://192.168.0.121:8001&Restart=always#Restartservi......
  • Node.js 性能优化:从异步 I/O 到多进程集群,提升应用响应速度与并发能力
    Node.js性能优化:从异步I/O到多进程集群,提升应用响应速度与并发能力目录前言Node.js性能瓶颈解析2.1.事件循环与异步I/O2.2.CPU密集型与I/O密集型任务2.3.Node.js单线程架构的局限性常见的性能优化策略3.1.优化I/O操作3.2.优化CPU密集型任务3.3.......
  • StreamWriter出现下面错误“正由另一进程使用,因此该进程无法访问该文件”
    原文链接1:https://blog.csdn.net/bingtingabc/article/details/3280190原文链接2:https://blog.csdn.net/youdaodao/article/details/84756175?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-1-847561......
  • 进程间通信组件ZeroMQ详解
    在一些复杂的项目中,往往会由不同功能的程序组成,且在程序运行期间,各个程序还需要进行互相通信,实现进程间通信的方式有很多种,最常用的就是通过消息中间件,比如RabbitMQ,Kafka,以及ZeroMQ等,而RabbitMQ和Kafka这两款中间件往往都需要独立安装步骤才能使用,ZeroMQ却不需要独立安装部署,而是......
  • linux切换nologin用户运行服务时环境变量的设置
    遇到问题:需要切换nologin用户运行服务,同时使得go程序崩溃时可以生成core。使用sudo-H-u$USER/bin/bash-c"nohup./server>/dev/null2>&1&"。发现设置的环境变量不生效。问题原因:shell没有继承当前用户的环境变量,sudo-E-H-u$USER/bin/bash-c,加入-E会尝试继承当......
  • DG 切换步骤
    登陆备库,检查同步状态和lag,确保lag应接近于0,同步状态正常: select*fromv$dataguard_stats selectprocess,status,client_process,thread#,sequence#,block#fromv$managed_standby;  多执行几次,确保mrp应用的block#在变化 检查主库的standbylogfile(因为切......
  • 【Linux进程】初悉进程
    学习编程就得循环渐进,扎实基础,勿在浮沙筑高台   循环渐进Forward-CSDN博客进程调度简介1.2进程查看命令1.3进程的几个要素二、进程的生命周期2.1进程状态文字描述2.2进程状态的切换2.3task_struct数据结构2.4进程优先级⑴优先级的代码表示⑵Linux内核下的进程分......
  • MCP(Model Context Protocol)模型上下文协议 进阶篇2 - 消息格式和功能
    在开发前,首先带大家熟悉一下MCP协议的消息格式,和所有可能需要进行协商的功能:MCP协议通过JSON-RPC2.0规范定义了请求、响应和通知三种消息类型,确保通信的标准化和一致性。能力协商机制使客户端和服务器能够动态确定支持的协议功能,提升协议的灵活性和扩展性。子能力的引入进一......
  • 【C语言】多进程/多线程
    多进程/多线程多进程服务器步骤代码多线程一、线程创建和回收二、线程属性三、线程分离多进程服务器步骤  服务器使用父进程fork创建子进程来和客户端进行通信,父进程负责取出连接请求。并且父进程接收子进程退出信号,通过信号处理函数回收子进程步骤:1.首先屏......