Chinaunix首页 | 论坛 | 博客
  • 博客访问: 711
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2018-03-18 14:10
个人简介

10+从业经验,3CCIE、HCIE、红帽RHCA、VCP。获取Linux资料,可+v:glab-mary

文章分类
文章存档

2024年(17)

我的朋友
最近访客

分类: LINUX

2024-12-24 14:52:57

我们经常听到上下文切换这个词语,但是究竟什么是上下文切换呢?

概念

Linux 是一个多任务的操作系统,可以同时多个任务并发执行,任务数超过CPU核心数。当然同一时刻在执行的任务数,{BANNED}最佳多也就只能是CPU核心数,只不过CPU时间片在多个任务之间来回切换罢了。上下文切换就是为了保存任务切换时刻的基本信息,当CPU重新执行任务的时候可以加载上下文信息,从当时退出的位置、状态重新开始执行任务。这里所说的上下文信息,既包括虚拟内存、栈、全局变量等用户态的资源,也包括内核堆栈、寄存器等内核态的资源。

上下文包含什么信息

看下图,一个进程的信息包含很多,我觉得可以理解为几个方面:CPU-状态信息 I/O状态信息 父子进程信息等:

  • 进程状态:如就绪、运行、阻塞等,表示进程当前的执行状态。

  • 程序计数器(PC):记录进程下一条指令的地址。

  • 寄存器内容:包括通用寄存器、特殊寄存器等,保存进程切换时的 CPU 状态。

  • 内存管理信息:如页面表、段表、内存限制等,用于管理进程的内存分配。

  • 调度信息:如进程优先级、调度队列中的位置等,用于进程调度。

  • I/O 状态信息:记录进程当前所使用的 I/O 设备、文件描述符等。

  • 进程标识符(PID):唯一标识进程的 ID。

  • 父进程和子进程信息:包括父进程 PID、子进程链表等。

  • 时间信息:如进程的启动时间、CPU 时间片消耗等。

这些信息在内核中是通过结构体存储的,即PCB(Process Control Block)进程控制块,下图只是示意,不包含所有内容,在进程让出CPU的时候,这些上下文信息会保存到内核中,当下次执行的时候再从内核中加载回来。

在Linux源码中是通过结构体task_struct来存储的:

上下文切换的类型

--1 进程上下文切换:{BANNED}最佳经常听到上下文切换,多个进程并发,很好理解。

--2 线程上下文切换:包含了同一个进程内的和不同进程内的,不同进程内的消耗等同于进程上下文切换。

--3 中断上下文切换:因为外设控制器执行速度通常慢于CPU,比如打印一个数据这个时候需要内核调用显示设备,很慢怎么办呢?这个是时候就会触发中断,让CPU先干别的进程,等打印完成了再回来。

分析工具

vmstat:查看整个系统的上下文切换情况

vmstat 1 // ==================================== procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 1944104 1026704 24011784 0 0 12 14 10 6 1 1 98 0 0 1 0 0 1944072 1026704 24012760 0 0 0 0 2917 5351 1 1 98 0 0 0 0 0 1945356 1026720 24011852 0 0 0 376 3559 6155 1 1 98 0 0 
  • cs(context switch)是每秒上下文切换的次数。

  • in(interrupt)则是每秒中断的次数。

  • r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。

  • b(Blocked)则是处于不可中断睡眠状态的进程数。

pidstat:查看具体某个进程的上下文切换情况

pidstat -w 5 // ======================================= Average: UID PID cswch/s nvcswch/s Command Average: 0 12 0.60 0.00 ksoftirqd/0 Average: 0 13 62.48 0.00 rcu_sched Average: 0 14 0.40 0.00 migration/0 Average: 0 19 0.40 0.00 migration/1 Average: 0 25 0.40 0.00 migration/2 Average: 0 26 0.20 0.00 ksoftirqd/2

cswch 表示每秒自愿上下文切换(voluntary context switches)的次数。

nvcswch 表示每秒非自愿上下文切换(non voluntary context switches)的次数。

阅读(9) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~