<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>B-link-trees for DB/OS Co-Design</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Jan Mühlig</string-name>
          <email>jan.muehlig@tu-dortmund.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>TU Dortmund University Germany</institution>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2018</year>
      </pub-date>
      <abstract>
        <p>ion model for parallel control ows. To gure out the behavior, we implemented a prototypical data structure for indexing, whose results will be presented and discussed.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>
        While hardware changes in the order of many processor
cores, large amounts of main memory and complex
memory architectures, software must also adopt these changes.
The purpose of increasing the number of processor units is a
linear speedup improvement, which is hard to reach. One
reason therefor is given by parts of a software, that cannot be
parallelized e.g. because of concurrent accesses to the same
shared resource, like shared memory, must be synchronized
[
        <xref ref-type="bibr" rid="ref14 ref2">2, 14</xref>
        ]. Otherwise, the software could end up in unde ned
behavior such as system crashes or incorrect results [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ]. In
conclusion, this means that synchronization like locking has
to be avoided both for Operating Systems (OSs) and
applications running on top, including Database Management
Systems (DBMSs).
      </p>
      <p>
        In this work, we will introduce interesting aspects of the
project \MxKernel: A Bare-Metal Runtime System for
Database Operations in Heterogenous Many-Core Hardware"
which is a joint project of the Embedded System Software
Group and the Databases and Information Systems Group
at TU Dortmund. While common OSs allow the database to
run as an application on top, the MxKernel is a minimal layer
which can be used by both OS and DBMS as an abstraction
layer for the underlying hardware. This software
architecture enables the reuse of data structures and algorithms e.g.
indexes that are used by OSs for le system implementation
[
        <xref ref-type="bibr" rid="ref11 ref18">11, 18</xref>
        ] and databases to manage the data. Furthermore, all
applications running on top of the MxKernel will have a less
abstract interface to the hardware than the most operating
systems o er so far. Additional to the software architecture,
one main aspect of the MxKernel is a control ow
abstraction, that is not built on the common thread model and
pledges for a more straightforward way to avoid locks.
      </p>
      <p>This paper is organized as follows. In Section 2 we will
describe modern hardware in more detail and discuss
problematic aspects. More precise information about the
concept of the MxKernel will be introduced in Section 3. As a
rst data structure using the MxKernel, we built a
B-linktree, which is presented and discussed in Section 4, before
we summarize in Section 5. Finally, the next steps of the
project respecting databases will be outlined in Section 6.
2.</p>
    </sec>
    <sec id="sec-2">
      <title>MODERN HARDWARE</title>
      <p>There are several properties of current and future
hardware, that we need to follow from the software's view. This
Section will discuss some of these characteristics.
2.1</p>
    </sec>
    <sec id="sec-3">
      <title>Growing core count</title>
      <p>
        Because it is no longer feasible to increase the clock
