任务,任务的切换,(TCB)

task

进程有

任务的五种状态:休眠的状态,就绪的状态,运行的状态,中断的状态,挂起的状态。

进程阻塞,状态切换,cpu时间分片给task。把process状态由running侧换为挂起,先把running的task在cpu中的数据复制出来保存到任务队列中,等待状态切换为running的时候使用

1、用户级线程

把整个线程实现部分放在用户空间中,内核对线程一无所知,内核看到的就是一个单线程进程。只有一个用户栈

内核级进程

扫描二维码关注公众号,回复: 4258567 查看本文章

任务也可以称作为进程,是一个简单的程序,该程序认为CPU完全属于自己,实时的应用的程序的设计的时候分割成了许多的任务,每一个任务都对应应用的某一部分。每一个任务都被赋予一定的优先级,有自己的寄存器个栈空间。每一个任务都是一个无限的循环,每一个任务都处在5中状态下,这五种状态下是休眠,就绪的运行,挂起的状态和中断的状态。休眠的状态就是相当于任务在内存中,但是没有被调用,就绪的状态意味着该任务已经准备好了,可以进行运行,该优先级比正在运行的优先级低,相当于还在排队。,挂起的状态,是等待的事件,这个任务一直在等待一个东西,能让它运行起来的东西,中断状态就是被一个中程序中断了呗。

任务的五种状态:休眠的状态,就绪的状态,运行的状态,中断的状态,挂起的状态。

这五种的任务的切换,运行的状态,只有从就绪的状态的任务来的,中断态的任务只有运行的任务才可可能转变成中断的任务。,挂起的状态的也只有运行的任务可以转变成。

具体的任务的状态的切换的:

当一个任务的就绪的时候,那么它就会在就绪表里面,有所体现,那么就绪表这么体现这个任务是就绪的,而且当有好几个任务一起就绪的时候,这时候cpu应该是怎么样的选择进行哪一个任务的。

在任务本身就有自己的优先级,而在就绪表里面,如果这个任务就绪那么就会在就绪表对应其任务优先级的位置将其置1(具体的是一种算法,我的理解,就是一个查表的算法,用空间的代价,换取了时间的),一个优先级最多对应一个任务。对于cpu会选择cpu就绪表里面就绪的任务中优先级最高的任务,每隔一段时间,cpu就会检查就绪表里面的就绪的任务是否有优先级高于现在运行的任务的,如果有的话,那么就会执行优先级高的就绪的程序。保存正在运行的任务。(可剥夺的内核)。

一个单核的cpu,真实的状态的就是一个时间只能执行一个任务,那么在执行任务的时候,

因为真的在执行任务的时候, 一个任务占据了cpu的资源(寄存器),对于一个就绪的任务,其实就是万事具备的时候,就欠cpu 的概念,那么真的在任务的转换的时候,怎么做到,前一个任务的状态被记录先来,然后去运行现在要运行的任务的呢,着里面有一个结构体

TCB,(中文的全称:任务控制部件,英文的全拼;task control blocks),主要有任务的优先级,任务的栈空间的地址,以及任务栈的空间的大小,以及用来记录现在执行的任务的pc(程序计数器,当程序执行到的地方)的值。

,当要发生任务的切换的时候,cpu里面的堆栈的值拷到任务控制块里面指针所指的空间,真是的操作的时候,是计算的cpu的堆栈的大小,然后在sp指针的最开始的时候,就记录这个堆栈的大小,然后将cpu堆栈里面(记录的是cpu的寄存器值),值一起复制(cpu的堆栈进行的是出栈的操作)TCB里面的sp指针的所指的空间里面去,pc是自动的保存到堆栈空间里面的,当保存当前的任务的TCB里面的各种的数据,那么将要执行任务,惊醒进行相反的顺序的,将原来的任务的堆栈里面的数据(入栈到cpu的堆栈)(只有cpu的堆栈具有出栈和进栈的操作)。其实就是在任务的切换的时候,就是不同的任务交换着cpu的使用权,但是由于cpu的资源的有限,而进行上次的任务的数据的保护。然后再讲下任务的数据的导入。

如果能够理解TCB,那么PCB,ECB,就是一个叫做进程控制块,事件控制块,原理应该都差不多。

当没有一个任务运行的时候,那么由一个优先级最低的空闲任务霸占着cpu,这样的其实cpu的利用率,通过这个空闲任务的运行的时间来计算。
--------------------- 

出处:https://blog.csdn.net/hello_world6/article/details/52491813 
 

猜你喜欢

转载自blog.csdn.net/JackLiu16/article/details/84562949