<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hisabumi Hatsugai</title>
    <description>The latest articles on DEV Community by Hisabumi Hatsugai (@hatsugai).</description>
    <link>https://dev.to/hatsugai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45719%2Fe8280a90-a978-43fc-9013-12d226b8ed41.jpg</url>
      <title>DEV Community: Hisabumi Hatsugai</title>
      <link>https://dev.to/hatsugai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hatsugai"/>
    <language>en</language>
    <item>
      <title>Priority inversion and priority inheritance</title>
      <dc:creator>Hisabumi Hatsugai</dc:creator>
      <pubDate>Sun, 22 Jul 2018 00:49:42 +0000</pubDate>
      <link>https://dev.to/hatsugai/prioriy-inversion-and-priority-inheritance-nl3</link>
      <guid>https://dev.to/hatsugai/prioriy-inversion-and-priority-inheritance-nl3</guid>
      <description>&lt;h1&gt;
  
  
  Priority inversion
&lt;/h1&gt;

&lt;p&gt;see &lt;a href="https://en.wikipedia.org/wiki/Priority_inversion"&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I will deal with the problem in the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Model the problem on &lt;a href="https://www.principia-m.com/syncstitch/"&gt;SyncStitch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Observe the problem by simulation.&lt;/li&gt;
&lt;li&gt;Define the safety specificaion againt the problem.&lt;/li&gt;
&lt;li&gt;Implement priority-inheritance protocol.&lt;/li&gt;
&lt;li&gt;Check the safety.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Warming up
&lt;/h1&gt;

&lt;p&gt;Using SyncStitch, you can easily realize and test your ideas rapidly.&lt;br&gt;
Before challenging the priority inversion problem, build a simple model as warming-up.&lt;/p&gt;

&lt;p&gt;A simple RTOS can be modelled on which processes has the following state-transitions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y2Dn5Wwp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/g39ut8moo30xx62egu50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y2Dn5Wwp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/g39ut8moo30xx62egu50.png" alt="sd1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The kernel can be modelled like this: (just a sketch, this may be the smallest rtos in the world?)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bMkEtMZG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5wt1otk6o9mzagq39d6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bMkEtMZG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5wt1otk6o9mzagq39d6b.png" alt="ker0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, you can perform simulations for it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CFfjOYqK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/c54zyzaalj0c0t21bqfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CFfjOYqK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/c54zyzaalj0c0t21bqfy.png" alt="pe0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that a process of lower priority is preempted by a higher one.&lt;/p&gt;

&lt;h1&gt;
  
  
  Implement locks
&lt;/h1&gt;

&lt;p&gt;Like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s3C0zfQD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/iogd627axf3qkpqai5wl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s3C0zfQD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/iogd627axf3qkpqai5wl.png" alt="sd2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VYAhDPTM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jmrtilbujyeri3zwwh62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VYAhDPTM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jmrtilbujyeri3zwwh62.png" alt="kernel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course there is possibilities for processes to be preempted in locks.&lt;br&gt;
In fact, you can observe the following sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Process 2 wakes up (the bigger number, the lower priority).&lt;/li&gt;
&lt;li&gt;Process 2 locks.&lt;/li&gt;
&lt;li&gt;Process 0 wakes up.&lt;/li&gt;
&lt;li&gt;Process 2 is preempted.&lt;/li&gt;
&lt;li&gt;Process 0 runs. try to lock, but failed since it is already owned by Process 2.&lt;/li&gt;
&lt;li&gt;Process 1 wakes up. It can run as long as it wants though the higher Process 0 is waiting for the lock.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lBaGNzMc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/cfsy7akwi9ab63unla0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lBaGNzMc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/cfsy7akwi9ab63unla0b.png" alt="pe2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This phenomenon is what is called the priority-inversion problem. This can be show as a diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m1-WV86K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2pdz245jk640ziolmb24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m1-WV86K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2pdz245jk640ziolmb24.png" alt="pi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Safety specification
&lt;/h1&gt;

&lt;p&gt;We observed the problem by simulation above. Next, we make a specification which enable the tool automatically detect the problem or make sure there is no problem.&lt;/p&gt;

&lt;p&gt;This type of specifications are called safety specifications, which can be described as a state-transition which accepts only possible sequecens and does not include any harmful sequence.&lt;/p&gt;

&lt;p&gt;We can define the safety specification for the priority-inversion protocol like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v067Q0nU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n4rbu1zdys0mhgdwqkvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v067Q0nU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n4rbu1zdys0mhgdwqkvj.png" alt="safety"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SyncStitch is one of what they call refinement checkers, and it has the ability to compare the given specification and the given implementation model and check the correctness relation between them.&lt;/p&gt;

&lt;p&gt;The result of the check is this; a violation is found:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ulQ2QJiu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2xitjlvzwjhv57cjps1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ulQ2QJiu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2xitjlvzwjhv57cjps1j.png" alt="assert1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, you can thoroughly investigate the violation using the analyzing tools provided by SyncStitch.&lt;/p&gt;

&lt;p&gt;You can see the same sequence we saw above for the violation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--97DlP3ry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fqxps80yp1itxgcmd8xu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--97DlP3ry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fqxps80yp1itxgcmd8xu.png" alt="seq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Priority-inheritance protocol
&lt;/h1&gt;

