Memory Operations During Context Switch: Impact on Priority Tasks?

Hi @Middleware & OS I have two tasks, A and B, with A being high priority and B low priority. There are two global variables, condition and mem. Let's say Task B is currently running and performing memory operations. If Task A becomes ready while Task B is running, resulting in a context switch, will the memory operation continue even if the condition is set to false? If so, at which index will it restart? And what will the content of mem be after Task B finishes executing?
***Task B - Low priority task ***
if (condition) {
.....
for (i = 0; i< 10; i++){
// example we are at i=4
mem[i] = mem[i] +1;
}
.....
}
***Task B - Low priority task ***
if (condition) {
.....
for (i = 0; i< 10; i++){
// example we are at i=4
mem[i] = mem[i] +1;
}
.....
}
And
*** TASK A - High priority task
***
......
enter_critical();
condition = false;
mem[i] = 0;
exit_critical();
......
*** TASK A - High priority task
***
......
enter_critical();
condition = false;
mem[i] = 0;
exit_critical();
......
now Task A is finshed and yields resources for Task B to run.
5 Replies
Priyanka Singh
Priyanka Singh8mo ago
Yes, in most multitasking operating systems, if Task A becomes ready while Task B is performing a memory operation and a context switch occurs, the memory operation will likely continue even if condition is set to false. Here's what might happen: Context Switch and Memory Operations: * When a context switch happens due to Task A becoming high priority, the CPU state for Task B is saved, including the program counter (which points to the current instruction) and register values. This includes any registers involved in the memory operation. * Task A starts running, and when it finishes or needs to yield, control switches back to Task B. * During the context switch back to Task B, the saved CPU state is restored, placing the task at the exact point it was interrupted, including the memory operation. Completion and mem Content: * Assuming the memory operation itself doesn't rely on the value of condition, it will continue from where it left off and complete as intended. * The final content of mem will depend on the specific memory operation Task B was performing: * If it was writing data to memory, the memory location will contain the intended data written by Task B. * If it was reading data, mem will contain the value read from memory at the point of interruption. condition Check: * The value of condition likely won't affect the continuation of the memory operation itself. * However, the logic within Task B might check the value of condition after the memory operation is complete. If condition is false at that point, Task B might need to handle that situation appropriately (e.g., stop further processing, discard the memory operation result, etc.). Although, this is a general explanation, and the exact behavior can vary depending on the specific operating system, hardware architecture, and programming language used. Some systems might offer mechanisms to preempt or abort tasks mid-operation, but this is less common for basic memory accesses.
barafael
barafael8mo ago
In case you are interested in a fresh take on this domain, have a look at rtic.rs Hardware-based RTOS-like scheduling for cortex-m and riscv clic, statically guaranteeing absence of priority inversion, deadlock, and data races. Locking is 1x RMW
Marvee Amasi
Marvee Amasi8mo ago
Wow thanks @Priyanka Singh , so it means that if Task B is interrupted by Task A and then resumes after Task A completes, could Task B potentially encounter any race conditions or synchronization issues with other tasks accessing the same memory locations?
Priyanka Singh
Priyanka Singh8mo ago
Yes, if Task B is interrupted by Task A and then resumes after Task A completes, there's a potential for race conditions or synchronization issues with other tasks accessing the same memory locations, especially if condition is used to control access to the memory operations in Task B
Marvee Amasi
Marvee Amasi8mo ago
Sure thanks @barafael
Want results from more Discord servers?
Add your server