Extending Multithreading to Multibraiding (Adjoint Threading)
Having considered computational threads as braided strings and after discerning several software trace analysis patterns (just the beginning) we can see formatted and tabulated software trace output in a new light and employ the “fabric of traces” and braid metaphors for an Adjoint Thread concept. This new concept was motivated by reading about Extended Phenotype (*) and extensive analysis of Citrix ETW-based CDF traces using CDFAnalyzer. The term Adjoint was borrowed from mathematics because the concept we discuss below resembles this metaphorical formula: (Thread A, B) = [A, Thread B]. Let me first illustrate adjoint threading using simplified trace tables. Consider this generalized software trace example (date and time column is omitted for visual clarity):
# |
Source Dir |
PID |
TID |
File Name |
Function |
Message |
1 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message text… |
2 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message text… |
3 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message text… |
4 |
\src\lib |
2792 |
5680 |
file2.cpp |
barA |
Message text… |
5 |
\src\subsystemA |
2792 |
5680 |
file1.cpp |
fooA |
Message text… |
6 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message text… |
7 |
\src\lib |
2792 |
5680 |
file2.cpp |
fooA |
Message text… |
8 |
\src\lib |
2792 |
5680 |
file2.cpp |
fooA |
Message text… |
9 |
\src\subsystemB |
2792 |
3912 |
file3.cpp |
barB |
Message text… |
10 |
\src\subsystemB |
2792 |
3912 |
file3.cpp |
barB |
Message text… |
11 |
\src\subsystemB |
2792 |
3912 |
file3.cpp |
barB |
Message text… |
12 |
\src\subsystemB |
2792 |
3912 |
file3.cpp |
barB |
Message text… |
13 |
\src\subsystemB |
2792 |
3912 |
file3.cpp |
barB |
Message text… |
14 |
\src\subsystemB |
2792 |
3912 |
file3.cpp |
barB |
Message text… |
15 |
\src\subsystemB |
2792 |
2992 |
file4.cpp |
fooB |
Message text… |
16 |
\src\subsystemB |
2792 |
3008 |
file4.cpp |
fooB |
Message text… |
… |
… |
… |
… |
… |
… |
… |
We see several threads in a process PID 2792. In CDFAnalyzer we can filter trace messages that belong to any column and if we filter by TID we get a view of any Thread of Activity. However, each thread can “run” through any source directory, file name or function. If a function belongs to a library multiple threads would access it. This source location (can be considered as a subsystem), file or function view of activity is called an Adjoint Thread. For example, if we filter only subsystemA column in the trace above we get this table:
# |
Source Dir |
PID |
TID |
File Name |
Function |
Message |
1 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message … |
2 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message … |
3 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message … |
5 |
\src\subsystemA |
2792 |
5680 |
file1.cpp |
fooA |
Message … |
6 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message … |
7005 |
\src\subsystemA |
2792 |
5664 |
file1.cpp |
fooA |
Message … |
10198 |
\src\subsystemA |
2792 |
5664 |
file1.cpp |
fooA |
Message … |
10364 |
\src\subsystemA |
2792 |
5664 |
file1.cpp |
fooA |
Message … |
10417 |
\src\subsystemA |
2792 |
5664 |
file1.cpp |
fooA |
Message … |
10420 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message … |
10422 |
\src\subsystemA |
2792 |
5680 |
file1.cpp |
fooA |
Message … |
10587 |
\src\subsystemA |
2792 |
5664 |
file1.cpp |
fooA |
Message … |
10767 |
\src\subsystemA |
2792 |
5680 |
file1.cpp |
fooA |
Message … |
11126 |
\src\subsystemA |
2792 |
5668 |
file1.cpp |
fooA |
Message … |
11131 |
\src\subsystemA |
2792 |
5680 |
file1.cpp |
fooA |
Message … |
11398 |
\src\subsystemA |
2792 |
5676 |
file1.cpp |
fooA |
Message … |
11501 |
\src\subsystemA |
2792 |
5668 |
file1.cpp |
fooA |
Message … |
11507 |
\src\subsystemA |
2792 |
5668 |
file1.cpp |
fooA |
Message … |
11509 |
\src\subsystemA |
2792 |
5664 |
file1.cpp |
fooA |
Message … |
11513 |
\src\subsystemA |
2792 |
5680 |
file1.cpp |
fooA |
Message … |
11524 |
\src\subsystemA |
2792 |
5668 |
file1.cpp |
fooA |
Message … |
… |
… |
… |
… |
… |
… |
… |
We can graphically view subsystemA as a braid string that “permeates the fabric of threads”:
We can get many different braids by changing filters, hence multibraiding. Here is another example of a driver source file view initially permeating 2 process contexts and 4 threads:
# |
Source Dir |
PID |
TID |
File Name |
Function |
Message |
41 |
\src\sys\driver |
3636 |
3848 |
entry.c |
DriverEntry |
IOCTL … |
80 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
99 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
102 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
179 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
180 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
311 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
447 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
448 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
457 |
\src\sys\driver |
2792 |
5108 |
entry.c |
DriverEntry |
IOCTL … |
608 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
614 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
655 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
675 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
678 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
680 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
681 |
\src\sys\driver |
3636 |
3896 |
entry.c |
DriverEntry |
IOCTL … |
1145 |
\src\sys\driver |
3636 |
4960 |
entry.c |
DriverEntry |
IOCTL … |
1153 |
\src\sys\driver |
3636 |
4960 |
entry.c |
DriverEntry |
IOCTL … |
1154 |
\src\sys\driver |
3636 |
4960 |
entry.c |
DriverEntry |
IOCTL … |
… |
… |
… |
… |
… |
… |
… |
(*) A bit of digression. Looks like biology keeps giving insights into software, there is even a software phenotype metaphor albeit a bit restricted to code, I just thought that we need also an Extended Software Phenotype.
- Dmitry Vostokov @ DumpAnalysis.org + TraceAnalysis.org -
March 5th, 2010 at 6:48 pm
[…] is an extension of Thread of Activity pattern based on the concept of multibraiding and it is called Adjoint Thread of Activity correspondingly. I’m going to illustrate […]
July 4th, 2010 at 7:55 pm
[…] during viewing we can filter on and off certain modules, threads, processes, messages, etc. (adjoint threading) and see a different sub-story or plot (sujet). Every software plot (please do not confuse with […]