frequencies of processing units, more cores are installed on a
chip instead in order to enable more power through
parallelism [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. This growing number of processor cores a ects
servers as well as end-user systems, such as desktop computer
and mobile devices. In fact, today we already have manycore
processors and in the future, these will continue to increase
[
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. Because not every part of an application can be
parallelized, at that point the concurrent control ows have to
be to synchronized, for example updating a shared memory
location or writing to the command line. While some
techniques like mutexes and spinlocks ensure only one control ow
to pass that critical section, smarter algorithms use atomic
load, store and compare operations [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] to implement
waitor lock-free synchronization [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]. The development of these
algorithms is di cult and depends on the underlying data
structure.
2.2
      </p>
    </sec>
    <sec id="sec-4">
      <title>Non-uniform Memory Access and cache coherence</title>
      <p>
        With the ongoing increase of processor units, symmetric
memory architectures stopped scaling with modern
manycore systems [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Instead, more complex memory
architectures like Non-uniform memory access (NUMA) exists in
modern hardware systems. A NUMA system is divided into
several nodes on which the CPUs are attached directly to
the node's local memory. The memory is still organized in
a coherent memory space where every core can access every
memory address, but the latency di ers on local and
remote accesses and may be higher in the latter case. Thus, the
memory accesses matters and can be a reason for bad
performance [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], when obtaining data from a remote NUMA
node. To prevent the latency that occurs on remote
memory access, the OS and other applications should prefer local
data. Experiments in context of DBMSs have shown that
NUMA awareness can improve performance, but this
requires knowledge about the system and interfaces to allocate
local memory and place threads in de ned regions [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ].
Furthermore, NUMA aware join algorithms like MPSM [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] and
Handshake join [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] have con rmed this.
      </p>
      <p>
        In terms of distributed memory, parallel computing and
scalability, caches respectively cache coherence are also
signi cant. While caches speed up repeated access to data,
redundant data must be synchronized through complex
cache hierarchies. Since locks that are touched by many cores
are often implemented by using shared memory, cache
coherence quickly results in solutions that are not scalable [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ].
2.3
      </p>
    </sec>
    <sec id="sec-5">
      <title>Heterogeneity</title>
      <p>
        In addition to the growing number of computing units,
we also see an increase in heterogeneous hardware, like
different cores with specialized functions in a single machine
[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. The cores may di er in regard to energy consumption,
performance characteristics and also the instruction set
architecture [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]. Even peripheral devices are used more often,
such as special cores based on Field-programmable gate
arrays (FPGAs) and Graphics processing units (GPUs), which
are for example exploited on database query processing [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
    </sec>
    <sec id="sec-6">
      <title>MXKERNEL</title>
      <p>The goal of the MxKernel is to improve the performance
of manycore systems in regard to the increasing amount of
data. In order to achieve this, the MxKernel forms the basis
for applications like DBMSs and operating system services
as well. Additional small units of work, we call them MxTasks,
are used rather than threads for control ow abstraction.</p>
      <p>This section will give an overview of the software
architecture of the kernel, the MxTasks and how to synchronize
them.
3.1</p>
    </sec>
    <sec id="sec-7">
      <title>Architecture</title>
      <p>In most cases, operating systems are the basis for
applications. The OS manages and abstracts the underlying
hardware, which makes it simple to deploy applications on a wide
set of di erent hardware. For this purpose, OSs provide
interfaces for the hardware and a set of services to applications
running on top of it. However, this endeavor also has
disadvantages, for example, the OS is the only one who knows
much about running applications.</p>
      <p>
        Particularly, DBMSs does need only a few of those
provided services and implements his own ones. This concludes
that \a small e cient operating system with only desired
services" [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] would be preferred by database people.
Furthermore, it is also important to consider the overall status of
      </p>
      <sec id="sec-7-1">
        <title>OS Services</title>
      </sec>
      <sec id="sec-7-2">
        <title>MxKernel CPU CPU</title>
      </sec>
      <sec id="sec-7-3">
        <title>Memory CPU CPU</title>
      </sec>
      <sec id="sec-7-4">
        <title>Memory GPU</title>
        <p>
          the system if the database is to perform well in the presence
of other applications [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ], but in most cases, only the OS
has knowledge about the status. While existing OSs in the
industry are being adapted, like Linux for Oracles
Exadata Database Machine [
          <xref ref-type="bibr" rid="ref27">27</xref>
          ], some research operating systems
allow specialization for applications [
          <xref ref-type="bibr" rid="ref28 ref4">28, 4</xref>
          ].
        </p>
        <p>
          In contrast to this, the MxKernel, whose software
architecture is shown in Figure 1, provides a platform for both
OS and DBMS. This makes sense for various reasons. When
the operating system is the base layer for applications, the
hardware will be abstracted to minimize any e ort in regard
to di erent hardware architectures. On the other hand, the
abstraction may become prevalent and applications have
fewer possibilities to control hardware resources precise. While
hardware changed after OSs such as Linux were published,
it has become tedious to adopt these changes. For example,
the entire Linux kernel was temporarily locked by a single
lock to prevent multiple threads passing the kernel in
parallel [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. Another example is libnuma [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ], a library that
provides an interface for NUMA architectures but does not
t seamlessly into existing interfaces.
        </p>
        <p>By providing a minimal layer for OSs and other
applications like DBMSs, which normally run on top with a need for
less abstracting interfaces of the underlying hardware, we
promise advantages for both sides. For example, the DBMS
could make a better placement of data on the hard disk,
improve scheduling of control ows and take more care of
NUMA awareness.</p>
        <p>
          Further, there are components that are introduced by
both OSs and DBMSs. Indexing techniques, for example,
are used in databases to e ciently locate tuples. Even le
systems like BeOS [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ] implemented similar data structures
and algorithms to access les in a quick way. Both use the
same approach, but they can not share concrete
implementations because of the structure, where the database is built
upon the OS or vice versa. As a result, those
functionalities will be held redundant, where the MxKernel's software
architecture allows sharing and reduces those redundancies.
3.2
        </p>
      </sec>
    </sec>
    <sec id="sec-8">
      <title>Control flow abstraction</title>
      <p>Threads are a well-known and heavily used method to
abstract concurrent control ows. Many OSs, as well as
programming languages, implement threads, which also have
some disadvantages. When several threads access a data
structure at the same time and at least one of them updates the
data, the accesses must be atomic or synchronized, e.g. by
mutexes or spinlocks. This could impair the scalability of
the system because in case of synchronization only a single
thread could pass the guarded section.</p>
      <p>Another costly aspect is scheduling and the included
context switches of threads. Since there are mostly more threads</p>
      <sec id="sec-8-1">
        <title>MxTask</title>
      </sec>
      <sec id="sec-8-2">
        <title>MxTask</title>
      </sec>
      <sec id="sec-8-3">
        <title>MxTask</title>
      </sec>
      <sec id="sec-8-4">
        <title>MxTask</title>
        <p>
          than processing units on a system, the operating system has
to schedule them periodically. When a thread is
suppressed by the OS for the bene t of another, the context of the
replaced thread has to be saved and the context of the
restored thread has to be recovered. On a Linux based system, a
context switch takes micro- up to milliseconds [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ].
        </p>
        <p>
          An alternative approach to threads, which represents a
large sequence of instructions, is to split the work into
smaller units, named tasks. Several libraries and operating
systems make use of this concept, e.g. Intel's Threading
Building Blocks [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ] and the AUTOSAR OS [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ], which provides
an option for o ine scheduled tasks.
        </p>
        <p>Also, the MxKernel uses the concept of tasks, namely
MxTasks, to manage compute resources. The MxTasks are
characterized by a run-to-completion semantic, which means
that running tasks will never be suppressed by the kernel.
Thus, a task does not need his own stack, instead, all tasks
of one core can share the same stack, which minimizes the
costs of a context switch between two tasks. Further, the
kernel guarantees the execution of a task per core to be
atomically, whereas a common thread could be interrupted at
any time. As a consequence, all tasks scheduled to the
same core are synchronized by de nition and do not need any
lock. This makes it easier to synchronize con icting tasks
and simpli es the development of lock-free data structures
and algorithms.</p>
        <p>In regard to modern hardware described in Section 2, we
see another bene t that tasks can pro t in contrast to
heavyweight threads. Due to the usually longer life and execution
time of threads, it is di cult to predict memory accesses and
migrate threads to the suitable NUMA region. MxTasks, on
the other hand, have a short duration of execution and in
this way lesser memory accesses. This allows ner scheduling
with respect to local memory requests.
3.3</p>
      </sec>
    </sec>
    <sec id="sec-9">
      <title>Synchronization</title>
      <p>Nevertheless, the access to one resource from di erent
MxTasks has to be synchronized. Otherwise di erent tasks
could update one resource on di erent cores at the same
time like shown in Figure 2a, which causes unde ned behavior.
For this purpose, we present two methods.</p>
      <sec id="sec-9-1">
        <title>CPU core based synchronization.</title>
        <p>Based on the run-to-completion semantic of tasks, we can
ensure that all tasks executed on the same CPU core are
serialized. By implication, this means when all accesses on
one resource are done by tasks assigned to the same core, the
resource does not need to be protected by locks or mutual
exclusion. Following this, we can synchronize multiple tasks
accessing the same resource by scheduling them to the same
core without any overhead. This is shown in Figure 2b, where
both Resource a and b are mapped to the rst core in the
system.</p>
      </sec>
      <sec id="sec-9-2">
        <title>Synchronize-Task.</title>
        <p>Using the core based synchronization with a xed
resource to core mapping may result in an unbalanced load of the
system, where some cores may have a lot of work and others
not. In order to avoid that balancing problem and to get
rid of the static task-to-core-assignment, we implemented
a special task for synchronization, called Synchronize-Task.
Within a system where concurrent tasks access a shared
resource like shown in Figure 2a, every Synchronize-Task
represents such a shared resource e.g. a monitor. Every task,
that wants to use the shared resource, for example, to print
some text on the monitor, needs to enqueue to the
waiting list of the Synchronize-Task, shown in Figure 2c.
After that, the Synchronize-Task will register itself as ready to
run to the MxKernel. By the time the MxKernel executes the
Synchronize-Task as a normal MxTask, a set of tasks waiting
in the ready list of the Synchronize-Task will be executed
directly. To avoid too long execution times, the set of
running tasks within a Synchronize-Task will be restricted and
the Synchronize-Task will be marked as ready again if not
all (sub-) tasks were executed. In this way, the
SynchronizeTasks can move around between cores to balance the load
and take care of NUMA aware execution. Moreover, when
multiple tasks accessing the same data are executed
consecutive, their behavior will be more cache-friendly because
already cached data could be used for several tasks in a
direct way.
4.</p>
      </sec>
    </sec>
    <sec id="sec-10">
      <title>MICRO-BENCHMARK</title>
      <p>
        The task model introduced in Section 3 di ers from
programming with well-known threads and looks more like an
event-based and asynchronous development. To get started,
we opted for a B-link-tree-based index structure, with which
we have already gained some experience in our group [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ].
4.1
      </p>
    </sec>
    <sec id="sec-11">
      <title>B-link-tree</title>
      <p>
        B-trees and their variations like B+-trees and B-link-trees
[
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] are key-value stores and approved data structures for
indexing data in databases or le systems. In contrast to
original B-trees, B-link-trees store values in leaf nodes only,
inner nodes point the way down to child nodes using keys as
fences. Additionally, and contrary to B+-trees, every node
in a B-link-tree contains a high key, which indicates the
highest key that node will hold, and a link to the right sibling.
The latter allows sequential processing of the inner and leaf
nodes. Moreover, the B-link-tree allows the split operation in
consequence of a node over ow to be executed in two single
steps [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], whereby only the modi ed node must be
protected by a latch. This condition allows the B-link-tree to be
implemented with the task model by considering each node
of the tree as a shared resource, which can be synchronized
by the methods presented above in Section 3.3.
      </p>
      <p>As an example for developing with the task model in the
context of the MxKernel, we will take a look at the insert
operation to store a key-value pair as a record into the
Blink-tree. Algorithm 1 shows the pseudo code of a simpli ed
insert operation using threads. First, we will nd a leaf in a
B-link-tree by traversing through di erent levels of the tree,
shown in lines 2 to 7. As we found the correct leaf, we insert
the record composed of a key and the corresponding value,
represented by lines 8 to 11. In case that the leaf node is
full, it is split into two nodes, both lled with half of the
key-value pairs and the separator to the new node has to
be propagated up to the parent node. Because this is not
important for the comparison between the two abstraction
models, we neglect this step.</p>
      <p>
        While navigating down to the leaf the record will be stored
in, we need to take a latch on every inner node to prevent
other threads from updating that node. Even for the leaf
node, we have to take a latch during insertion. As a result,
when frequently used nodes, such as the root node, will be
accessed by multiple threads, the latch data structure will
be touched by all of them. The lock contention will be a
big part of the execution time [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ]. Another aspect is the
memory access in a NUMA system. When multiple threads
on di erent NUMA regions touch the same node, the data
will be shipped across. This can be associated with high
latency. By using the task model, we want to bring the code
to the data instead of moving the data to the code.
      </p>
      <p>The concept of MxTasks and the way they are synchronized
with each other gives us the possibility to avoid the lock
contention. In opposition to threads, where one thread will
traverse through the tree to nd a leaf, multiple tasks are
used to process node by node, shown in Algorithm 2. Every
insert task will start his work on the root node of the tree.
Assuming that the root node is not a leaf, the task will
look up for the next child node and create a follow-up task
for that node (lines 1-3). On the located child node, this
steps will be repeated, until we found a leaf. When the task
located the wanted leaf, the key-value pair will be inserted
(line 6) and the task is done. Assuming that the node has
to be split, an insert task for the pointer to the new node
will be spawned at the parent node. Deviating from thread
model, where the propagation of the new node would be done
bottom-up recursive, the MxKernel uses tasks to propagate
the key-pointer pair for the new node up to the parent.</p>
      <p>In regard to di erent synchronization techniques
described in Section 3.3, the EnqueueTask method (line 3) could
have various implementations. When using the core, based
synchronization, every node is mapped to a core based on its
memory address. Enqueue in this context means to mark the
task as ready for the run on the mapped core so that only
this core will process all tasks accessing the node.
Otherwise, when the Synchronization-Task is used, every node is
seen as a shared resource and will be a MxTask which can
be processed by the MxKernel. In this way, every node will
execute the tasks that are accessing it, to avoid concurrent
accesses to one node.
4.2</p>
    </sec>
    <sec id="sec-12">
      <title>Results</title>
      <p>All measurements are carried out on a machine using the
hardware presented in Table 1. While the MxKernel is
running directly on the hardware, we used an Ubuntu 17:10
with a Linux Kernel 4:13:0 36 to measure the thread
based variant of our benchmark.</p>
      <p>As a workload, we insert 5; 000; 000 random generated
32bit key-value pairs into the B-link-tree using a global set of
prede ned values, which are \stolen" by threads and tasks.
The results of our experiments can be seen in Figure 3. A
rst nding is that all measurements show a loss of
performance when using more than eight cores. At this point, the
0 2 4 6 8 10 12 14</p>
      <p>Linux Threads Cores / Threads</p>
      <p>MxTasks (Synchronize-Task)
MxTasks (CPU-synchronized)
16</p>
      <p>rst processor with eight cores installed is not enough and
some tasks and threads are scheduled to the second
processor, which is also a separate NUMA region. While the
thread benchmark (red) is fastest at four cores and slows
down when additional cores are added, all variants of the
benchmarks using MxTask gain more throughput until using
the ninth core. At the thread variant, we have no in uence
on the scheduling of threads and left it to Linux. Therefore,
it is possible that two threads on the same core compete for
computing time, which may slow down the benchmark.</p>
      <p>We also see some di erences in regard to throughput
within the two di erent techniques of task synchronization,
described in Section 3.3. While synchronization by
Synchronize-Task (blue) seems to be slower on the usage of the rst
eleven cores, the core based synchronization (green) variant
loses more speed when using 12 15 cores. In the end, when
using all 16 processing units, their throughput is
approximately equivalent.</p>
      <p>By pro ling the given benchmark and both techniques for
task synchronization we have uncovered problems
concerning the task queue data structure, which is used by both
Synchronize-Task and the task management of the
MxKernel. In order to achieve a wait-free behavior of the queue,
an atomic variable is shared between consumer and producer
when just one or none item is remaining in the queue. In the
case of the synchronize task, where each node is represented
by such a task, we get a lot of contention on that shared
variable, which slows down the whole application.
Unbalanced workloads in which some cores have little work end up
behaving the same way. The extra e ort to keep the cache
coherent seems to get more expensive when more than one
NUMA region is involved which ends in poor performance
on two nodes.</p>
      <p>Nonetheless, MxTasks seems like a promising approach to
make better use of modern hardware than usual threads
does. Although we have not made any optimizations
regarding the NUMA architecture and do not yet schedule tasks
in the best possible way, the MxKernel achieved a higher
throughput on the B-link-tree.</p>
    </sec>
    <sec id="sec-13">
      <title>5. SUMMARY</title>
      <p>In this paper, we presented the MxKernel, which is a
baremetal runtime system for Database/Operating System
CoDesign. With the project, we focus on modern hardware that
is characterized by many cores, complex memory
architectures, and heterogeneity. Small units of work are used to
abstract control ows rather than threads.</p>
      <p>As a rst data structure, we implemented a B-link-tree on
top of the MxKernel and MxTasks. Experiments have
revealed promising results and have shown that tasks sometimes
scale better than threads, even there is still room for
optimizations. With the software architecture outlined above, we
will obtain a better interface between software and hardware
to enable optimization in regard to modern hardware.
6.</p>
    </sec>
    <sec id="sec-14">
      <title>NEXT STEPS</title>
      <p>As the experiments show, we need to nd a more e cient
data structure for task management in order to reduce the
contention of shared variables. Considering the intention to
create a full runtime environment for databases and
operating systems, we must rst solve basic problems such as
e cient memory allocation. With MxTasks we have a data
structure that is allocated and destroyed at high frequencies,
our current usage of a global heap may be a bottleneck for
scalability. Similarly, there is still no clarity as to how tasks
could be ideally scheduled to available cores. Therefore, we
want to model dependencies among MxTasks and their access
patterns as metadata, connected directly to the tasks. Also,
o ine scheduling may be an opinion.</p>
      <p>In regard to databases, more data structures like hash
tables have to be implemented in order to further explore
the behavior and programming of MxTasks. Furthermore, we
will add a transactional interface to the B-link-tree.</p>
    </sec>
    <sec id="sec-15">
      <title>ACKNOWLEDGMENTS</title>
      <p>This research was supported by the Deutsche
Forschungsgemeinschaft, DFG, project number TE 111/2-1.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>M.-C. Albutiu</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Kemper</surname>
            , and
            <given-names>T.</given-names>
          </string-name>
          <string-name>
            <surname>Neumann</surname>
          </string-name>
          .
          <article-title>Massively parallel sort-merge joins in main memory multi-core database systems</article-title>
          .
          <source>Proceedings of the VLDB Endowment</source>
          ,
          <volume>5</volume>
          (
          <issue>10</issue>
          ):
          <volume>1064</volume>
          {
          <fpage>1075</fpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>G. M.</given-names>
            <surname>Amdahl</surname>
          </string-name>
          .
          <article-title>Validity of the single processor approach to achieving large scale computing capabilities</article-title>
          .
          <source>In Proceedings of the April 18-20</source>
          ,
          <year>1967</year>
          , spring joint computer conference, pages
          <volume>483</volume>
          {
          <fpage>485</fpage>
          . ACM,
          <year>1967</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Barbalace</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Ravindran</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Katz</surname>
          </string-name>
          .
          <article-title>Popcorn: a replicated-kernel os based on linux</article-title>
          .
          <source>In Proceedings of the Linux Symposium</source>
          , Ottawa, Canada,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>A.</given-names>
            <surname>Baumann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Barham</surname>
          </string-name>
          , P.-E. Dagand,
          <string-name>
            <given-names>T.</given-names>
            <surname>Harris</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Isaacs</surname>
          </string-name>
          , S. Peter,
          <string-name>
            <given-names>T.</given-names>
            <surname>Roscoe</surname>
          </string-name>
          ,
          <string-name>
            <surname>A.</surname>
          </string-name>
          <article-title>Schupbach, and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Singhania</surname>
          </string-name>
          .
          <article-title>The multikernel: a new os architecture for scalable multicore systems</article-title>
          .
          <source>In Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles</source>
          , pages
          <volume>29</volume>
          {
          <fpage>44</fpage>
          . ACM,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S. P.</given-names>
            <surname>Bhattacharya</surname>
          </string-name>
          and
          <string-name>
            <given-names>V.</given-names>
            <surname>Apte</surname>
          </string-name>
          .
          <article-title>A measurement study of the linux tcp/ip stack performance and scalability on smp systems</article-title>
          .
          <source>In Communication System Software and Middleware</source>
          ,
          <year>2006</year>
          .
          <article-title>Comsware 2006</article-title>
          . First International Conference on, pages
          <volume>1</volume>
          {
          <fpage>10</fpage>
          . IEEE,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>S.</given-names>
            <surname>Blagodurov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Zhuravlev</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Fedorova</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Kamali</surname>
          </string-name>
          .
          <article-title>A case for numa-aware contention management on multicore systems</article-title>
          .
          <source>In Proceedings of the 19th international conference on Parallel architectures and compilation techniques</source>
          , pages
          <volume>557</volume>
          {
          <fpage>558</fpage>
          . ACM,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>H.-J.</given-names>
            <surname>Boehm</surname>
          </string-name>
          and
          <string-name>
            <given-names>S. V.</given-names>
            <surname>Adve</surname>
          </string-name>
          .
          <article-title>Foundations of the c++ concurrency memory model</article-title>
          .
          <source>In ACM SIGPLAN Notices</source>
          , volume
          <volume>43</volume>
          , pages
          <fpage>68</fpage>
          {
          <fpage>78</fpage>
          . ACM,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>S.</given-names>
            <surname>Borkar</surname>
          </string-name>
          .
          <article-title>Thousand core chips: a technology perspective</article-title>
          .
          <source>In Proceedings of the 44th annual Design Automation Conference</source>
          , pages
          <volume>746</volume>
          {
          <fpage>749</fpage>
          . ACM,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>S.</given-names>
            <surname>Bre</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Funke</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Teubner</surname>
          </string-name>
          .
          <article-title>Robust query processing in co-processor-accelerated databases</article-title>
          .
          <source>In Proceedings of the 2016 International Conference on Management of Data</source>
          , pages
          <year>1891</year>
          {
          <year>1906</year>
          . ACM,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>K.</given-names>
            <surname>Devika</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Syama</surname>
          </string-name>
          .
          <article-title>An overview of autosar multicore operating system implementation</article-title>
          .
          <source>International Journal of Innovative Research in Science, Engineering and Technology</source>
          ,
          <volume>2</volume>
          :
          <fpage>3162</fpage>
          {
          <fpage>3169</fpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>D.</given-names>
            <surname>Giampaolo</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Giampaolo</surname>
          </string-name>
          .
          <article-title>Practical File System Design</article-title>
          . Morgan Kaufmann Publishers,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J.</given-names>
            <surname>Giceva</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.-I.</given-names>
            <surname>Salomie</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Schupbach, G. Alonso, and
          <string-name>
            <given-names>T.</given-names>
            <surname>Roscoe</surname>
          </string-name>
          . Cod:
          <article-title>Database/operating system co-design</article-title>
          .
          <source>In CIDR</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>G.</given-names>
            <surname>Graefe</surname>
          </string-name>
          et al.
          <article-title>Modern b-tree techniques</article-title>
          .
          <source>Foundations and Trends R in Databases</source>
          ,
          <volume>3</volume>
          (
          <issue>4</issue>
          ):
          <volume>203</volume>
          {
          <fpage>402</fpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>J. L.</given-names>
            <surname>Hennessy</surname>
          </string-name>
          and
          <string-name>
            <given-names>D. A.</given-names>
            <surname>Patterson</surname>
          </string-name>
          .
          <article-title>Computer architecture: a quantitative approach</article-title>
          . Elsevier,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>E.</given-names>
            <surname>Ipek</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kirman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Kirman</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. F.</given-names>
            <surname>Martinez</surname>
          </string-name>
          .
          <article-title>Core fusion: accommodating software diversity in chip multiprocessors</article-title>
          .
          <source>ACM SIGARCH Computer Architecture News</source>
          ,
          <volume>35</volume>
          (
          <issue>2</issue>
          ):
          <volume>186</volume>
          {
          <fpage>197</fpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>T.</given-names>
            <surname>Kiefer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Schlegel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>W.</given-names>
            <surname>Lehner</surname>
          </string-name>
          .
          <article-title>Experimental evaluation of numa e ects on database management systems</article-title>
          .
          <source>In BTW</source>
          , volume
          <volume>13</volume>
          , pages
          <fpage>185</fpage>
          {
          <fpage>204</fpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>A.</given-names>
            <surname>Kleen</surname>
          </string-name>
          .
          <article-title>A numa api for linux</article-title>
          .
          <source>Novel Inc</source>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>P.</given-names>
            <surname>Koruga</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Baca</surname>
          </string-name>
          .
          <article-title>Analysis of b-tree data structure and its usage in computer forensics</article-title>
          .
          <source>In Central European Conference on Information and Intelligent Systems</source>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>A.</given-names>
            <surname>Kukanov</surname>
          </string-name>
          and
          <string-name>
            <given-names>M. J.</given-names>
            <surname>Voss</surname>
          </string-name>
          .
          <article-title>The foundations for scalable multi-core software in intel threading building blocks</article-title>
          .
          <source>Intel Technology Journal</source>
          ,
          <volume>11</volume>
          (
          <issue>4</issue>
          ),
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>C.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Ding</surname>
          </string-name>
          , and
          <string-name>
            <given-names>K.</given-names>
            <surname>Shen</surname>
          </string-name>
          .
          <article-title>Quantifying the cost of context switch</article-title>
          .
          <source>In Proceedings of the 2007 workshop on Experimental computer science, page 2. ACM</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <surname>M. M. Michael</surname>
          </string-name>
          .
          <article-title>Safe memory reclamation for dynamic lock-free objects using atomic reads and writes</article-title>
          .
          <source>In Proceedings of the twenty- rst annual symposium on Principles of distributed computing</source>
          , pages
          <volume>21</volume>
          {
          <fpage>30</fpage>
          . ACM,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>S.</given-names>
            <surname>Ramos</surname>
          </string-name>
          and
          <string-name>
            <surname>T.</surname>
          </string-name>
          <article-title>Hoe er. Cache line aware optimizations for ccnuma systems</article-title>
          .
          <source>In Proceedings of the 24th International Symposium on High-Performance Parallel and Distributed Computing</source>
          , pages
          <volume>85</volume>
          {
          <fpage>88</fpage>
          . ACM,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>P.</given-names>
            <surname>Roy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Teubner</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Gemulla</surname>
          </string-name>
          .
          <article-title>Low-latency handshake join</article-title>
          .
          <source>Proceedings of the VLDB Endowment</source>
          ,
          <volume>7</volume>
          (
          <issue>9</issue>
          ):
          <volume>709</volume>
          {
          <fpage>720</fpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>M.</given-names>
            <surname>Schro</surname>
          </string-name>
          <article-title>der. Using Modern Synchronization Mechanisms in Databases</article-title>
          .
          <source>Master's thesis</source>
          , TU Dortmund, Dortmund, Germany,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>A.</given-names>
            <surname>Silberschatz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. B.</given-names>
            <surname>Galvin</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Gagne</surname>
          </string-name>
          .
          <article-title>Operating system concepts essentials</article-title>
          . John Wiley &amp; Sons, Inc.,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>M.</given-names>
            <surname>Stonebraker</surname>
          </string-name>
          .
          <article-title>Operating system support for database management</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>24</volume>
          (
          <issue>7</issue>
          ):
          <volume>412</volume>
          {
          <fpage>418</fpage>
          ,
          <year>1981</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>R.</given-names>
            <surname>Weiss</surname>
          </string-name>
          .
          <article-title>A technical overview of the oracle exadata database machine and exadata storage server</article-title>
          .
          <source>Oracle White Paper. Oracle Corporation</source>
          , Redwood Shores,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>D.</given-names>
            <surname>Wentzla</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Agarwal</surname>
          </string-name>
          .
          <article-title>Factored operating systems (fos): the case for a scalable operating system for multicores</article-title>
          .
          <source>ACM SIGOPS Operating Systems Review</source>
          ,
          <volume>43</volume>
          (
          <issue>2</issue>
          ):
          <volume>76</volume>
          {
          <fpage>85</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>