|
|
  |
POSIX pthread_* в Linux, когда появилось и как реализовано? |
|
|
|
Nov 6 2006, 06:43
|

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

|
Цитата(Johny @ Nov 5 2006, 22:04)  Как обстоят дела с многопоточностью в других uCLinux и других embedded ОСях? eCos - многопоточный, но не многопроцессный - threads - родные, есть posix-надстройка. QNX - и процессы, и потоки, posix. Что в более мелких - сейчас не помню.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Nov 7 2006, 17:35
|
Частый гость
 
Группа: Свой
Сообщений: 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. Система однопроцессорная, в принципе, наверное без разницы, как реализовано, лишь бы работало нормально. Просто использование потоков мне кажется более удобным, чем создание кучи процессов, а затем разделяемой памяти для них - в рамках одного модуля приложения.
|
|
|
|
|
Nov 10 2006, 16:02
|
Участник

Группа: Новичок
Сообщений: 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.
|
|
|
|
|
Jan 18 2007, 16:20
|
Частый гость
 
Группа: Свой
Сообщений: 132
Регистрация: 10-05-06
Пользователь №: 16 930

|
Цитата(Harbour @ Nov 8 2006, 06:47)  Кстати в свете новых веяний треды (openmp) как парадигма параллельного программирования уже устарели. А что сейчас с веяниями? Как параллельные проги "правильнее" делать?
|
|
|
|
|
Jan 18 2007, 18:02
|

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. Что в более мелких - сейчас не помню.
|
|
|
|
|
Jan 18 2007, 20:24
|

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

|
Цитата(AlexandrY @ Jan 18 2007, 18:02)  Процессы и потоки выдумка Linux-а. Там процессы настолько медленно переключаются, что пришлось придумать потоки. В без MMU-ушных процах в RTOS процесы и потоки это одно и тоже и называются обычно задачами. Процессы - это еще ранние UNIX-ы, а может и раньше, не знаю. А потоки - тоже в UNIX- и в OS/2 еще в первой. А тогда еще Линуксов не было.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Jan 18 2007, 23:53
|

Участник

Группа: Участник
Сообщений: 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, Вам ничего сказать не могу, к сожалению никогда их не использовал
|
|
|
|
|
Jan 19 2007, 01: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, Вам ничего сказать не могу, к сожалению никогда их не использовал  А точнее так: в ядре 2.4 были только процессы и все потоки с точки зрения ядра предствлялись процессами (только имели общую разделяемую память) с разными PID ами что можно было видеть соответствующими утилитами. В 2.6 появилось native thread тоесть поток как сущность на уровне ядра. Соотвественно создание потока стало менее ресурсоемким. Патч обеспечивающмй native thread в ядре существует, боюсь наврать, но он вроде не бэкпортированно из 2.6, а развивался сам по себе и в 2.6 просто его включили окончательно.
|
|
|
|
|
Jan 19 2007, 10:03
|

Местами Гуру
    
Группа: 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 годах  В Linux'е же впервые были реализованы так называемые light треды, которые имели общее с родителем адресное пространство но раздельные политики счедулинга. Цитата(Playnet @ Jan 18 2007, 15:20)  Цитата(Harbour @ Nov 8 2006, 06:47)  Кстати в свете новых веяний треды (openmp) как парадигма параллельного программирования уже устарели.
А что сейчас с веяниями? Как параллельные проги "правильнее" делать? Для интересующихся - http://gcc.gnu.org/projects/gomp/
|
|
|
|
|
Jan 19 2007, 10:23
|

Гуру
     
Группа: Админы
Сообщений: 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 В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jan 19 2007, 12:00
|

Гуру
     
Группа: Админы
Сообщений: 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 В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|