深入理解计算机系统勘误
- 格式:docx
- 大小:75.37 KB
- 文档页数:17
软件测试工程师年终工作总结时光荏苒,如今2022年的帷幕已经谢下,2022年的钟声已经敲响,在公司高层的正确领导下,我们__科技又走过了一年。
而我也在自己的努力以及同事的帮助下完成了2022年我所负责的工作,以下就是我对过去这一年的工作总结:一、测试工作及经验作为软件部测试组的一员,首先要做好的就是自己的本职工作,我在2022年中所做的工作主要有:测试用例的编写,对系统的测试、跟踪;需求、高保图、界面和功能的测试;功能测试用例的编写,高保图、系统的测试;__的静态页面测试和功能测试;__的功能测试;第一、二、三迭代高保图测试,测试用例编写,静态页面和功能测试,并主持参与测试用例评审;平台高保图的测试和系统静态页面、功能的测试;__的高保图测试和测试用例的编写;__的静态页面和功能测试,参与测试用例的评审;__的高保图测试、静态页面和功能测试;用户使用手册的编写。
一年的工作,让我获得很多方面的经验:1.编写逻辑覆盖率全的测试用例甚为重要。
在理解需求的前提下编写测试用例,使得我掌握了多种测试用例编写方法,更让我对产品的需求有更加深入的理解,须知对需求是否理解透彻决定了能否有效、全面地对产品进行测试。
2.要站在用户角度对系统进行测试。
从一些项目中出现的未能及时发现的bug中,我认识到用户体验的重要性,现在能够越来越多的从这方面来执行测试。
3.对拿到手的项目有较清晰的思路,能够更加快速、准确地发现问题。
4.越来越规范的工作流程的让我们的工作有条不紊的进行,让我深刻认识到工作的规范性是多么的重要,并且从中学习如何从文档和流程上规范工作。
5.同事间的沟通很重要。
现在不管遇到什么不确定或疑惑,都与开发人员、产品经理等及时沟通,大大提高了工作的效率。
二、加强自我能力的提高只有不断的提高自己各种的能力,才能胜任越来越艰巨的任务,因此在工作相对不饱和的时候,我自己进行了一些学习。
为提高对“用户体验”的理解,我学习了《下一站用户体验》,书中一些经验确实让我获益匪浅。
关于位操作的书-回复
以下是一些关于位操作的书籍:
1. 《深入理解计算机系统》(Computer Systems: A Programmer's Perspective)- 由Randal E. Bryant和David R. O'Hallaron撰写。
该书全面介绍了计算机系统的各个方面,包括位操作。
2. 《Hacker’s Delight》- 由Henry S. Warren Jr.撰写。
这本书专注于位操作的技巧和优化,涵盖了各种位操作的基本概念和高级技巧。
3. 《Bitwise Operations in C: Tips, Tricks, and Techniques》- 由Alan M. Perlis撰写。
这本书专门介绍了使用C语言进行位操作的技巧、窍门
和技术。
4. 《竞赛中的位运算》- 由范明、周源、成蕾等撰写。
这本书主要面向程序设计竞赛选手,通过大量的例题和实例详细讲解位操作在算法设计中的应用。
这些书籍均可帮助读者深入理解位操作的概念、技巧和应用场景。
根据个人的学习目标和背景,选择适合自己的一本作为入门指南或进阶参考材料。
《深⼊理解计算机系统》第三版第三章家庭作业答案简述相信⼤部分⼈在做这些题的时候,因为书中没有给答案,⽽去⽹上找参考答案,⽐如那些⾼阅读量的博客和git 。
当然,我也是这样,但他们的答案中还是有好多错误,⽐如3.59他们⼏乎都没讲清楚提⽰中的公式怎么来的,3.60中对移位操作中对%cl 的读取,等等。
希望读者们在阅读这些⽂章时,要带着⾃⼰的思想和疑问去理解,⽽不是⼀味地觉得答案就肯定是对的,当然,本⽂有任何错误,也欢迎各位指出。
3.58long decode2(long x,long y,long z){y = y - z;x = x * y;y <<= 63;y >>= 63;return y ^ x;}y 先左移63位,再右移63位,如果之前y 是奇数,那么y 的⼆进制全是1;y 是偶数,那么y 的⼆进制全是0.3.59⾸先讲解⼀下,提⽰⾥的公式x =264∗x h +x l x =264∗xh +xl ,之所以可以这么写是因为符号拓展,以4位⼆进制int 为例:1111的补码数,为-1.将其进⾏符号拓展后为1111 1111,其值也为-1,但这⾥可以将1111 1111写为⾼位1111的补码数 * 2424 + 低位1111的⽆符号数:即-1 * 2424 + 15 = -1.原理:%rdx 和%rax 的⼆进制连起来表⽰这个数,既然连起来了,符号位就跑到了%rdx 的最⾼位了,除符号位权值为负外,其余位的权值均为正。
所以,⾼位寄存器%rdx 当做补码数,低位寄存器%rax 当做⽆符号数。
因为符号位现在在⾼位寄存器那⼉呢,所以⾼位寄存器当做补码数了;⽽低位寄存器的每⼀位的权值现在都是正的了,所以低位寄存器要当做⽆符号数。
所以x l xl 为T 2U (x )T2U(x)即x 的⼆进制表⽰作为⽆符号数。
x l xl 与x x 有相同的位级表⽰。
x h xh ,当原数符号位为1,64位⼆进制位上全为1,其值为-1;当原数符号位为0时,64位⼆进制位上全为0,其值为0。
计算机错误处理与容错技术解析计算机是现代社会中不可或缺的工具,然而在计算机工作的过程中,由于硬件故障、软件错误或其他原因,会不可避免地出现错误。
因此,计算机错误处理与容错技术成为了计算机科学领域中的一个重要研究方向。
本文将详细解析计算机错误处理与容错技术,涵盖以下几个方面的内容:1. 错误类型与产生原因- 硬件错误:例如芯片故障、电路连接错误等。
- 软件错误:例如编程错误、逻辑错误等。
- 网络错误:例如数据传输中的丢包、延迟等。
2. 错误诊断与定位- 硬件错误诊断:通过硬件测试设备、故障排除等手段来检测和定位硬件错误。
- 软件错误诊断:通过调试工具、错误日志等手段来检测和定位软件错误。
- 网络错误诊断:通过网络分析工具、数据包分析等手段来检测和定位网络错误。
3. 容错技术- 硬件容错技术:例如冗余冗余阵列(RAID)、错误检测与纠正码(ECC)等。
- 软件容错技术:例如备份与恢复、事务处理等。
- 网络容错技术:例如冗余路由、链路聚合等。
4. 错误处理与修复- 硬件错误处理:例如更换故障硬件、替换故障部件等。
- 软件错误处理:例如修复软件漏洞、修改代码等。
- 网络错误处理:例如调整网络拓扑、增加网络带宽等。
5. 错误预测与预防- 硬件错误预测与预防:通过硬件监控、负载平衡等手段预测和预防硬件错误。
- 软件错误预测与预防:通过代码审查、测试用例设计等手段预测和预防软件错误。
- 网络错误预测与预防:通过流量分析、拓扑优化等手段预测和预防网络错误。
6. 错误处理与容错技术的应用领域- 数据中心:例如在大规模服务器集群中,故障容错成为了提升系统可靠性的重要手段。
- 嵌入式系统:例如在飞行控制系统、医疗设备等领域,容错技术能够保证系统的稳定运行。
- 云计算:例如在云平台中,通过容错技术可以提供高可用、高性能的服务。
总结:计算机错误处理与容错技术是保障计算机系统运行稳定性和可靠性的重要手段。
通过对不同类型的错误进行诊断、容错和预测,可以极大程度上降低错误对计算机系统的影响,提高系统的可用性和性能。
出版社:中国电力出版社原出版社:Pearson Education系列名:国外经典计算机科学教材系列作者:(美)Randal E. Bryant/ Davic O'Hallaron/译者:龚奕利/ 雷迎春/出版日期:2004年5月版别版次:2004年5月北京第一版第一次印刷国标编号:ISBN 7-5083-2175-8条形码:9787508321752字数:1209千字内容提要:本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,着名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。
作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE 双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。
本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。
其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。
与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。
本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。
本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。
本书提供了大量的例子和练习及部分答案。
尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
作者介绍:Randal E. Bryant 1973年获得密歇根大学(University of Michigan)学士学位,随即就读麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士学位。
《深入理解计算机系统》读后感第一次听到这本书还是我们的导师袁志斌老师介绍的。
在这之前我是对它毫无概念可言。
袁老师对这本书可谓是推崇备至,因此就介绍给我们全班,并希望说让我们能够静下心好好的去看它、了解它。
于是我开始了阅读"深入"的征程。
之所以说是"征程"是因为这本说的内容确实是很难。
至少是对于我来说。
很多东西之前都没有接触过。
除了那点少的可怜的C语言底子之外就剩下数字电路的东西了。
其他的基本上是听都没听过。
毕竟这本书要求先修的课程有很多,神马《计算机组成原理》,《汇编程序设计》。
这些都没有学过。
但是,就算是这样,凭着被袁老师鼓起的热情,硬着头皮买了它,开始了啃"深入"的日子。
在这里先简单的介绍一下"深入"的基本章节内容。
第一章A Tour of Computer System对计算机系统总体的做了一个简单的介绍,第二章Representing and Manipulating Information主要说的是信息在计算机中的表示形式。
包括整数和浮点数的表示形式。
第三章Machine-Level Representation of Program汇编语言的复习。
过程调用,尤其是过程调用(包括递归调用)中堆栈的使用情况是经常会考到的。
数据在内存中的"对齐"方式,也是经常出现在考题中的。
比如定义一个结构体数组,打印出其中一个元素的地址,问这个地址相对数组起始地址有多少个字节的距离。
第四章Processor Architecture计算机体系结构的内容。
处理器结构,各种逻辑门、功能单元,指令集,指令的执行,指令执行的流水线等。
第五章Optimizing Program Performance如何优化程序的执行效率,包括代码的优化,编译器的优化,及CPU级别的优化。
CPU级别的优化,微指令的概念,功能单元上微指令的并行,程序分支的预测等。
深⼊理解计算机系统(第三版)第⼆章家庭作业答案博客⾥只有代码部分,位运算和浮点表⽰真妙!2.55#include <stdio.h>#include <string.h>typedef unsigned char* byte_pointer;void show_byte(byte_pointer x,int len){for(int i =0; i < len; i++)printf("%.2x ", x[i]);printf("\n");}void show_int(){int num =8;byte_pointer bp =(byte_pointer)#show_byte(bp,sizeof(int));}void show_double(){double num =3.1415926535;byte_pointer bp =(byte_pointer)#show_byte(bp,sizeof(double));}void show_short(){short num =8;byte_pointer bp =(byte_pointer)#show_byte(bp,sizeof(short));}int main(){show_int();show_double();show_short();return0;}2.58#include <iostream>using namespace std;typedef unsigned char* byte_point;int is_little_endian(){int32_t num =1;byte_point bp =(byte_point)# printf("%s\n", bp);cout <<*bp << endl;printf("%d\n", num);if(*bp)return1;elsereturn0;}int main(){printf("%d\n",is_little_endian());}2.59typedef unsigned char* byte_point;void show_byte(int x,int len){byte_point bp =(byte_point)&x;for(int i =0; i < len; i++)printf("%.2x ", bp[i]);printf("\n");}byte_point change(int x,int y){byte_point bx =byte_point(&x);byte_point by =byte_point(&y);byte_point bz =(byte_point)malloc(sizeof(int));for(int i =0; i <sizeof(int); i++){if(i ==0)*bz =*bx;else*(bz + i)=*(by + i);}return bz;}int main(){int x =0x89abcdef;int y =0x76543210;printf("%d %d\n", x, y);byte_point z =change(x, y);show_byte(x,sizeof(int));show_byte(y,sizeof(int));for(int i =0; i <sizeof(int); i++)printf("%.2x ", z[i]);// show_byte(z, sizeof(int));return0;}2.60#include <stdio.h>unsigned replace_byte(unsigned x,int i,unsigned char b){ int move = i <<3;return(x &~(0xFF<< move)| b << move);}int main(){int x =0x12345678;printf("0x%.8X\n",replace_byte(x,2,0xAB));printf("0x%.8X\n",replace_byte(x,0,0xAB));return0;}2.61int main(){int move =(sizeof(int)-1)<<3;//全为1输出1,否则输出0int x =0x0;int y =0xffffffff;printf("%d %d\n",!(x ^~0x0),!(y ^~0x0));printf("%d %d\n",!(~x),!(~y));//全为0输出1printf("%d %d\n",!(x ^0),!(y ^0));printf("%d %d\n",!x,!y);//最低有效字节全为1输出1printf("%d %d\n",!(~(x &0xff)<< move),!(~(y &0xff)<< move)); //最⾼有效字节全为0输出1printf("%d %d\n",!(x >> move),!(y >> move));printf("%d\n", y >> move);return0;}2.62#include <stdio.h>bool int_shifts_are_arithmetic(){int x =0x80000000;return(x >>30)&8;}int main(){printf("%d",int_shifts_are_arithmetic());return0;}2.63signed srl(unsigned x,int k){unsigned xsra =(int)x >> k;int obj =~(((1<< k)-1)<<((sizeof(int)<<3)- k)); return xsra & obj;}signed sra(int x,int k){int xsrl =(unsigned) x >> k;int sum =sizeof(int)<<3;int judge =1<<(sum -1- k);judge &= xsrl;int obj =~(judge -1);return xsrl | obj;}int main(){printf("%.8x\n",srl(0x81001100,4));printf("%.8x\n",sra(0x81001100,4));return0;}2.64#include <stdio.h>int any_odd_one(unsigned x){unsigned obj =0x55555555;return!!(x & obj);}int main(){unsigned x =0x00000001;printf("%d\n",any_odd_one(x));return0;}2.65#include <iostream>int odd_ones(unsigned x){int w =sizeof(int)<<3;x ^= x >>16;x ^= x >>8;x ^= x >>4;x ^= x >>2;x ^= x >>1;return x &1;}int main(){int a =0xffff0000;int b =0x00000103;printf("%d %d",odd_ones(a),odd_ones(b)); return0;}2.66int leftmost_one(int x){int w =sizeof(int)<<3;x |= x >>1;x |= x >>2;x |= x >>4;x |= x >>8;x |= x >>16;return x &((~x)>>1|0x80000000);}int main(){int a =0xff000000;int b =0x00000040;printf("%.8x %.8x\n",leftmost_one(a),leftmost_one(b)); return0;}2.67#include <stdio.h>int bad_int_size_is_32(){int set_msb =1<<31;int beyond_msb = set_msb <<1;return set_msb &&!beyond_msb;}int bad_int_size_is_32_in16(){int set_msb =1<<15;set_msb <<=15;set_msb <<=1;int beyond_msb = set_msb <<1;return set_msb &&!beyond_msb;}int main(){printf("%d\n",bad_int_size_is_32());printf("%d\n",bad_int_size_is_32_in16());return0;}2.68#include <stdio.h>int lower_one_mask(int x){int w =sizeof(int)<<3;return(unsigned)-1>>(w - x);}int main(){int a =6;int b =17;printf("%.8x\n",lower_one_mask(a));printf("%.8x\n",lower_one_mask(b));return0;}2.69unsigned rotate_left(unsigned x,int n){ int w =sizeof(int)<<3;unsigned ans = x;ans <<= n;ans |= x >>(w - n);return ans;}int main(){int a =0x12345678;int x1 =0;int x2 =20;printf("0x%.8x\n",rotate_left(a, x1)); printf("0x%.8x\n",rotate_left(a, x2)); return0;}2.70#include <stdio.h>#include <limits.h>int fits_bits(int x,int n){int w =sizeof(int)<<3;int obj = x <<(w - n)>>(w - n); return obj == x;}int main(){int x =0x00000011;int n =1;printf("%d\n",fits_bits(x, n));printf("%d\n",fits_bits(INT_MAX,32)); printf("%d\n",fits_bits(0,0));return0;}2.71#include <stdio.h>typedef unsigned packed_t;int xbyte(packed_t word,int bytenum){ int w = bytenum +1<<3;return(int)word <<(32- w)>>(3<<3); }int main(){int word =0xf1f2f380;printf("%.8x\n",xbyte(word,0));printf("%.8x\n",xbyte(word,1));printf("%.8x\n",xbyte(word,2));printf("%.8x\n",xbyte(word,3)); return0;}2.72void copy_int(int val;void*buf,int maxbytes){if(maxbytes <0)return;if(maxbytes >=sizeof(val))memcpy(buf,(void*)&val,sizeof(val));}2.73#include <stdio.h>#include <limits.h>int saturating_add(int x,int y){int w =sizeof(int)<<3;int is_diff_sign =(x ^ y)>>(w -1);int is_overflow =((x + y)^ x)>>(w -1);int judge = x >>(w -1);// printf("%d %d %d\n", is_diff_sign, is_overflow, judge);// printf("%d\n", is_diff_sign & (x + y));int a =(is_diff_sign &(x + y));int b =((~is_diff_sign &((~is_overflow &(x + y))+(is_overflow &(judge & INT_MIN +~judge & INT_MAX)))));int c=((is_diff_sign &(x + y))+(~is_diff_sign &((~is_overflow &(x + y))+(is_overflow &((judge & INT_MIN)+(~judge & INT_MAX)))))); //printf("%d %d %d\n", a, b, c);return c;}int main(){printf("%d\n",saturating_add(1,100));printf("%d\n",saturating_add(1000,-10));printf("%d\n",saturating_add(INT_MAX,12321));printf("%d\n",saturating_add(INT_MIN,-1));return0;}2.74#include <stdio.h>#include <limits.h>int tsub_ok(int x,int y){y =-y;int w =sizeof(int)<<3;int same =(x ^ y)>>(w -1);int overflow =((x + y)^ x)>>(w -1);return same ||!overflow;}int main(){printf("%d\n",tsub_ok(INT_MIN,1));printf("%d\n",tsub_ok(-1,100));printf("%d\n",tsub_ok(-23,INT_MAX));return0;}2.75#include <inttypes.h>int signed_high_prod(int x,int y){int64_t high_prod =(int64_t)x * y;return high_prod >>32;}unsigned unsigned_high_prod(unsigned x,unsigned y){int w =sizeof(int)<<3;int bit_x = x >>(w -1);int bit_y = y >>(w -1);int sig_high =signed_high_prod(x, y);return sig_high + x * bit_y + y * bit_x;}unsigned unsigned_high_prod_two(unsigned x,unsigned y){ uint64_t high_prod =(uint64_t)x * y;return high_prod >>32;}int main(){unsigned x =0xffffffff;unsigned y =0x12345678;printf("%.8x\n",unsigned_high_prod(x, y));printf("%.8x\n",unsigned_high_prod_two(x, y));return0;}2.76#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>void*calloc(size_t nmemb, size_t size){if(!nmemb ||!size)return NULL;// return (int*)malloc(sizeof(int) * size);size_t size_sum = nmemb * size;if(nmemb == size_sum / size){void*ptr =malloc(size_sum);memset(ptr,0, size_sum);return ptr;}elsereturn NULL;}int main(){void*p =calloc(123,1);if(p ==NULL){printf("P = NULL\n");}elsefree(p);return0;}2.77int mul1(int x){return(x <<4)+ x;}int mul2(int x){return x -(x <<3);}int mul3(int x){return(x <<6)-(x <<2);}int mul4(int x){return(x <<4)-(x <<7);}int main(){int x =10;printf("%d\n",mul1(x));//*17printf("%d\n",mul2(x));//*-7printf("%d\n",mul3(x));//*60printf("%d\n",mul4(x));//*-112return0;}2.78#include <stdio.h>#include <limits.h>int divide_power2(int x,int k){int w =sizeof(int)<<3;int sign = x >>(w -1);int bias =(1<< k)-1;return(~sign &(x >> k))+(sign &(x + bias)>> k); }int main(){printf("%d\n",divide_power2(51,1));printf("%d\n",divide_power2(-51,1));return0;}2.79#include <stdio.h>#include <limits.h>int mul3div4(int x){int w =sizeof(int)<<3;x =(x <<1)+ x;int sign = x >>(w -1);int bias =(1<<2)-1;return(~sign &(x >>2))+(sign &((x + bias)>>2)); }int main(){printf("%d\n",mul3div4(3));printf("%d\n",mul3div4(4));return0;}2.80#include <stdio.h>#include <limits.h>int threefourths(int x){int w =sizeof(int)<<3;int sign = x >>(w -1);int bias =(1<<2)-1;x =(~sign &(x >>2))+(sign &(x + bias)>>2);return(x <<1)+ x;}int main(){printf("%d\n",threefourths(4));printf("%d\n",threefourths(5));printf("%d\n",threefourths(-5));return0;}2.81#include <stdio.h>int A(int k){return(-1)<< k;}int B(int k,int j){return~A(k)<< j;}int main(){printf("%.8x\n",A(4));printf("%.8x\n",B(8,4));return0;}2.82#include <stdio.h>#include <stdlib.h>/*A错。
《深⼊理解计算机系统》阅读总结与摘要前⾔《深⼊理解计算机系统》值得每位程序员⼀读,看完之后将会对整个计算机体系有⼀个直观的认识。
第⼀章计算机系统漫游只有ascii字符构成的⽂件称为⽂本⽂件,所有其它⽂件都称为⼆进制⽂件。
c语⾔是古怪的,有缺陷的,但同时也是⼀个巨⼤的成功,为什么会成功呢c语⾔与unix操作系统关系密切c语⾔⼩⽽简单c语⾔是为实践⽬的设计的有⼀些重要的原因促使程序员必须知道编译系统是如何⼯作的优化程序性能理解链接时出现的错误避免安全漏洞shell是⼀个命令⾏解释器,它提出⼀个提⽰符,等待输⼊⼀个命令⾏,然后执⾏这个命令。
如果该命令⾏的第⼀个单词不是⼀个内置的shell命令,那么shell就会假设这是⼀个可执⾏⽂件的名字,它将加载并运⾏这个⽂件。
贯穿整个系统的是⼀组电⼦管道,称作总线。
io设备是系统与外部世界的联系通道。
主存是⼀个临时存储设备,在处理器执⾏程序时,⽤来存放程序和程序处理的数据。
处理器,是解释或执⾏存储在主存中指令的引擎。
利⽤直接存储器存取,数据可以不通过处理器⽽直接从磁盘到达主存。
通过让⾼速缓存⾥存放可能经常访问的数据,⼤部分的内存操作都能在快速地⾼速缓存中完成每个计算机系统中的存储设备都被组织成了⼀个存储器层次结构。
操作系统有两个基本功能防⽌硬件被失控的应⽤程序滥⽤,向应⽤程序提供简单⼀致的机制来控制复杂⽽⼜通常⼤不相同的低级硬件设备。
操作系统通过基本的抽象概念(进程,虚拟内存和⽂件)来实现这两个功能。
⽂件是对i/o设备的抽象表⽰,虚拟内存是对主存和磁盘i/o设备的抽象表⽰,进程则是对处理器,主存和i/o设备的抽象表⽰。
进程是对操作系统对⼀个正在运⾏的程序的⼀种抽象。
进程并发运⾏,则是说⼀个进程的指令和另⼀个进程的指令是交错执⾏的。
操作系统实现这种交错执⾏的机制称为上下⽂切换。
操作系统保持跟踪进程运⾏所需的所有状态信息。
这种状态,也就是上下⽂。
当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进⾏上下⽂切换,即保存当前进程的上下⽂,恢复新进程的上下⽂,然后将控制权传递到新进程。