Когда дело доходит до Linux, процессы и потоки по сути одно и то же. То есть они создаются с помощью одного и того же системного вызова: clone
.
Если подумать, разница между потоками и процессами заключается в том, какие объекты ядра будут совместно использоваться дочерним и родительским. Для процессов это немного: открытые файловые дескрипторы, сегменты памяти, в которые не производилась запись, возможно, несколько других вещей, которые я не могу придумать навскидку. Для потоков используется гораздо больше объектов, но не все.
Что сближает потоки и объекты в Linux, так это системный вызов unshare
. Объекты ядра, которые изначально являются общими, могут быть отменены после создания потока. Таким образом, вы можете, например, иметь два потока одного и того же процесса, которые имеют разное пространство файловых дескрипторов (отменив совместное использование файловых дескрипторов после создания потоков). Вы можете проверить это самостоятельно, создав поток, вызвав unshare
в обоих потоках, а затем закрыв все файлы и открыв новые файлы, каналы или объекты в обоих потоках. Затем загляните в /proc/your_proc_fd/task/*/fd
и вы увидите, что каждая задача
(которую вы создали как поток) будет иметь разные fd.
На самом деле, как создание новых потоков, так и новых процессов являются библиотечными подпрограммами, которые вызывают clone
и указывают, какой из объектов ядра является вновь созданным процессом-потоком-штукой amajig (т.е. task
) будет использоваться совместно с вызывающим процессом/потоком.