mirror of
https://github.com/0xAX/linux-insides
synced 2024-11-03 23:15:21 +00:00
commit
6543cf4994
@ -19,7 +19,7 @@ One `control group subsystem` represents one kind of resources like a processor
|
|||||||
* `freezer` - allows to suspend/resume for a task(s) from a group;
|
* `freezer` - allows to suspend/resume for a task(s) from a group;
|
||||||
* `net_cls` - allows to mark network packets from task(s) from a group;
|
* `net_cls` - allows to mark network packets from task(s) from a group;
|
||||||
* `net_prio` - provides a way to dynamically set the priority of network traffic per network interface for a group;
|
* `net_prio` - provides a way to dynamically set the priority of network traffic per network interface for a group;
|
||||||
* `perf_event` - provides access to [perf events](https://en.wikipedia.org/wiki/Perf_(Linux)) to a group;
|
* `perf_event` - provides access to [perf events](https://en.wikipedia.org/wiki/Perf_\(Linux\)) to a group;
|
||||||
* `hugetlb` - activates support for [huge pages](https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt) for a group;
|
* `hugetlb` - activates support for [huge pages](https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt) for a group;
|
||||||
* `pid` - sets limit to number of processes in a group.
|
* `pid` - sets limit to number of processes in a group.
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ print line
|
|||||||
./cgroup_test_script.sh: line 5: /dev/tty: Operation not permitted
|
./cgroup_test_script.sh: line 5: /dev/tty: Operation not permitted
|
||||||
```
|
```
|
||||||
|
|
||||||
Similar situation will be when you will run you [docker](https://en.wikipedia.org/wiki/Docker_(software)) containers for example:
|
Similar situation will be when you will run you [docker](https://en.wikipedia.org/wiki/Docker_\(software\)) containers for example:
|
||||||
|
|
||||||
```
|
```
|
||||||
~$ docker ps
|
~$ docker ps
|
||||||
@ -444,6 +444,6 @@ Links
|
|||||||
* [cgroups kernel documentation](https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt)
|
* [cgroups kernel documentation](https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt)
|
||||||
* [cgroups v2](https://www.kernel.org/doc/Documentation/cgroup-v2.txt)
|
* [cgroups v2](https://www.kernel.org/doc/Documentation/cgroup-v2.txt)
|
||||||
* [bash](https://www.gnu.org/software/bash/)
|
* [bash](https://www.gnu.org/software/bash/)
|
||||||
* [docker](https://en.wikipedia.org/wiki/Docker_(software))
|
* [docker](https://en.wikipedia.org/wiki/Docker_\(software\))
|
||||||
* [perf events](https://en.wikipedia.org/wiki/Perf_(Linux))
|
* [perf events](https://en.wikipedia.org/wiki/Perf_\(Linux\))
|
||||||
* [Previous chapter](https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-1.html)
|
* [Previous chapter](https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-1.html)
|
||||||
|
@ -4,7 +4,7 @@ Synchronization primitives in the Linux kernel. Part 6.
|
|||||||
Introduction
|
Introduction
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
This is the sixth part of the chapter which describes [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_(computer_science)) in the Linux kernel and in the previous parts we finished to consider different [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) synchronization primitives. We will continue to learn synchronization primitives in this part and start to consider a similar synchronization primitive which can be used to avoid the `writer starvation` problem. The name of this synchronization primitive is - `seqlock` or `sequential locks`.
|
This is the sixth part of the chapter which describes [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_\(computer_science\)) in the Linux kernel and in the previous parts we finished to consider different [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) synchronization primitives. We will continue to learn synchronization primitives in this part and start to consider a similar synchronization primitive which can be used to avoid the `writer starvation` problem. The name of this synchronization primitive is - `seqlock` or `sequential locks`.
|
||||||
|
|
||||||
We know from the previous [part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html) that [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) is a special lock mechanism which allows concurrent access for read-only operations, but an exclusive lock is needed for writing or modifying data. As we may guess, it may lead to a problem which is called `writer starvation`. In other words, a writer process can't acquire a lock as long as at least one reader process which acquired a lock holds it. So, in the situation when contention is high, it will lead to situation when a writer process which wants to acquire a lock will wait for it for a long time.
|
We know from the previous [part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html) that [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) is a special lock mechanism which allows concurrent access for read-only operations, but an exclusive lock is needed for writing or modifying data. As we may guess, it may lead to a problem which is called `writer starvation`. In other words, a writer process can't acquire a lock as long as at least one reader process which acquired a lock holds it. So, in the situation when contention is high, it will lead to situation when a writer process which wants to acquire a lock will wait for it for a long time.
|
||||||
|
|
||||||
@ -321,7 +321,7 @@ static inline void write_sequnlock_irq(seqlock_t *sl)
|
|||||||
|
|
||||||
As we may see, these functions differ only in the initialization of spinlock. They call `spin_lock_irq` and `spin_unlock_irq` instead of `spin_lock` and `spin_unlock`.
|
As we may see, these functions differ only in the initialization of spinlock. They call `spin_lock_irq` and `spin_unlock_irq` instead of `spin_lock` and `spin_unlock`.
|
||||||
|
|
||||||
Or for example `write_seqlock_irqsave` and `write_sequnlock_irqrestore` functions which are the same but used `spin_lock_irqsave` and `spin_unlock_irqsave` macro to use in [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture)) handlers.
|
Or for example `write_seqlock_irqsave` and `write_sequnlock_irqrestore` functions which are the same but used `spin_lock_irqsave` and `spin_unlock_irqsave` macro to use in [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_\(PC_architecture\)) handlers.
|
||||||
|
|
||||||
That's all.
|
That's all.
|
||||||
|
|
||||||
@ -337,7 +337,7 @@ If you have questions or suggestions, feel free to ping me in twitter [0xAX](htt
|
|||||||
Links
|
Links
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
* [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_(computer_science))
|
* [synchronization primitives](https://en.wikipedia.org/wiki/Synchronization_\(computer_science\))
|
||||||
* [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock)
|
* [readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock)
|
||||||
* [spinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html)
|
* [spinlock](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-1.html)
|
||||||
* [critical section](https://en.wikipedia.org/wiki/Critical_section)
|
* [critical section](https://en.wikipedia.org/wiki/Critical_section)
|
||||||
@ -348,5 +348,5 @@ Links
|
|||||||
* [Timers and time management in the Linux kernel](https://0xax.gitbooks.io/linux-insides/content/Timers/)
|
* [Timers and time management in the Linux kernel](https://0xax.gitbooks.io/linux-insides/content/Timers/)
|
||||||
* [interrupt handlers](https://en.wikipedia.org/wiki/Interrupt_handler)
|
* [interrupt handlers](https://en.wikipedia.org/wiki/Interrupt_handler)
|
||||||
* [softirq](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html)
|
* [softirq](https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html)
|
||||||
* [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture))
|
* [IRQ](https://en.wikipedia.org/wiki/Interrupt_request_\(PC_architecture\))
|
||||||
* [Previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html)
|
* [Previous part](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-5.html)
|
||||||
|
@ -394,7 +394,7 @@ That's all. From this point our program will be executed.
|
|||||||
Conclusion
|
Conclusion
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
This is the end of the fourth and last part of the about the system calls concept in the Linux kernel. We saw almost all related stuff to the `system call` concept in these four parts. We started from the understanding of the `system call` concept, we have learned what is it and why do users applications need in this concept. Next we saw how does the Linux handle a system call from a user application. We met two similar concepts to the `system call` concept, they are `vsyscall` and `vDSO` and finally we saw how does Linux kernel run a user program.
|
This is the end of the fourth part of the about the system calls concept in the Linux kernel. We saw almost all related stuff to the `system call` concept in these four parts. We started from the understanding of the `system call` concept, we have learned what is it and why do users applications need in this concept. Next we saw how does the Linux handle a system call from a user application. We met two similar concepts to the `system call` concept, they are `vsyscall` and `vDSO` and finally we saw how does Linux kernel run a user program.
|
||||||
|
|
||||||
If you have questions or suggestions, feel free to ping me in twitter [0xAX](https://twitter.com/0xAX), drop me [email](anotherworldofworld@gmail.com) or just create [issue](https://github.com/0xAX/linux-insides/issues/new).
|
If you have questions or suggestions, feel free to ping me in twitter [0xAX](https://twitter.com/0xAX), drop me [email](anotherworldofworld@gmail.com) or just create [issue](https://github.com/0xAX/linux-insides/issues/new).
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ At the next step we check that a file is not tried to be opened via [fanotify](h
|
|||||||
flags &= ~FMODE_NONOTIFY & ~O_CLOEXEC;
|
flags &= ~FMODE_NONOTIFY & ~O_CLOEXEC;
|
||||||
```
|
```
|
||||||
|
|
||||||
We do this to not leak a [file descriptor](https://en.wikipedia.org/wiki/File_descriptor). By default, the new file descriptor is set to remain open across an `execve` system call, but the `open` system call supports `O_CLOEXEC` flag that can be used to change this default behaviour. So we do this to prevent leaking of a file descriptor when one thread opens a file to set `O_CLOEXEC` flag and in the same time the second process does a [fork](https://en.wikipedia.org/wiki/Fork_(system_call)) + [execve](https://en.wikipedia.org/wiki/Exec_(system_call)) and as you may remember that child will have copies of the parent's set of open file descriptors.
|
We do this to not leak a [file descriptor](https://en.wikipedia.org/wiki/File_descriptor). By default, the new file descriptor is set to remain open across an `execve` system call, but the `open` system call supports `O_CLOEXEC` flag that can be used to change this default behaviour. So we do this to prevent leaking of a file descriptor when one thread opens a file to set `O_CLOEXEC` flag and in the same time the second process does a [fork](https://en.wikipedia.org/wiki/Fork_\(system_call\)) + [execve](https://en.wikipedia.org/wiki/Exec_\(system_call\)) and as you may remember that child will have copies of the parent's set of open file descriptors.
|
||||||
|
|
||||||
At the next step we check that if our flags contains `O_SYNC` flag, we apply `O_DSYNC` flag too:
|
At the next step we check that if our flags contains `O_SYNC` flag, we apply `O_DSYNC` flag too:
|
||||||
|
|
||||||
@ -393,8 +393,8 @@ Links
|
|||||||
* [x86_64](https://en.wikipedia.org/wiki/X86-64)
|
* [x86_64](https://en.wikipedia.org/wiki/X86-64)
|
||||||
* [opendir](http://man7.org/linux/man-pages/man3/opendir.3.html)
|
* [opendir](http://man7.org/linux/man-pages/man3/opendir.3.html)
|
||||||
* [fanotify](http://man7.org/linux/man-pages/man7/fanotify.7.html)
|
* [fanotify](http://man7.org/linux/man-pages/man7/fanotify.7.html)
|
||||||
* [fork](https://en.wikipedia.org/wiki/Fork_(system_call))
|
* [fork](https://en.wikipedia.org/wiki/Fork_\(system_call\))
|
||||||
* [execve](https://en.wikipedia.org/wiki/Exec_(system_call))
|
* [execve](https://en.wikipedia.org/wiki/Exec_\(system_call\))
|
||||||
* [symlink](https://en.wikipedia.org/wiki/Symbolic_link)
|
* [symlink](https://en.wikipedia.org/wiki/Symbolic_link)
|
||||||
* [audit](https://linux.die.net/man/8/auditd)
|
* [audit](https://linux.die.net/man/8/auditd)
|
||||||
* [inode](https://en.wikipedia.org/wiki/Inode)
|
* [inode](https://en.wikipedia.org/wiki/Inode)
|
||||||
|
Loading…
Reference in New Issue
Block a user