while(a!=c语言while(0)什么意思?

每一个不曾起舞的日子,都是对生命的辜负。

  • 2.3 查看进程的另一种方式(了解)
  • 2.5 常见进程调用(父进程、子进程)
  • 2.6 通过系统调用创建进程-fork初识
    • 3.1 普遍的操作系统层面
  • 5. 进程优先级(了解范畴)

那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!

对于我们的了解来说,什么是进程呢? 有的资料是这么说:一个运行起来的程序(加载到内存)叫做进程;在内存中的程序叫做进程。也就是说,进程和程序相比具有动态属性。

对于之前我们通过C写出的进度条程序来说,其本质就是一个文件并且存放在磁盘中。但是其并没有真正的运行,当我们运行程序的时候,文件就会从磁盘加载到内存,但是磁盘中那么多的文件全部加载到内存中明显是不现实的并且我们也不需要其他文件加载到内存,这时候就需要操作系统对文件进行管理从而只让我们想要执行的程序加载到内存,那操作系统是如何管理的呢?

即上篇提到的:先描述,再组织

通过上述的概念,我们了解的并不多,那么接下来就来分析一下:如果有很多这样的进程加载到内存中,操作系统要如何进行管理呢? 即利用先描述再组织的思想。

而所谓的先描述,这里引进了一个新的概念:PCB :进程控制块 struct task_struct{}

1. 那么什么是进程控制块呢?

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,称之为PCB(process control block)在Linux中描述进程的结构体叫做task_struct。

在磁盘中的程序中,并没有进程控制块以及内部属性信息的存在,而是加载到内存之后通过操作系统的一系列的管理才出现的。


 
 

2. 进程控制块如何对进程进行管理的呢?

  • 磁盘中的可执行程序在将要运行时,所有的进程中的数据(并不是程序本身)加载到内存中,此时操作系统会建立起一个PCB来保存每一个程序的信息
  • 这个时候PCB就会对每一个进程都建立起相应的结构体(即进程控制块)将对应的进程的属性、代码等匹配的传到这个结构体中:(这就是先描述)

  • 此时,操作系统就会将每一个进程控制块都连接起来,形成链表结构,并返回头结点。这样便通过数据结构的形式将进程的信息组织起来。

通过这样的先描述再组织的思想,当我们处理优先级高的进程时,我们就可以通过遍历头结点,找到优先级最高的那个节点的信息,并将这个进程的代码执行。

因此通过上面的描述,我们就可以回答1.2开始时所问的问题:操作系统要如何进行管理呢?

答:所谓的对进程进行管理,会变成对进程对应的PCB进行相关的管理,也就是说:对进程的管理变成了对链表的增删查!

最终,通过上述的解释,进程究竟是什么我们也就知晓了:进程 = 内核数据结构(task_struct) + 进程对应的磁盘代码

3.为什么要有进程控制块(PCB)呢?

通过上一篇介绍的软硬件体系结构以及刚才的描述,对于为什么要有PCB进行了解答:

对进程管理的核心是对数据进行管理,因此当我们加载程序到内存之前,我们必须拿到所有程序的数据,由于拿到的数据杂乱无章并且未进行分类,这时候就需要PCB将其归类,将对应的数据放到相应的进程控制块里!

即加载进程的时候,操作系统为了方便管理会new一个struct task_struct也就是进程控制块的结构体,然后一点点的将上面加载的数据填充到这里的内部属性(状态,标记,追踪等),因此这里再一次强调了:进程不是程序加载到内存,而是在内存中new了task_struct结构体!

  1. 执行,并通过打开复制ssh渠道,输入指令:

    (//&&的左右是两个指令,通过&&可以将两个指令一起执行。左面是通过管道将进程的第一行显示出来,右面是将myproc相关的进程信息打印出来,不利用管道将会出现其他没必要的信息)

    动图:(在运行中,进程就具有动态属性)

结束进程有两种方式,下面就来介绍:

这样就可以结束掉我们的进程了。

通过快捷键ctrl + c也可以结束进程。

2.3 查看进程的另一种方式(了解)

通过上面的描述,查看进程和结束进程我们都已经了解,在这里还要引入一个新的关于查看进程的知识。

仍是对于这个程序,我们让其运行(实际上进程在调度运行的时候,就有了动态属性)。

通过指令:ls /proc/5058我们就可以看到这个进程中的信息。

这也可以说明,进程实际上也是一个Linux中能够保存的文件。我们进入到5058:

我们发现,其中生成了一个这样的.exe文件,这实际上就是我们正在运行的程序。

那如果我们把这个文件删除了,程序还会不会运行呢?我们接下来试一试:

我们发现,左面的颜色变红提示了已经删掉,但是右下角的程序仍然在进行,这也恰恰说明了加载到内存的数据不会受到磁盘文件的影响!

我们发现,上面的执行过程中我们如果想要结束进程,就需要kill 9 PID,而这个PID的值我们该如何获取呢?我们可以通过getpid函数获取。

我们发现,getpid()函数的返回类型是pid_t,这是我们在C/C++所不曾见到的类型,而getpid()的功能就是:返回这个进程的pid。

因此我们就可以根据这个信息编写代码:

我们发现,确实是一样的。也就是说,当我们想知道一个进程的PID,就可以通过getpid获取。

2.5 常见进程调用(父进程、子进程)

我们将上述myproc.c增加一个父进程的打印:

当我们结束时,发现父进程的PID并没有发生变化,事实上父进程的PID就是bash即命令行的PID,父进程本身因此在下一次登陆之前,父进程的PID不会发生变化。

2. 子bug父进程的变化

为了解释这个,我们将myproc.c内部增加一个bug:

这说明这个程序执行了,并且报错了,但是仍然可以通过命令提示错误,因此我们可以看出,程序执行是以子进程在执行,其出错并不会导致父进程错误,父进程也就是命令行的进程,因为提示的错误就是父进程在提示!因此父进程并没有错误!

2.6 通过系统调用创建进程-fork初识

我们通过man fork了解到,fork是创建子进程的函数,但是当这个函数执行前,只有自己本身这个进程和他的父进程,执行之后,这个自己本身的进程就会变成子进程的父进程,而相应的这个进程的父进程也就变成了父进程的父进程。

我们发现,这就相当于bash是爷爷进程,而程序本身是父进程,fork创建出的的是子进程。

通过man查看fork手册/return val,我们发现fork有两个返回值,那具体是什么含义呢?接下来我们实验一下:

我们发现,同一个变量id,在后续不会被修改的情况下,竟然有不同的内容!但是这里我们还不知道为什么也没办法解释,因此在这里我们打不过,就加入他,利用这个规则,我们来看看下面的程序:(注意sleep这里的细节)

// 创建子进程 -- fork是一个函数 -- 函数执行前:只有一个父进程 -- 函数执行后:父进程+子进程

我们发现,两个进程同时执行,即if可以执行,elseif的也一起执行,没错,if和elseif竟然同时执行了,这就是引入fork的缘故(多进程)。

即fork()之后,因为pid既可以是0也可以是1,会有父进程+子进程两个进程在执行后续代码(即两条路线去执行if和else if两个分支),fork()的后续代码,被父子进程共享,让父子进程执行后续共享代码的一部分,这就叫做并发式的编程!

对于运行状态,有以下几种:

对于这些运行状态,都是操作系统层面上的说法,为了让理解的更加深刻,接下来以两方面去解释:

3.1 普遍的操作系统层面

**进程状态的概念:**通过上面的学习我们知道,当一个程序执行加载到内存时,操作系统就会创建对应的PCB(进程控制块:struct),而在这个PCB结构体中,有一个位置存放着整型的成员变量,而这个整形变量的不同数值,就代表不同的进程状态。

进程状态一共有九种:运行、新建、就绪、挂起、阻塞、等待、停止、挂机、死亡 ;其中运行、阻塞、挂起是最为重要的进程状态。下面就讲解这三个最重要的状态:

对于运行状态来说,并不是在CPU中正在运行才是运行状态,只要是进程在CPU的等待队列中,那么就可以称之为进程的运行状态(R)

对于阻塞状态来说,进程在磁盘中的阻塞队列中,就称之为进程的阻塞状态。

通过上面的描述,事实上等于没说什么,什么是运行队列?什么是阻塞队列?为什么会有运行队列和阻塞队列?二者之间存在着什么关系? 事实上这才是运行状态和阻塞状态的切入点,那我们带着疑问一起了解:

当一个进程开始执行时,会将二进制代码从磁盘加载到CPU中去执行,但是我们知道,进程的数量远远多于CPU的数量,这个时候操作系统就会将这些进程进行管理,让一些进程去等待,另一些进程去运行。假设我们只有一个CPU。当一个进程正在执行是,那么其他进程就需要去排队等待CPU资源(CPU会维护一个运行队列让这些要执行的进程去排队,这个运行队列是内核为CPU准备的,一个CPU,一个运行队列)(注:让进程入队列的本质就是将该进程的PCB结构体对象放入运行队列中,而不是让进程(程序)自己去排队)而等待的这些进程都在运行队列中,那么他们就都处于运行状态!

我们知道,冯诺依曼体系结构中的CPU很快,但是(外设)磁盘相对较慢,但是进程除了访问CPU,也避免不了访问磁盘(外设),比如fwrite就是将进程与磁盘之间相联系(而对于scanf、cin这些函数也会访问显示器,一些代码也会通过网络访问网卡,这些都是与外设想交互)但是磁盘很慢,不像CPU一样,所以当A用着,其他的进程就需要等待,因此这样看来进程也可能在外设上等待,也就是说,不要只意味着进程只会占用CPU资源,进程同样也会占用外设资源,因此外设也有自己的描述结构体,也可以维护自己的等待队列! 进程在外设的等待队列中就是进程的阻塞状态!

由于外设的等待队列过慢,CPU因为会执行代码但被外设的速度限制,这时CPU就会对外设说,不好意思,你太慢了,我不想等你了!因此这个时候CPU就会将对应的代码的进程从CPU的等待队列(也就是运行队列)中放到外设的等待队列中,从而去执行CPU运行队列中的下一个进程。

这就好比什么呢?就相当于当你去银行办理业务,当到你到指定柜台去填表时,由于你填的太慢,这时候工作人员为了不让你占用过多时间,就会让你离开窗口,去旁边的桌子上继续填表,为的就是不耽误你后面人的时间让他们继续办理业务。因此这就将这个进程从CPU的运行队列里强行拉到了外设的等待队列中。这个进程也就从运行状态切换到了阻塞状态!

而当你填完表之后,你通过其他工作人员的告知,就会直接进入窗口处理业务,也就是从阻塞状态直接变成运行状态,这个操作就是CPU自动调度而不是操作系统处理的,因为操作系统之前已经处理完你,也就是把你从窗口移到了附近的桌子,就不会继续管你了!

需要注意的是:我们所提到的这些拖拽,排队,不是进程本身的行为,而是他们PCB的行为!

因此所谓的进程的不同状态,本质就是进程在不同的队列中,等待某种资源!

对于新建和就绪状态其实是同一种状态,很好理解,就是这个进程刚刚被创建好,也就是我们所谓的make,因此我们不需要去描述。

将内存中进程的数据和代码转移到磁盘的状态被称为挂起状态。

为了解释挂起状态,我们建立这样一个场景:如果阻塞的进程过多,那么他们是不会被立即调度的,也就是说不会将这些进程从阻塞状态同时转换成运行状态,因为这些阻塞的进程本身也需要彼此之间进程排队。那么我们知道,在进程阻塞时,其对应的数据和代码还在内存中,万一内存不够了,怎么办?

由于过多的进程站着茅坑不拉屎的不良行为,这时操作系统就会体现他的义务将这些有不良行为的阻塞进程体验社会的毒打,因此为了不让阻塞的进程占用内存,操作系统就会将阻塞状态的进程的数据和代码转移到磁盘上储存,这样这个进程就从阻塞状态变成了挂起状态!

此时内存中仍有挂起状态进程的PCB,只是其中的代码和数据转移到了磁盘,减少了内存占用的空间。将内存的相关数据加载或保存到磁盘,叫做内存数据的换入换出。

阻塞状态和挂起状态的区别:阻塞不一定挂起,但挂起一定是阻塞!

就好比几年前用过的安卓手机,比如王者荣耀,如果手机用的时间久或者内存小的话,每一次后台运行之后点进去,就有可能重新开始而不是接着上次的界面,这就是因为占用内存过多,内存不够,于是操作系统(安卓系统)将这个进程挂起了。

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
下面的状态在kernel源代码里定义:


其中,这个结构体中的各种状态就一一对应着我们在普遍的操作系统层面上的状态,分别是:运行状态,睡眠状态,深度睡眠状态,停止状态,停止追踪,死亡状态,僵尸状态。下面先从定义上描述一下一些状态,之后再具体分析。

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
  • D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

那当我们执行,看生成的可执行程序是什么状态:(STAT就代表这个进程的状态)

通过./myprocess,执行后这个程序便处于运行状态(R+)。

我们将上面的代码加上一行printf输出的形式:

有了printf,就需要动图展示一下具体的状态了:(动图)

我们发现,在打印的过程中,myprocess的状态不是运行状态,而是S+休眠状态。事实上,这是由于我们通过printf访问的是外设,而我们知道外设很慢,因此进程等待显示器就绪需要花费很长时间,于是就会把该进程的PCB转移到外设的PCB上排队,这也就对应了普遍操作系统层面上的阻塞状态。

当然,这也不是绝对的,只是对大多数进程而言(99%),因为大多数都是在等待显示器就绪,如果我们想访问变成R状态,可以sleep一个很大的秒数,这样就有机会看到是R状态了

我们之前用的printfscanf事实上都算是浅度睡眠,即S即为浅度睡眠状态,浅度睡眠状态是可以终止的,也就是ctrl c就可以直接终止。而深度睡眠状态是不可以终止的,即无法被操作系统杀死,只能通过断电解决。

对于这个状态,我们通过想象这样的一个场景去理解他:

当一个用户给操作系统、进程、磁盘三个人制定任务时,其中进程和磁盘说这是1万条用户数据,你帮我拷贝一下,磁盘答应了,但是磁盘有可能拷贝成功,也有可能失败。然而这个时候由于进程过多,内存不够了,此时操作系统就会站出来将一些不干活的进程杀掉,但内存仍然不够,于是操作系统秉着他的责任,将所有的进程全部杀掉,自己累的够呛也挂了。但这时磁盘处理数据失败了,就回去找进程,让他重新搞来一份数据,但是此时进程没有回应他,喊了很多次仍无人回应,最后也就这样草草了事。

当用户知道这个任务没有完成,就找到他们三个追究责任,磁盘率先站出来说:这不关我的事,我本来就有可能成功有可能失败,当我失败的时候去找进程发现他不见了,和我没有关系;这时候进程也出来说话了:这和我也没有关系,我是被操作系统杀掉了,怎么能回应你呢?最后操作系统发现他们两个把矛头指向了自己,就气愤的说:我有我的职责,内存不够了,我必须杀掉进程防止内存不够,这就是我的任务,并不是只针对你这一个进程,所有进程在我眼里都是一样的。用户听了他们说的话,却都觉得没什么问题,于是就对操作系统说:下次对于这样的情况,不要杀掉指定的进程,这就相当于给了这个进程一个免死金牌,操作系统也是清楚了具体的规则,同意了,进程和磁盘也表示没问题。这个时候,这个给予免死金牌的进程就处于所谓的深度睡眠状态,不可被操作系统杀死,只能断电处理!

需要注意的是:深度睡眠一般只会在高IO的情况发生下,且如果操作系统中存在多个深度睡眠状态的程序,那么说明该操作系统也即将崩溃了。

当我们查看kill 手册,找到对应的19号选项后:

我们发现,状态就从R状态变成了T状态,变成了之后呢,T状态代表什么呢?事实上,T状态也是阻塞状态中的一种,因为其代码不被CPU执行,但是其属不属于挂起状态呢?这个我们无从得知,因为这是操作系统所做的事情。

既然有暂停,那么就一定有继续。我们看上面的kill选项中,18号就是继续的选项,那我们来看看:

我们发现,又变回了R状态,只不过有个细微的差别,和最初的R+相比,+不见了。

如果我们将程序加上printf,让其变成S+状态,当我们再对应的显示器上输入除了ctrl c的其他命令行,我们会发现其并不会执行,而显示器上照常打印,这就是所谓的前台进程。如果我们将其T掉,再kill 18对应的进程让其继续,我们会发现状态变成了S,出现了和运行状态时一样的情况,而这时当我们再输入命令行时,会发现可以显示对应的结果,并且可以继续打印,这就是所谓的后台进程,但是对于后台进程,不能用ctrl c结束,只能通过kil -9 PID的形式结束进程。因此我们也就知道了+的意义,有+的是前台进程,没有+的是后台进程。

对于追踪暂停状态,其实是一种特殊的停止状态,即进程在调试时就处于追踪暂停状态:(gdb)

死亡状态代表着一个进程结束运行,该进程对应的PCB以及代码和数据全部被操作系统回收。

我们知道,进程被创建出来是为了完成任务的,而完成的结果也是需要被关注的,即进程完成的结果会被其父进程或者操作系统接收,因此在进程退出的时候,不能释放该进程对应的资源,而是保存一段时间,让父进程或者操作系统来进行读取。因此在这个进程退出后到被回收(OS、父进程)前的状态就是僵尸状态!

对于僵尸状态的进程,事实上不是数据存在在内存,而是其对应的PCB在内存中占用空间,因此如果这种进程过多导致PCB占用内存过大,并且父进程和操作系统没有及时回收这种资源,那么就极易发生内存泄漏。由此可见。除了malloc或者new,系统层面上也是有可能发生内存泄漏的。

既然有僵尸状态的危害,就一定有解决的方法,解决的方法将在后续讲解,在此只需要知道僵尸状态是什么,有什么危害就是我们这一节的目标。

具体的Linux操作系统下的进程状态和普遍的操作系统上进程的状态的分类是不同的,Linux操作系统和普通的进程状态相比没有阻塞和挂起状态,普通OS的阻塞状态在LinuxOS中通过睡眠、深度睡眠、暂停、追踪暂停等状态表现出来,而进程处于这些状态时是否会被调整为挂起状态,用户是不可得知的,因为操作系统没必要将挂起状态暴露给用户,用户也不关心一个进程是否会处于挂起状态。

上述已经提到过僵尸状态的进程的概念,那么在这里就详细演示一下僵尸进程的具体面貌:(代码)

我们发现,通过sleep,为4044的子进程被杀掉了,此时父进程并没有处理子进程,因此出现了default(失效)并且子进程变成了Z状态,并且左侧也验证了只剩下父进程,并没有子进程的存在了!如果父进程一直不对这个子进程进行收取,那么这个子进程就会变成僵尸进程。

1. 什么是孤儿进程?

上述我们提到,如果一个子进程被杀,那么其暂时就会处于僵尸状态,如果没有父进程回收就会变成僵尸进程。那如果是父进程被杀,父进程和子进程又会发生什么呢?事实上,父进程被杀,**即父进程比子进程先退出,那么剩下的子进程就叫做孤儿进程。**这种现象也确实存在。

2.孤儿进程的表现形式

我们知道,如果一个进程变成了僵尸进程,其进程状态就会变成T,那我们来看看孤儿进程是如何表现的。

  1. 首先,我们仍然展示一下具体代码:(和僵尸进程中的代码一致)
  1. 接下来,复制SSH渠道,杀掉父进程,观察子进程的状态。(父进程也关注一下)动图展示:

我们发现,有三处发生了变化,其一是父进程被杀之后,变成了S状态,但是这样不就与我们之前的僵尸状态违背了吗?为什么不是T状态呢?事实上我们在上述僵尸状态中讲过,在被父进程回收之前就是T状态,而这个父进程被杀掉,也有其相应的父进程,这个父进程的父进程就是bash,bash相比较普通的父进程,bash进程将他的子进程进行了及时的回收,而这个父进程却不会对其子进程进行及时的回收。因此对比之下bash进程比一般的父进程更加负责。

其二就是我们子进程的状态,由S+变成了S进程,即从前台进程变成了后台进程,这就是孤儿进程最明显的变化,变成后台进程后不能通过ctrl c快捷键暂停,而只能通过kill结束进程(当然,断电处理也可以,但是没必要)

其三我们发现,子进程的PPID也就是这个子进程的父进程因为被杀掉而变成了1,而这个1所对应的其实就是操作系统,即父进程被杀掉之后,这个子进程被操作系统所领养,操作系统就变成了他的父进程,这也正对应了冯诺依曼体系中的进程被操作系统所管理。如果不领养,那么当这个子进程被杀掉时,就会因为没有后续处理从而将变成僵尸进程,这是整个体系都不愿看到的结果,因此操作系统必须领养。

对于进程优先级,我们采取三个问题将这个概念解释清楚:

1. 什么叫做优先级?

只凭字面意思来说,优先级和权限有没有区别呢?答案是一定有的,即权限是能做或者不能做的问题,而优先级是先做和后做的问题。

2. 为什么会存在优先级?

那为什么会存在优先级呢?那是因为在一定范围内的资源是有限的,为了获得这个资源就必须赶在其他人的前面,否则就有可能最后什么也捞不到。举个例子:我们知道在一个内存中有许多的进程,但是CPU只有一个,这个时候进程为了能够先执行就会产生优先级的概念,即重要的进程先运行,其他的进程后运行。

在Linux操作系统中,在ps ajx 选项中出现的PRI(priority)下的数字就是所谓的优先级,即这个数字和我们现实中的排名一样,数值越低,优先级就越高。而这个数值PRI = 基础数值(80) + nice值,(NI)nice值是可以进行修改的,其修改区间为[-20,19],因此PRI的范围为[60, 99]。

仍然是利用孤儿进程的代码:

我们发现,初始状态下,PRI和NI的值为80和0,加起来就是基础数值。

通过如下指令:进入top后按“r”–>输入进程PID–>输入nice值

第一步:sudo top(改变优先级需要提权)

第二步:输入r,输入对应要修改优先级进程的PID,回车

第三步:输入修改之后的NI值。回车。

这样就修改完成了,接下来我们看一看结果:

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发(一段时间采用:时间片轮转的方式)

在定义之前,我们需要举例引入进程切换的概念,对于我们常用的手机、电脑等,一般只有一个CPU,我们知道一个CPU一次只能运行一个进程,但是我们发现,在电脑上,我们可以在打开PDF的同时,去浏览一些其他网页,即同一个时间段内,多个进程可以被CPU同时运行,这是为什么呢?事实上这就是进程切换的效果。

由于Linux的CPU一次只能运行一个进程,但是我们一个时间段内却可以运行多个进程,因为CPU是足够快的,因此我们人感觉的一瞬间就相当于CPU的一个时间段,想一想1ms对于人来说算是一瞬间,但是CPU却是以纳秒为单位计时的,因此在我们自身感觉到的一瞬间也就是CPU的一个时间段内,会将执行的多个进程按照一定的周期分别运行,一个运行到固定周期之后就强行拉入运行队列的末尾等待,就这样直到完成所有执行的进程,这就是进程之间在一定的时间内相互切换,叫做进程切换。而所谓的周期就是时间片。(并发中提到)

当CPU在进行进程切换的时候,要进行进程的上下文保护,当进程在恢复运行的时候,要进行上下文进程的恢复!

进程在运行时会产生非常多的临时数据,同时CPU中存在一套寄存器硬件,当进程运行时,进程的PCB会被放入CPU内的寄存器中,此时CPU就可以通过进程PCB(暂时理解成PCB)得到进程代码数据的地址;CPU在运行进程时所产生的大量的临时数据也都会被保存在寄存器中;因此在进行进程切换时需要进行进程的上下文保护与上下文恢复,进程停止运行时将寄存器里面的数据保存起来,进程重新运行时将保存的数据再放入到寄存器中;所以进程的上下文就是一个进程完成他的时间片后所保存的数据。

CPU寄存器硬件被所有进程共享,但CPU在具体运行某一进程时,CPU寄存器中的数据只属于该进程;同时,我们进行上下文保护时保存的是寄存器中的数据,而不是寄存器硬件。

}

单词out的中文是什么意思

  英文单词out有多种用法,因此它的中文意思也就不只有一种了。下面小编将为你推荐英语单词out具体的中文意思,希望能够帮到你!

  第三人称单数:outs第三人称复数:outs现在分词:outing过去分词:outed过去式:outed

  副词 出局; 在外,在外部; 完全,彻底; 出版

  介词 (表示来源)从; (从…里)出来; (表示不在原状态)脱离; 离去

  及物动词 使熄灭; 揭露; 驱逐

  形容词 外面的; 出局的; 下台的; 外围的

  名词 不流行; 出局

  小心翼翼地抽出中间的几页。

  他掏出笔记本,飞快地翻着。

  2. 在外;在室外

  外面很热——非常炎热而且非常潮湿。

  3. 不在家;不在工作地点

  我昨晚想要和你联系,但好像你不在家里。

  4. 在他处;(通常指)在远处

  **告诉我他们已完成了在那儿的调查工作。

  罗茜的丈夫现在远在东部。

  5. (海水或潮水)离岸

  潮水已经退去,他们走过岩石区的潮水潭。

  6. 缺少,不足,损失(某一数量的钱)

  我和朋友亏了1万美金,还一无所得!

  要是这个人亏待了姐姐,我会把他的身份打听清楚,跟踪追击,把他像狗一样宰了。

  他在逃亡,你会担心他吗?

  并且我门一定要严格执绗这些计划。

  术语解释 loop-the-loop:就是指推/拉飞行杆做垂直跟斗,包括向上翻跟斗和向下翻跟斗有时都会直接被叫做loop-the-loop

  这个神圣之光使我们自物质的沼泽中突围成为可能。

  “ok”或者“out”故事

  前阵子保姆收拾姥姥的抽屉,发现有个小本写满了数字和“ok”,“out”。

  问姥姥才知道,原来是打麻将的账本,“ok”是赢”是赢了,“out”是输出去了。

  姥姥**前在教会学校学过英文,那时候她是个盼望着自己有双皮鞋穿的女中学生,容貌极美,美到人人都说像金枝玉叶、电影明星、大家闺秀。但实际上她只是个寄居在亲戚家读书的穷丫头,虽然自己觉得自由得像小鸟要飞了一样。

  出身温州世家的外公,爱上了什么也不懂的姥姥,然后把她娶进门,做了一个20岁什么也不懂的新妇。

  姥姥糊涂,糊涂到怕切菜刀不快,为了试刀用大菜刀切自己的手指。然后血流满地,自己举着手指往医务室跑,身后跟着三个一样惊慌失色,哇哇大哭的孩子。

  家里一切大事有外公。

  外公去世前,对姥姥说:“我要走了,给你留下点东西,希望你自己能过得快活些。以后,也没有人管你打麻将了。”

  姥姥快活么?子女都不在身边,一个人她尽力了。她贪嘴,偷偷吃作为糖尿病患者应忌口的一切好吃的',可是她吃过什么后又总说“马马虎虎”;她爱漂亮,每次出门都要梳妆打扮,照很久镜子,家人朋友从国外带来的化妆品、衣服、小首饰,她却经常送人,乳腺癌手术后少了半边胸,妈妈做了假胸送给她,她也不用;她年轻的时候会拉风琴,老了80岁开始学钢琴,考过钢琴一级,上了报纸电视,号称还要继续攻二级,又撂下了———依旧打她的麻将,也只有打麻将的时候,她才永远生龙活虎。

  杨德昌的《麻将》里说:“每个人都不知道他想要什么,都等待别人告诉他该怎么做,所以做错了也不用埋怨自己,可以把责任推在别人身上。”但其实,打麻将的时候,恰恰是要知道自己要什么,出了错牌自己担着。牌品见人品,打麻将时的姥姥,是最认真、最精明、最爽气的姥姥,要什么清清楚楚,出了错也不埋怨任何人———包括自己。

  麻将一圈一圈转下去,“ok”或者“out”,流转如流年。

  《马太福音》里说:“你们若不回转,变成小孩子的样式,断不能进天国。”姥姥是个老小孩,是我暗藏心底的榜样。

  就是这样,在生活里,一圈一圈麻将打下去,为了不“out(出局)”,要努力,直到“ok”为止。

单词out的中文是什么意思扩展阅读

单词out的中文是什么意思(扩展1)

——单词date的中文是什么意思

单词date的中文是什么意思

  英语date是一个非常简单的单词,但也会有人不记得它的中文意思是什么。下面是小编精心整理的单词date的中文是什么意思,欢迎阅读,希望大家能够喜欢。

  英语单词date的.中文意思

  名词 约会; 日期,日子; 时代,年代;(北非和西亚常见的海枣树的)海枣

  及物动词 过时; 使…显老; 显示出…时代(或年龄); 鉴定…的年代

  及物/不及物动词 与人约会,相约

  不及物动词 属于某一特定时期; 从某时起计算日期; 记载日期; 注有(或注明)日期

  英语单词date的词典解释

  需要提供想要入住的起止日期以及所需的房间数目。

  2. 确定…的日期(或年代)

  无法确定这一雕刻的年代,连石头本身的年代都难以判断。

  我认为我们可以相当准确地确定西方文明开始衰落的年代。

  3. 在(信件、支票等)上注明日期

  一旦决议达成,他就可以在这张纸上签署日期和姓名了。

  信件上的日期是 19XX年 7 月 2 日。

  4. 在(某个)日期;在(某个)时间

  要保留好所有信件的副本,日后可能会用到。

  他确实没有排除将来某一天美国可能会提供直接援助的可能。

  5. 迄今;到目前为止

  《多蒂》是他迄今为止最好的小说。

  她无疑是我到目前为止所遇到的最疯狂之人。

  英语单词date的情景对话

  请填一下这张申请表。

  我的(地址/电话号码/出生日期)写在哪儿?

  哦,后天是圣诞节。

  你能来跟我们一起共度周末吗?

  啊,恐怕不行。我已经有约在先了。

单词out的中文是什么意思(扩展2)

——单词without的中文是什么意思

单词without的中文是什么意思

  英语without是由两个单词组成的,这其中的中文意思是有点复杂的。一起来看看小编为大家整理收集了单词without的中文是什么意思,欢迎大家阅读。

  英语单词without的中文意思

  副词 在外部; 户外; 缺少; 没有或不显示某事物

  介词 没有,缺乏; 在外面

  连词 除非,如果不

  这幢房子里里外外都很干净。

  她听了这个消息后,丝毫不动声色。

  他没敲门就进来了。

  英语单词without的词典解释

  1. 缺乏;没有;不用

  我不喜欢自己没胡子的样子。

  她穿着一件熨烫得没有一点儿褶儿的棕色衬衫。

  2. 在没有(发生或做某事)的情况下

  他如果一声不吭地离开,就会获得一笔丰厚的养老金。

  他们一刻不停地干到晚上8点钟左右。

  3. 没有,不带(某种感情)

  珍妮特·马格努森冷冷地看着他走过来。

  “你好,斯旺森。”他说话的时候并未显得惊讶。

  4. …不在场;没有…参加

  我告诉富兰克林吃晚饭不必等我。

  失去丈夫后我怎么才能重新开始生活?

  英语单词without的双语例句

  本文对48例左室肥厚伴劳损的.原发性高血压患者进行了长期随访观察,并与48例不伴有左室肥厚及劳损患者作对照。

  现在可以吃白饭的地方越来越少了。

  他们少壮时不修梵行,也不赚取财富;他们沮丧地浪费了生命,如同在无鱼的干池里的老鹭。

  很少有人不抱怨工作单调乏味的,但是不工作他们觉得更无聊。

  第六十六条公益信托的受托人未经公益事业管理机构批准,不得辞任。

  但是我们还不知道我们的阵容里没有他我们可以打得多好。

单词out的中文是什么意思(扩展3)

——单词own的中文是什么意思

单词own的中文是什么意思

  英语单词的产生是汉英两种语言双向交流的产物,一些带有*特色的名称和概念进入了英语词汇,同时还有一些英语词汇进入了汉语,在文化环境中衍生出新的含义,形成了英语词汇的语义文化特征。下面是小编帮大家整理的单词own的中文是什么意思,希望能够帮助到大家。

  单词own的中文是什么意思 篇1

  第三人称单数:owns 第三人称复数:owns 现在分词:owning 过去分词:owned 过去式:owned

  名词 自己的事物; 自己人

  及物动词 拥有; 承认

  形容词 自己的; 特有的

  我亲眼看到这次事故的全过程。

  1.自己的;属于自己的

  我妻子决定让我自己开店。

  另一组被教会自己换药的病人

  2.自己所用的;具有自己特点的;特有的

  珍妮弗坚持要有自己的房间。

  我让她用自己的方式告诉我那件事。

  3.自己做的;单独干的;独立完成的

  他们喜欢自己作决定。

  托尼还自己设计并盖好了房子。

  他父亲在当地有一家酒馆。

  我想(搬出去/有一个自己的地方/找另外一个地方住)。

  别向鲍勃吐露秘密。

  我倒认为他为人不错,挺诚实的。

  他是那种为了保全自己什么都肯做的人。

  我不能同意你的看法。

  单词own的中文是什么意思 篇2

  1.(用于强调)自己的.,本人的

  2.自己做的,为自己的

  1.(用于强调)自己的,本人的

  2.自己做的,为自己的

  拥有,有(尤指买来的东西)

  这些动词均有“有,具有,持有”之意。

  have最常用词,可指任何情况下的具有,无论是物质的或精神的。

  hold指拥有并保持财产及持有见解等,暗示不让别人拿走或占有。

  own不及本组的possess正式,多指所属关系,强调所有权,不管所属物是否在物主手中。

  possess较正式,指拥有或占有并能加以控制与支配,强调其归属;也指具有某种品质、才能、特点或性能等。

  keep指长时间地保有,保存某物,防止别人占去,强调安全和感情上的依附。

  enjoy指享有某种权利或长处,带有欣赏或喜爱的情感。

  on our own凭我们自己,靠我们自己

  own goaln.1.〈足球〉误中本队球门,乌龙球 2.影响本身利益的错误行为

  ownadj.1.(用于强调)自己的,本人的 2.自己做的,为自己的 pron.1.(用于强调)自己的,本人的 2.自己做的,为自己的 v.[T] 拥有,有(尤指买来的东西) v.

  own brandadj.使用自己牌子的;使用自己商标的

  pick your ownadj.由顾客自摘自采的(水果、蔬菜等)

单词out的中文是什么意思(扩展4)

——单词balance是什么中文意思

单词balance是什么中文意思

  英文balance是一个多词性的单词,那么它详细的中文意思就会有很多种解释了。以下是小编为大家整理了英语单词balance具体的几种中文意思,一起来看看吧!

  名词 *衡; 天*; *衡力; (酿酒配料的)均衡

  及物/不及物动词 权衡; (使)*衡; (使)均衡; (使)相抵

  及物动词 结*(账目); 使(在某物上)保持*衡; 使(各部分)协调; 用天*称

  不及物动词 微微摇摆; 倾斜后又复*衡; 动摇; 被补偿

  孩子骑在他的新自行车上不能保持*衡。

  新政党的壮大打破了力量的均势。

  实验室的天*与商店里的秤在什么方面有所不同?

  他将一只足球稳稳地顶在头上。

  你现在服用的药物可能会影响身体的*衡能力。

  3. 使(力量、重要性等)相等;使均衡;使持*

  做到辛辣菜和清淡菜比重相当。

  国家必须找出*衡这两种需求的办法。

  4. (力量、重要性等的`)均衡,均势

  他们的婚姻在传统和现代价值观之间保持着微妙*衡。

  没有其他方法可以确保人们饮食均衡。

  5. (尤指冲突或比赛中的)局面,胜利天*

  将使他们在战争中占据优势的威力巨大的新型火炮。

单词out的中文是什么意思(扩展5)

——单词call的中文是什么意思

单词call的中文是什么意思

  英文单词call的用法是很重要的,我们应该要知道它实际所指的中文意思。今天就让小编带你来看看单词call的中文是什么意思,欢迎阅读。

  call的中文意思

  动词 打电话给;呼唤,喊叫;召唤,叫来,召集;下令,命令

  名词 喊叫,大声喊;电话联络;必要,理由;要求

  你们经理到时醒不来,就叫醒他。

  我认为那是一种耻辱。

  我的兄弟昨晚从上海打电话给我。

  call的词典解释

  1.打电话给…;给…打电话

  你一弄清楚了就给我打电话好吗?

  一个朋友要我打这个号码。

  2.(通常指打电话)呼叫,叫,召唤

  他尖叫着让他老婆打电话叫救护车。

  一天夜里,有人打来电话,请他去给一位患肺结核的妇女看病。

  她喊她的小儿子:“喂,斯蒂芬,过来看看这个!”

  他用天朗扩音器喊我。

  我打电话给美国的'一个朋友。

  我已经接到了其他受害人打来的上百个电话。

  call的双语例句

  问问你的指导鼓掌当你站在北楼梯,如果做了适当的位置将听取您的要求是什么被认为是格查尔鸟。

  我们会致电值机柜台为您补登本次航班的里程。

  我告诉过你别那么说我

  他让你说他永远不用再打电话给你

  如果你问我会怎么做,我从一开始就不会给他打电话。

  我以为你不会打电话给我。

  vt.呼叫;打电话;把 ...称为

  n.打电话;访问;召唤;呼叫;把 ...看作

  vi.呼叫;(短暂的)拜访

  给我一张名片吧,我会打电话给你。

  call的基本意思是“叫喊”,指各种场合下的大声说话,强调叫喊的实际动作。引申可表示“命名”“拜访”“通电话”“召唤”等。

  call一般用作可数名词,其基本意思是“呼喊声,叫声”,既可指人发出的声音,也可指动物或其他物体发出的声音。

  n.电话;电话机;听筒;耳机;[语]音素

  suf.表示“声音”或“说 ...语言的人”

  我们必须马上打电话请医生。

  词汇语法:phone用作名词时意思是“电话”,转化为动词时意为“打电话”。

单词out的中文是什么意思(扩展6)

——单词wear是什么中文意思

单词wear是什么中文意思

  wear这个英语单词的用法是十分重要的,我们一定要掌握它的中文意思。一起来看看小编为大家整理收集了英文单词wear实际的中文意思吧,欢迎大家阅读!

  第三人称单数:wears第三人称复数:wears现在分词:wearing过去分词:worn过去式:wore

  及物动词 磨损; 穿着,戴着; 面露; 留着(胡须等)

  不及物动词 耐用; 保持不变; 磨损,耗损; 逐渐或枯燥地通过

  名词 穿着; 穿戴物,衣物; 磨损,穿旧; 耐用性

  一些专家探讨过这一问题,比较一致的意见是,穿高跟鞋,非凡是穿后跟很高的高跟鞋,弊大利于,尤其是对人的健康和安全是不利的.。

  从你的心中抽丝织成布帛,仿佛你的者要来穿此衣裳。

  利用现代分析和测试技术研究了WC与基体之间的界面及反应产物,检验了复合材料的抗热疲劳性能,考察了常温下复合材料的磨擦磨损行为,并从理论上作了分析。

  这条项链是在我背叛丈夫的地方买的,每当他骂我又丑又胖又蠢的时候,我就会戴上它,回想起有个人曾经认为我是美丽的。

  但是,妈妈她非常关心我,天气冷了妈妈叫我加衣服;我生病了,第一个在我身边照顾我的人就是妈妈;晚上,妈妈一直等到我睡着了,给我盖好了被子才睡,我却不知道。

  其中一个男孩脑袋上缠着绷带,暗示他刚刚在一场战斗中负了伤。

  参观时必需戴上这安全帽。

  这顶我戴好像小了一点。

  我可以为您效劳吗?

  你们有没有蓝色的衬衫?

  有的。你的尺寸是多少?

  我不熟悉美国人的尺寸。

  好的,我想想看。我认为你应该穿8 号的,这件是8 号的。

  真漂亮。我可以试穿吗?

  当然。试衣间就在那里。

单词out的中文是什么意思(扩展7)

——单词hard的中文是什么意思

单词hard的中文是什么意思

  英语单词的产生是汉英两种语言双向交流的产物,一些带有*特色的名称和概念进入了英语词汇,同时还有一些英语词汇进入了汉语,在文化环境中衍生出新的含义,形成了英语词汇的语义文化特征。下面是小编帮大家整理的单词hard的中文是什么意思,仅供参考,大家一起来看看吧!

  hard的中文意思

  形容词 硬的; 困难的; 有力的; 努力的

  副词 努力地; 猛力地; 严重地; 沉重地

  名词 英〉硬海滩,登陆处

  hard的单语例句

  hard的'词典解释

  1. 硬的;坚硬的;坚固的

  他拖着脚在硬木地板上走动。

  一个冰冷梆硬的东西顶在了他的脖梗儿上。

  2. 仔细地;认真地

  你要仔细听才能听见老人的呼吸声。

  3. 猛力地;用力地

  我狠狠地踢了一脚垃圾箱,结果脚趾骨折了。

  4. 强烈地;猛烈的;长时间地

  我从未见过特里如此放声大笑。

  5. 冷酷无情的;心肠硬的

  他的父亲是个冷酷无情的人。

单词out的中文是什么意思(扩展8)

——单词min表示的中文是什么意思

单词min表示的中文是什么意思

  英语单词min虽说在日常生活中不是很常用,但是它表示的中文意思我们还是可以了解一下的。下文是百分网小编为大家准备的英语单词min表示的中文意思的内容,希望能对大家有所帮助!

  取富含白细胞的`抗凝血液1份,加蒸馏水或1%HCl2份稀释混匀,使其溶血10min,取15μl制作压片然后用油镜观察。

  目的 研究从内地不同地区急进高原人群和其在高原环境中居住半年后白细胞内感染附红细胞体的对比分析方法取富含白细胞的抗凝血液1份,加蒸馏水或1%HCl2份稀释混匀,使其溶血10min,取15μl制作压片然后用油镜观察。

  苏州罗马瓷砖的一套玟慧石系列修边砖就大胆采用不锈钢作腰线,给原本就光泽亮丽的洗手间更增添不少炫目光彩。

  在模拟正常人体温在(36.5±0.5)℃的温度场下进行,以20 mm/min的速度对试样施加拉应力,试样破坏后,计算机自动输出应力-应变曲线和数据。

  结果:在两组治疗组中,30分钟后即可获得稳定的血桨罗库溴铵浓度。

  其防潮性可达到冷水浸泡 6 0 min不吸潮溶解,储存期可达一年。氧化钙含量在92 %以上,活性指数可达 32 0 m L以上。

  在烧焦温度500℃、氧气流量200mL/min时,在焦炭中加入125%的助燃剂,可以将烧焦时间由150min缩短到30min,大大提高了烧焦速率。

  1.英语单词mb表达的中文是什么意思

  2.单词honeys的中文是什么意思

  3.单词it的中文表达是什么意思

  4.英语单词ielts表达的中文是什么意思

  5.英语单词port的中文是什么意思

单词out的中文是什么意思(扩展9)

——单词say的中文是什么意思

单词say的中文是什么意思

  英语单词say虽说是很容易的,但很多人都不记得它有几种中文意思。百分网小编为大家精心准备了英文单词say实际所指的中文意思,欢迎大家前来阅读。

  第三人称单数:says现在分词:saying过去分词:said过去式:said

  不及物动词 说, 讲; 表明,宣称; 假设; 约莫

  及物动词 表明; 念; 说明; 比方说

  名词 发言权; 说话; 要说的话; 发言权

  他让你说他永远不用再打电话给你

  今天,我们向世界说:北京欢迎你!

  那天他打电话对我说:妈妈,我打电话来就是为了告诉你我爱你。

  他打电话给我说,嗨,妈妈!

  他解释,我的意思是,我不坐算、'现在什么是最离谱的事情我可以说吗?

  我们6点在旅馆大厅见面好吗?

  这并不是说广告都是骗人的。

  我是说,到了我们和你的`那个游手好闲的堂弟摊牌的时候了

  我乐意为你介绍攀枝花。

  别把我的话告诉别人--这是秘密.

  我一个字都不说出去。

  如果我处在你的位置,我会寸步不让。

  很遗憾,我不能接受你的建议。

  哦,有人来了,我得去开门。

  我不得不说再见了。

  我考虑一下,回头我尽快打电话给你,好吗?

单词out的中文是什么意思(扩展10)

——英语单词why是什么中文意思

英语单词why是什么中文意思

  why是一个很简单的英语单词,但是它的中文意思是什么呢?下面就让百分网小编给大家分享关于英语单词why的中文意思的知识吧,希望能对你有帮助!

  英语单词why的中文意思

  副词 为何; (用于问句)为什么; (反问,表示不必)何必; (说明理由)为什么

  int.呵唷,哎呀,嗨

  名词 原因; 理由; 说明; 难解的问题

  1. 如何:希望治疗者能拯救他们的幻想. 因此心理治疗的目的并非如传统所言要去医治某人,而是要协助当事人了解他们正在做什幺,使他们摆脱受害者的角色. ◎只要拥有一项生存的理由,就能忍受如何(why)生存的痛苦.

  2. 为何这样做:职务分析应该注重对工作六要素进行分析即,工作内容(What)、责任者(Who)、工作岗位(Where)、怎样操作(How)以及为何这样做(Why). 职务分析在企业管理中具有重要作用,它要求企业各岗位必须具有明确的职责和范围,从而合理招聘、选拔和使用所需人才.

  3. why:y; 为什么〖网语〗

  英语单词why的单语例句

  英语单词why的情景对话

  你怎么这么忧伤呀?

  我的女朋友最*伤了我的心。

  要不要和我们一起出去?

  我想这是个好主意。

  定语从句why用法

  1.先行词表示时间、地点、原因,但关系词指代先行词在定语从句中充当主语或宾语时,应用关系代词that或which。如:

  我不会忘记充满悲哀的1976年。

  我后悔在森林里虚度的日子。

  这就是那个生产小汽车的工厂。

  这就是他昨天参观的工厂。

  这是一个没道理的理由。

  这是他提出的理由。

  2. 关系副词有时相当于 “适当的介词+关系代词”。如:

  这就是他住的房间。

  我能看见上面有一本书的那张桌子。

  这是他被杀害的原因。

  3. 当先行词为time表示 “次数”时,常用关系词that或省去关系词,而不用when来引导定语从句。如:

  这是我第一次/最后一次给你们上课。

  4. 当point, situation等词作先行词表抽象的地点,其后常由where引导定语从句, where在定语从句中作地点状语。

  从A、B、C、D四个选项中,选出可填入空白处的最佳选项。

  why的定语从句例句

  1、关系副词why引导限定性定语从句修饰先行词reason, 在定语从句中充当原因状语。

  注意: 关系代词与关系副词之间并非毫无关联, 两者之间存在密切的联系。在备考中尤其要注意以下几点:

  1. 很多情况下关系副词用“介词+which/whom”来代替, 其中的介词由先行词或定语从句中谓语动词的形式来决定, 例如:

  我将永远不会忘记我跟她生活的那些岁月。

}

# 欢迎大家关注AIoT相关博客~

我们可以看到输出的结果为:range(0, 10)这就是所谓的迭代器,我们知道,range返回的应该是一连串的数,但我们不可能把这一连串的数全部存到一个变量a之中,故我们可以调用list(),就可以查看我们的rang()产生的这一连串的数字,关于 list(),后续会重点进行讲解,读者此时把它理解成为一个可以把 range() 中产生的数全部显示出来即可:

# 欢迎大家关注AIoT相关博客~

# 欢迎大家关注AIoT相关博客~

# 欢迎大家关注AIoT相关博客~

根据代码去理解for循环:我们可以看到,对于上述代码,for循环所遍历的对象为:range(1, 101),即当我们遍历到 100 的时候,for 循环就会停止,在遍历的过程中,我们把 range 中产生的数依次赋值给了 item(当然我们可以任意去给它取名,一般习惯起名为 item),我们根据上述也可以看出,在我们计算 1 + … + 100 的时候,既可以使用while也可以使用for,故其实我们的 for 和 while 没有本质上的区别,它们之间是可以相互转换的

}

我要回帖

更多关于 c语言while(0)什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信