реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> POSIX pthread_* в Linux, когда появилось и как реализовано?
Johny
сообщение Nov 5 2006, 19:04
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792



В большинстве книг по Linux не упоминается Posix thread library - вызовы с префиксом pthread_ (типа pthread_create()). Однако я встречал упоминание, что в последних версиях Linux это реализовано. Начиная с какой версии? Это отдельная библиотека, или набор системных вызовов? В каком хедере описаны?
Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях?
Go to the top of the page
 
+Quote Post
Harbour
сообщение Nov 6 2006, 06:30
Сообщение #2


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



появилось в 1996 (имплементация Xavier Leroy), начиная с версии ядра 1.2.x и libc 4.x, инклюд <pthreads.h>. Это и набор системных вызовов (clone) и несколько юзер-спейс реализаций (linuxthreads/posixthreads/nptl/etc). Многопоточность имеет смысл для масштабирования, то бишь в многопроцессорных системах, к которым uclinux, насколько мне известно, не относится. При вопросах портирования можно выкрутиться юзер-спейс реализацией.
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Nov 6 2006, 06:43
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



Цитата(Johny @ Nov 5 2006, 22:04) *
Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях?


eCos - многопоточный, но не многопроцессный - threads - родные, есть posix-надстройка.
QNX - и процессы, и потоки, posix.
Что в более мелких - сейчас не помню.


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
Johny
сообщение Nov 7 2006, 17:35
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792



Цитата(Harbour @ Nov 6 2006, 09:30) *
появилось в 1996 (имплементация Xavier Leroy), начиная с версии ядра 1.2.x и libc 4.x, инклюд <pthreads.h>. Это и набор системных вызовов (clone) и несколько юзер-спейс реализаций (linuxthreads/posixthreads/nptl/etc). Многопоточность имеет смысл для масштабирования, то бишь в многопроцессорных системах, к которым uclinux, насколько мне известно, не относится. При вопросах портирования можно выкрутиться юзер-спейс реализацией.


Спасибо.
В ядре 2.6 ничего в этом плане не поменялось?
У меня сейчас 2.4.17 и glibc-2.3.1 для arm. Нашел реализацию pthread. Система однопроцессорная, в принципе, наверное без разницы, как реализовано, лишь бы работало нормально. Просто использование потоков мне кажется более удобным, чем создание кучи процессов, а затем разделяемой памяти для них - в рамках одного модуля приложения.
Go to the top of the page
 
+Quote Post
Harbour
сообщение Nov 8 2006, 06:47
Сообщение #5


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



В ядре 2.6 появился TLS и соответствующая поддержка в NPTL, последние версии libc (>= 2.4) уже старую схему не поддерживают. Новая схема работает быстрее, в некоторых тестах (pthread_exitfor ex.) до 1000 раз. Насчет целесообразности - это дело вкуса, если прога не планируется к переносу/запуску на MP системах, то смысла мутить на тредах не вижу. Кстати в свете новых веяний треды (openmp) как парадигма параллельного программирования уже устарели.
Go to the top of the page
 
+Quote Post
KirillS
сообщение Nov 10 2006, 16:02
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 44
Регистрация: 10-10-06
Пользователь №: 21 161



Цитата(Johny @ Nov 7 2006, 19:35) *
Цитата(Harbour @ Nov 6 2006, 09:30) *

появилось в 1996 (имплементация Xavier Leroy), начиная с версии ядра 1.2.x и libc 4.x, инклюд <pthreads.h>. Это и набор системных вызовов (clone) и несколько юзер-спейс реализаций (linuxthreads/posixthreads/nptl/etc). Многопоточность имеет смысл для масштабирования, то бишь в многопроцессорных системах, к которым uclinux, насколько мне известно, не относится. При вопросах портирования можно выкрутиться юзер-спейс реализацией.


Спасибо.
В ядре 2.6 ничего в этом плане не поменялось?
У меня сейчас 2.4.17 и glibc-2.3.1 для arm. Нашел реализацию pthread. Система однопроцессорная, в принципе, наверное без разницы, как реализовано, лишь бы работало нормально. Просто использование потоков мне кажется более удобным, чем создание кучи процессов, а затем разделяемой памяти для них - в рамках одного модуля приложения.


Я работаю с threads в uClinux 2.4.17 (MicroBlaze). Если создаётся небольшое число threads, то никаких проблем не возникает, но есть проблемы с числом threads ~> 10 (например таких)


