线程和上下文切换C ++

时间:2017-08-01 21:03:18

标签: c++ multithreading assembly x86 interrupt

我需要帮助理解下面的代码。它是用C ++(BC31编译器)编写的线程工作和上下文切换的一个例子。

我理解为什么PCB存在以便切换上下文(特别是保留SS和SP寄存器)而且我也明白它通过使用这个程序可以 回到它被打断的地步,就像什么都没发生一样。关于代码,我理解宏DISABLE_INTERRUPT和ENABLE_INTERRUPT用于什么 (忽略代码中某些敏感部分的中断)。我也理解createProcess函数,其中创建了每个线程的本地堆栈 将线程的标志,段和偏移写入其中。在函数timerISR中,我理解上下文切换的部分(写入和读取SS和SP)。

对于其余的代码,我不能说我理解它。函数returnNextThread(),initNewRoutine(),returnOldRoutine(),finishThread()是什么意思?

然而,我最感兴趣的是这个程序是如何运行的,这里实际发生了什么,以便这三个函数在运行时交织......

这一切如何运作? 我真的很感激一个简单的解释。

SELECT

2 个答案:

答案 0 :(得分:4)

那可怕的代码(老了不是借口)。无论如何,timerISR每隔一段时间就会触发并切换到由returnNextThread(基本上是调度程序)确定的相应线程。

finishThread显然通过标记完成并强制进行上下文切换来结束线程。哪个部分不清楚?

initNewRoutinereturnOldRoutine只需安装和卸载计时器ISR(不幸的命名)。

答案 1 :(得分:2)

这看起来像是在非常老的CPU上实现的本地任务调度程序。你可能需要一个非常古老的系统来运行它。

在高级别,代码的功能如下:

  • PCB块只是每个线程的属性。它们保持2个寄存器的值,slice(线程在CPU上花了多长时间)并标记它是否已完成
  • 当您创建新线程(进程)时,将初始化此结构,但不会发生任何其他情况
  • 只要时间阈值过去,CPU就会自动触发timerInterrupt。看到中断后,中断处理程序会分析结构并通过调用CPU中断切换到相应的线程。