This is a lock free key value store in a single file - it doesn't have the network protocol, but any threads dealing with the network IO could use it without doing anything differently.
https://github.com/LiveAsynchronousVisualizedArchitecture/si...
281 karma · joined November 8, 2017
This is a lock free key value store in a single file - it doesn't have the network protocol, but any threads dealing with the network IO could use it without doing anything differently.
https://github.com/LiveAsynchronousVisualizedArchitecture/si...
It is a completely lock free key value store, though does not have eviction built in.
Its memory management is done using a free list of blocks, which is part of how it maintains lock free concurrency.
Gold and silver are the original currencies. They are trustless because they can be verified easily and transferred physically.
The more trust a currency requires, the less valuable it becomes due to decreased fungibility and liquidity.
As far as I can tell, concurrency is fundamentally about grouping data by dependencies to find chunks that can be isolated. I think that resources are more about lifetimes and ownership and that resources and data aren't the same thing. This doesn't contradict what Rust is doing, it is more about relying on the language less.
You can see what I'm talking about in this link, though I don't think it has been digestible enough yet without video or examples.
https://github.com/LiveAsynchronousVisualizedArchitecture/la...
https://github.com/LiveAsynchronousVisualizedArchitecture/la...
Electron is only the best way to do something when someone knows only javascript and web dev but doesn't want to learn a new language. Maybe a case could be made for severe misconceptions also helping electron like 'a custom native app has to be made for each platform', even though C++ and Qt and many other combinations can be written once with 99% of the source being the same for every platform.
This thread was started because the article focuses on lock free programming with garbage collection when garbage collection is not any sort of fundamental factor in lock free programming.
> In my experience about lock-free (and wait-free) programming, safe and high performance deallocation of the objects is often a problem.
Concurrency bottlenecks are fundamentally about synchronization. The solution is frequently to synchronize less and that means doing more in between synchronizing. This implies allocating and deallocating more at one time.
There isn't anything about garbage collection that enables something that couldn't be done before. If a lock free data structure is holding other non-trivial data structures that have no notion of concurrency, you are already in a position where you have to take what you can get.
> synchronization consumes a lot of CPU cycles. Ask any C++ programmer.
I've done a large amount of lock free programming in C++ and the best scenario is lock free data structure that takes responsibility for all the data stored in it and isn't just a container of pointers is the best approach to control the amount and types of synchronization. Atomic reference counting with the last reading thread responsible for deletion is just fine as an approach.
Ultimately, having granular but heap allocated data structures in a 'lock free' container needs to come with proper expectations, since it is a poor way to scale concurrency. Granular synchronization can be fine if typical usage isn't going to see much overlap or if the whole thing won't see much use in the first place, but for concurrency to scale, larger chunks of data separated out by their dependencies needs to be used.
I don't think serialization is a problem either. It is possible to make data structures that always exist as a single span of memory, so that they don't have a separate serialized representation. Most data structures are better served like this anyway, since prefetching and linear memory access is a huge speedup over pointer chasing. Building a data structure out of many separate heap allocations will also slow it down.
https://github.com/LiveAsynchronousVisualizedArchitecture/la...
All the IO between nodes is serialized, so an output that is already in shared memory (to be examined or visualized in other programs) can also be written to disk.
It can then be loaded as a 'constant' node and iterations can be done with hot reloading on the baked output.
They key is that you need both live/hot/automatic reloading of execution AND snapshots/replay/rewind/baking.
If you only have one or the other, you can't isolate a part of a program and iterate on it nearly as quickly.
This is something that does not depend on low volatility and can be done on a small scale while bypassing a large expensive service like western union.
Just because a project doesn't do something well doesn't mean they don't know how to value it.
https://github.com/LiveAsynchronousVisualizedArchitecture/la...
Concurrency really comes from being able to split up data in isolated chunks that have access to all their dependencies. When you think in terms of data and not tasks, things make a lot more sense.
https://github.com/LiveAsynchronousVisualizedArchitecture/si...
"One appealing aspect of LMDB is its relative ease of use from multiple processes, above and beyond its basic capabilities as yet-another-fast-key-value-store."
simdb is only lock free and thread safe. While LMDB is benchmarked at around 10k writes, this should be able to do millions of mixed reads and writes with 4 modern cores. LMDB seems to use a separate lock file to sync multiple threads/processes. The only catch here is that the keys aren't sorted, which doesn't seem to be a requirement of theirs.