--------------------
Some days you eat the bear. Some days the bear eats you.
Go to the top of the page
 
+Quote Post
Playnet
сообщение Jan 18 2007, 16:20
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 132
Регистрация: 10-05-06
Пользователь №: 16 930



Цитата(Harbour @ Nov 8 2006, 06:47) *
Кстати в свете новых веяний треды (openmp) как парадигма параллельного программирования уже устарели.

А что сейчас с веяниями? Как параллельные проги "правильнее" делать?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 18 2007, 18:02
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Процессы и потоки выдумка Linux-а.
Там процессы настолько медленно переключаются, что пришлось придумать потоки.
В без MMU-ушных процах в RTOS процесы и потоки это одно и тоже и называются обычно задачами.

Цитата(v_shamaev @ Nov 6 2006, 08:13) *
Цитата(Johny @ Nov 5 2006, 22:04) *

Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях?


eCos - многопоточный, но не многопроцессный - threads - родные, есть posix-надстройка.
QNX - и процессы, и потоки, posix.
Что в более мелких - сейчас не помню.
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Jan 18 2007, 20:24
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



Цитата(AlexandrY @ Jan 18 2007, 18:02) *
Процессы и потоки выдумка Linux-а.
Там процессы настолько медленно переключаются, что пришлось придумать потоки.
В без MMU-ушных процах в RTOS процесы и потоки это одно и тоже и называются обычно задачами.


Процессы - это еще ранние UNIX-ы, а может и раньше, не знаю. А потоки - тоже в UNIX- и в OS/2 еще в первой. А тогда еще Линуксов не было.


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
nazim
сообщение Jan 18 2007, 23:53
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 9-01-06
Из: Баку, Азербайджан
Пользователь №: 12 978



Цитата
В большинстве книг по Linux не упоминается Posix thread library - вызовы с префиксом pthread_

Книги скорее всего старые, в новых изданиях описываются вызовы POSIX threads (pthread_)
Пример: advancedlinuxprogramming.com

Цитата
Однако я встречал упоминание, что в последних версиях Linux это реализовано. Начиная с какой версии?

Можно сказать во всех с ядром 2.6 и glibc >= 2.3.x, Насчет старых дистров с ядром 2.4 , не могу сказать точно, если есть, то бэкпортированно из 2.6 (у RHEL в особенности).

Цитата
Это отдельная библиотека, или набор системных вызовов? В каком хедере описаны?
Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях?

POSIX Threads в линуксе "работают" в ядре, интерфейс пользователя в библиотеке libpthread, хэдэр <pthread.h>, линкуется соответственно через -lpthread. Всё описано в документации glibc.

Насчет uCLinux & co, Вам ничего сказать не могу, к сожалению никогда их не использовал sad.gif
Go to the top of the page
 
+Quote Post
sff
сообщение Jan 19 2007, 01:11
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404



Цитата(nazim @ Jan 18 2007, 23:53) *
Можно сказать во всех с ядром 2.6 и glibc >= 2.3.x, Насчет старых дистров с ядром 2.4 , не могу сказать точно, если есть, то бэкпортированно из 2.6 (у RHEL в особенности).

Цитата

Это отдельная библиотека, или набор системных вызовов? В каком хедере описаны?
Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях?

POSIX Threads в линуксе "работают" в ядре, интерфейс пользователя в библиотеке libpthread, хэдэр <pthread.h>, линкуется соответственно через -lpthread. Всё описано в документации glibc.

Насчет uCLinux & co, Вам ничего сказать не могу, к сожалению никогда их не использовал sad.gif


А точнее так: в ядре 2.4 были только процессы и все потоки с точки зрения ядра предствлялись процессами (только имели общую разделяемую память) с разными PID ами что можно было видеть соответствующими утилитами.
В 2.6 появилось native thread тоесть поток как сущность на уровне ядра. Соотвественно создание потока стало менее ресурсоемким.

Патч обеспечивающмй native thread в ядре существует, боюсь наврать, но он вроде не бэкпортированно из 2.6, а развивался сам по себе и в 2.6 просто его включили окончательно.
Go to the top of the page
 
+Quote Post
Harbour
сообщение Jan 19 2007, 10:03
Сообщение #12


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



Цитата(AlexandrY @ Jan 18 2007, 17:02) *
Процессы и потоки выдумка Linux-а.
Там процессы настолько медленно переключаются, что пришлось придумать потоки.
В без MMU-ушных процах в RTOS процесы и потоки это одно и тоже и называются обычно задачами.

