盗窃罪,捷克论坛 老虎,小沈阳 超级大明星
一、开篇概念明晰:
多任务:
进程与线程:
中断:
前置知识点:
1、进程是内存和资源的物理分离,只有所属线程才能访问;
2、一个cpu给一次只能执行一个线程,cpu给每一个线程分配时间片,多线程就是在不同线程之间快速切换。
问题:进程间相互独立且不可访问,那么,cpu是怎么进行线程切换的,也就是问:一个线程正在执行,它要怎么知道要中断挂起,给其他线程来执行。
答案:Windows本身(其实也是处理器上正在运行的一个程序)有一个主线程----系统线程,负责其他线程的调度。
线程本地存储器(Thread Local Storage,TLS):存储线程的状态信息。当一个线程执行的时间片到期的时候,需要存储下线程当前的状态信息,以确保在他被分配的下一个时间片可以正常的执行。TLS包含了:
寄存器、堆栈指针、调度信息、内存中的地址空间和其他资源的使用信息。
其中寄存器中有一个是程序计数器,存放了线程接下来应该执行的指令。(CPU执行的指令的都是从寄存器读取的)
中断:中断是一种机制,它能够使CPU指令的正常顺序执行转向计算机内存中的其他地方,而不需要知道目前正在执行什么程序。解释如下:
1、程序要开始执行一个线程之前:系统线程先决定线程要执行多长时间,and在当前线程的执行序列中放置一条中断指令。疑问:不确定这个指令是在时间片到了之后插入的还是在线程开始之前预先插入的,但推测是等待时间片要到的时候插入的,因为程序执行的指令并不是容易预测的,不同的数据不同走不同的逻辑分支,程序的执行是一边编一边走的(会先编译的快一些)而不是编译好所有的逻辑分支的指令,等待程序执行的时候根据数据进行选择,所以个人觉得很难预测要走哪一个逻辑分支,很难提前太早插入中断指令。
2、程序开始执行一个线程:读取TLS中线程的程序计数器,把该程序计数器的指令指向的地址从TLS中拖拽出来插入到CPU执行的指令集合中,同时把TLS中的堆栈信息加载到CPU的其他寄存器中。线程开始执行
3、当碰到中断指令时:存储当前线程的堆栈信息,记录当前线程的程序计数器数据,记录其他资源的信息,存储入TLS,把当前线程放入线程队列的末尾,返回到线程队列的开头准备执行队列的第一个线程,回到步骤1。
线程睡眠:线程退出执行队列一段时间称为睡眠。有时一个线程的执行需要一定的资源,但是当线程开始执行时,这个资源并没有生成或者正在被使用,因此线程需要等待一段时间。
时钟中断:一个线程进入睡眠是它会再次被打包放入TLS中,不过并不是放置在了TLS的末尾,而是放入了一个独立的睡眠队列中,为了时睡眠队列上的线程再次运行,需要使用另一种中断了标记他们,成为时钟中断。当一个睡眠的线程可以执行的时候,它才会被放入到可运行的线程队列中,的末尾。
线程终止:
线程终止时,线程的TLS会释放其内存。
持续更新中...
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论