&lt;p&gt;One of the solutions for the priority-inversion problem is the priority-inheritance protocol. The idea is simple: when schedule the processes, select the process which blocks the process of highest priority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7_husPDA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7km3lw9pluj09budp424.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7_husPDA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7km3lw9pluj09budp424.png" alt="pi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function for the selection is like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KsO9zZuH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xqv491i7k6nqo4slgmfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KsO9zZuH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xqv491i7k6nqo4slgmfe.png" alt="sp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Putting it into the model, you will see the problem is resolved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zZubEOrj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d3971xjfvl7aj3w9q6xu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zZubEOrj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d3971xjfvl7aj3w9q6xu.png" alt="assert2"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>syncstitch</category>
      <category>rtos</category>
      <category>concurrency</category>
    </item>
    <item>
      <title>Safety verification of a spin lock used in Linux kernel based on x86-TSO memory model by using SyncStitch</title>
      <dc:creator>Hisabumi Hatsugai</dc:creator>
      <pubDate>Fri, 20 Jul 2018 00:13:06 +0000</pubDate>
      <link>https://dev.to/hatsugai/safety-verification-of-a-spin-lock-used-in-linux-kernel-based-on-x86-tso-memory-model-by-using-syncstitch-4d56</link>
      <guid>https://dev.to/hatsugai/safety-verification-of-a-spin-lock-used-in-linux-kernel-based-on-x86-tso-memory-model-by-using-syncstitch-4d56</guid>
      <description>&lt;h1&gt;
  
  
  Memory model
&lt;/h1&gt;

&lt;p&gt;A memory model describes the interactions of threads through memory and their shared use of the data. It is generally defined in programing language specifications or CPU manuals.&lt;/p&gt;

&lt;h1&gt;
  
  
  x86-TSO
&lt;/h1&gt;

&lt;p&gt;When you write multi-threading programs on x86 processors, you are supposed to assume the memory model described in the x86 manuals, and should not base on the actual behaviour of CPU you use because it varies from CPU model to model, it may be change in the future. &lt;/p&gt;

&lt;p&gt;However, unfortunatelly, the memory model is described in natural language and it is often ambiguous and even inconsistent.&lt;/p&gt;

&lt;p&gt;To deal with this issue, researchers built a programmer's model. There is a paper titied:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;x86-TSO: A Rigorous and Usable Programmer’s Model for x86 Multiprocessors&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this paper, the memory model is rigorously formalized in a mathematical language.&lt;/p&gt;

&lt;p&gt;I investigated the behaviours of the model with a model checker (more strictly, a refinement checker) called &lt;a href="http://www.principia-m.com/syncstitch/index.html"&gt;SyncStitch&lt;/a&gt; by modeling (modeling a model!) the memory model in the paper and composing it with thread models executing a sequence of read/write instructions.&lt;/p&gt;

&lt;p&gt;The x86-TSO memory model consists of a memory, a lock-state for LOCK-prefix, and for each processor, a set of registers and a writer buffer (a queue which element is a pair of address and a value to be written).&lt;/p&gt;

&lt;p&gt;(from the paper)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WtHxQE0Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/r135uc0bcwth6bu69x69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WtHxQE0Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/r135uc0bcwth6bu69x69.png" alt="x86blockdiagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This model is translated into the SyncStitch model like this (just a sketch):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YUmG-4VI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/go7fmgfu0ggs51fcxk40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YUmG-4VI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/go7fmgfu0ggs51fcxk40.png" alt="SyncStitch model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you model a CPU, you can investigate all of possible behaviours of the code like this:&lt;/p&gt;

&lt;p&gt;(from the paper)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p6O-ZBRm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hfbtsov3f0jm5lkl7gh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p6O-ZBRm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hfbtsov3f0jm5lkl7gh9.png" alt="n6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or this:&lt;/p&gt;

&lt;p&gt;(from the paper)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---zFwX0Yw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/plp6gxienn3msterw4xc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---zFwX0Yw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/plp6gxienn3msterw4xc.png" alt="n5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The results are shown like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JCD_MDdo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xdnm1o4seev9gzzltv3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JCD_MDdo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/xdnm1o4seev9gzzltv3g.png" alt="assertion1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you find an allowed final state, you can consult the detailed path from the initial state to the final state with looking into values of the memory, the registers, and the writer buffers, which cannot be observed on the actual CPU.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f6UmK1mY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wirhvwnlifog7ledzh39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f6UmK1mY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wirhvwnlifog7ledzh39.png" alt="process explorer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Spin lock in Linux kernel
&lt;/h1&gt;

&lt;p&gt;According to the paper, there was a discussion about the correctness and the safety of an implementation of a spin lock code in Linux kernel. The code is as follows:&lt;/p&gt;

&lt;p&gt;(from the paper)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xQErQDXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5gj432mixmaiz9ug7i8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xQErQDXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5gj432mixmaiz9ug7i8l.png" alt="spin lock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I modeled this code on SyncStitch with x86-TSO model, and also built a safety specification for it. Then check the safety on the tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jP8RgMnV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yksw18g7on3my7zd7lg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jP8RgMnV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yksw18g7on3my7zd7lg5.png" alt="assertion2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I successfuly confirmed the safety. This is what a refinement checker can do (one of them).&lt;/p&gt;

&lt;p&gt;Since the model I built this time supports LOCK-prefix and MFENCE instruction, you can investigate broad type of x86 instruction sequences intended for multi-threading. I guess programmers working on operating systems and/or embeded systems are insterested in this model and tool.&lt;/p&gt;

</description>
      <category>syncstitch</category>
      <category>concurrency</category>
      <category>multithreading</category>
    </item>
  </channel>
</rss>