Цитата(v_shamaev @ Nov 6 2006, 08:13) *

Цитата(Johny @ Nov 5 2006, 22:04) *

Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях?


eCos - многопоточный, но не многопроцессный - threads - родные, есть posix-надстройка.
QNX - и процессы, и потоки, posix.
Что в более мелких - сейчас не помню.



Процессы, как уже было замечено, это "выдумка" многозадачных систем, первыми из которых были Unix подобные где-то эдак в 60x годах wink.gif В Linux'е же впервые были реализованы так называемые light треды, которые имели общее с родителем адресное пространство но раздельные политики счедулинга.

Цитата(Playnet @ Jan 18 2007, 15:20) *
Цитата(Harbour @ Nov 8 2006, 06:47) *

Кстати в свете новых веяний треды (openmp) как парадигма параллельного программирования уже устарели.

А что сейчас с веяниями? Как параллельные проги "правильнее" делать?

Для интересующихся - http://gcc.gnu.org/projects/gomp/
Go to the top of the page
 
+Quote Post
makc
сообщение Jan 19 2007, 10:23
Сообщение #13


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(sff @ Jan 19 2007, 01:11) *
А точнее так: в ядре 2.4 были только процессы и все потоки с точки зрения ядра предствлялись процессами (только имели общую разделяемую память) с разными PID ами что можно было видеть соответствующими утилитами.
В 2.6 появилось native thread тоесть поток как сущность на уровне ядра. Соотвественно создание потока стало менее ресурсоемким.

Патч обеспечивающмй native thread в ядре существует, боюсь наврать, но он вроде не бэкпортированно из 2.6, а развивался сам по себе и в 2.6 просто его включили окончательно.


Не совсем так. Цитирую Linux Kernel Development Second Edition By Robert Love:

Цитата
Threads are a popular modern programming abstraction. They provide multiple threads of execution within the same program in a shared memory address space. They can also share open files and other resources. Threads allow for concurrent programming and, on multiple processor systems, true parallelism.

Linux has a unique implementation of threads. To the Linux kernel, there is no concept of a thread. Linux implements all threads as standard processes. The Linux kernel does not provide any special scheduling semantics or data structures to represent threads. Instead, a thread is merely a process that shares certain resources with other processes. Each thread has a unique task_struct and appears to the kernel as a normal process (which just happens to share resources, such as an address space, with other processes).

This approach to threads contrasts greatly with operating systems such as Microsoft Windows or Sun Solaris, which have explicit kernel support for threads (and sometimes call threads lightweight processes). The name "lightweight process" sums up the difference in philosophies between Linux and other systems. To these other operating systems, threads are an abstraction to provide a lighter, quicker execution unit than the heavy process. To Linux, threads are simply a manner of sharing resources between processes (which are already quite lightweight)[11]. For example, assume you have a process that consists of four threads. On systems with explicit thread support, there might exist one process descriptor that in turn points to the four different threads. The process descriptor describes the shared resources, such as an address space or open files. The threads then describe the resources they alone possess. Conversely, in Linux, there are simply four processes and thus four normal task_struct structures. The four processes are set up to share certain resources.

[11] As an example, benchmark process creation time in Linux versus process (or even thread!) creation time in these other operating systems. The results are quite nice.

Threads are created like normal tasks, with the exception that the clone() system call is passed flags corresponding to specific resources to be shared:

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);

The previous code results in behavior identical to a normal fork(), except that the address space, filesystem resources, file descriptors, and signal handlers are shared. In other words, the new task and its parent are what are popularly called threads.


В книге речь идет о ядре 2.6


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
sff
сообщение Jan 19 2007, 11:28
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404



2 makc Извеняюсь, что наврал..
хоть и появились ktread_* в <linux/kthread.h>, но, действительно, kthead_create возвращает task_struct..
Go to the top of the page
 
+Quote Post
makc
сообщение Jan 19 2007, 12:00
Сообщение #15


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(sff @ Jan 19 2007, 11:28) *
2 makc Извеняюсь, что наврал..
хоть и появились ktread_* в <linux/kthread.h>, но, действительно, kthead_create возвращает task_struct..


Думаю, что всем будет полезна эта книга в электронном варианте.
Забрать ее можно здесь - http://nukeuploads.com/download/1169196826...LKD2Ed.rar.html


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 07:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016