Hacker Newsnew | past | comments | ask | show | jobs | submit | bicolao's commentslogin

> I misread this as AI initially ...

The japanese have it harder because "ai" means love. But perhaps "love" will be written in kanji while "AI" in katakana, so writing form is not confusing.


From what I've seen, "AI" is typically written with the "Roman" (latin) letters, or translated as 人工知能 (AI) or as 生成AI (generative AI like LLMs).


I'm more amazed you run the same machine for 20 years. Another 20+ years user, but I've reinstalled 5-6 times when I change laptops.


No, I changed the machine, but just installed Gentoo every time. I merely kept the emerge.logs from each machine.


> Every time I try and learn Vulkan I end up getting confused and annoyed about how much code I need to write and give up.

Vulkan isn't meant for beginners. It's a lot more verbose even if you know the fundamentals. Modern OpenGL would be good enough. If you have to use Vulkan, maybe use one of the libraries built on top of it (I use SDL3 for example). You still have freedom doing whatever you want with shaders and leave most of resource management to those libraries.


> But you're right: ulimately the kernel is just a program.

Play a bit with user mode linux [1] the kernel becomes literally a linux program, that I believe you can even debug with gdb (hazy memory as I tried uml last time maybe a decade ago)

In theory you can also attach gdb to qemu running linux, but that's more complicated.

[1] https://en.wikipedia.org/wiki/User-mode_Linux


And User Mode Linux was the basic technology for dirt cheap (not so) virtual machines at some VPS providers 15yrs ago. This had some disadvantages, for instance you could not load custom kernel modules in the VM (such as for VPN), actually you could not modify the kernel at all.


Another major disadvantage, at least back then, was that it did not support SMP at all


It's 2000. Build failure was pretty much expected for any software. Probably a good idea to stay home and work through any problem. Nowadays you'll just fire up a build and go. And the build is probably finished before you're out of the door.


The way I remember it the Linux kernel compiled really reliably back then. It would take a few hours though.


Yes. I never had problems with Linux itself and compiled kernels constantly. What I did have incessant problems with was compiling GNOME 1.2 and 1.4. SO MANY problems, just non-stop... it was always something. I learned a bit though, although not as much as I could have if I paid attention more.


make config && make depend && make modules && make zImage &&


lilo


> I get your point, but reviewing your own PRs is a very good idea.

Yes. You just have to be in a different mindset. I look for cases that I haven't handled (and corner cases in general). I can try to summarize what the code does and see if it actually meets the goal, if there's any downsides. If the solution in the end turns out too complicated to describe, it may be time to step back and think again. If the code can run in many different configurations (or platforms), review time is when I start to see if I accidentally break anything.


The top of the page links to this https://practical-scheme.net/oneday.html that explains more what practical means for the author (of Gauche Scheme). In short

> One day, however, I will point this page, when the friend asks me if Scheme is feasible for daily chores and a practical choice.


fuse probably isn't a good example here because you still have to enter kernel space if i'm not mistaken, then out again to the fs driver in userspace then probably back to kernel space (block driver). fuse has many upsides, but I don't think performance is one of them.


Well, you still have to enter the kernel to actually queue an OS-level thread w/ a futex. The kernel supporting being able to move stuff to userland sure doesn't guarantee better performance-- the main opportunity from that perspective is minimizing how often you cross the boundary.

You're 100% right that there are plenty of other considerations, often positive for lifting things out, like minimization of ring 0 attack surface.


If this is ad hoc solution, what's the "right" approach?


Futex is a fine solution for locks and semaphores (FUTEX_WAIT/WAKE operations). It's been extended repeatedly to handle the needs of condition variables, priority inheritance, timeouts, interop with file descriptors and async/io_uring, etc... with the result that a lot of the API exists to support newer operations with oddball semantics and not a few genuine mistakes and traps (often undocumented). See the glibc condition variable code for how complicated this can get.

Also, while googling for some examples for you I was reminded of this LWN article from a few years back that details some of the issues: https://lwn.net/Articles/823513/


Just because the Linux futex call is currently a Swiss Army knife with some parts that add no value (which I do say in the article) doesn't mean that it's not valuable, or important.

The fact that Linux has extended it in so many ways is, in fact, a testament to it to how impactful the futex concept has been to the world of concurrency.

The fact that it's also at the core of other OS primitives does as well. At least on the MacOS side, those primitives do have much simpler APIs, as well. For instance, here's the main wait function:

`extern int os_sync_wait_on_address(void * addr, uint64_t value, size_t size, os_sync_wait_on_address_flags_t flags);`

There's also one with a timeout.

The wake side is equally simple, with two calls, one to wake one thread, one to wake all threads. No other number matters, so it's a great simplification in my view.

Your fundamental point is that the futex is actually a pretty unimportant construct. Clearly I don't agree, and it's okay not to agree, but I really am struggling to see your counter-argument.

If futexes aren't important to good locks, then, if modern OSes all felt compelled to jettison the futex for some reason, you'd have pthread implementations do ... what exactly??


They are so good that they keep being reinvented even in userspace, for example WTF::ParkingLot.

Or C++ also adding std::atomic::wait which is basically a thin [1] wrapper over futex.

[1] implementations still manage to mess it up.


The WTF::ParkingLot example is interesting because it shows that you don't actually need futexes in the kernel to implement them efficiently; you just need something like a spinlock (with sane backoff!) to guard the userspace wait queue and a per-thread eventfd to wake up waiters.


Yes, you can do a good futex impression in userspace and add any missing functionality you need. Most importantly for webkit, I think, you get portability.

The advantage of futex provided by the kernel is ABI stability and cross process support.


It gives you an implementation. The implementation does not have to be ideal, though.


This is mostly the fault of pthreads, where baroque POSIX semantics had to be shoehorned into the kernel for efficiency.


Wait/Wake are enough for the vast majority of the use cases. The rest is a mix of niche cases (PI, robust mutexes) and failed experiments.


The author answered on lobster thread [1]. This is more of an io_uring exercise than an attempt to replace ls.

[1] https://lobste.rs/s/mklbl9/lsr_ls_with_io_uring


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: