Что такое use multi threads

What Is Multithreading: A Guide to Multithreaded Applications

With the availability of GPUs and multi-core CPUs applications are becoming increasingly complex as developers leverage threads for maximum application performance and responsiveness. With this increased complexity comes a higher degree of difficulty when writing code, debugging, testing and managing the applications.

Here we explain what mulithreading is, what threads are, what multithreaded applications are used for and we dive in to TotalView vs GDB and how to debug multithreaded applications.

What is a Thread in Programming?

A thread is an independent unit of execution created within the context of a process (or application that is being executed). When multiple threads are executing in a process at the same time, we get the term “multithreading.” Think of it as the application’s version of multitasking.

What Is Multithreading?

Multithreading is a model of program execution that allows for multiple threads to be created within a process, executing independently but concurrently sharing process resources. Depending on the hardware, threads can run fully parallel if they are distributed to their own CPU core.

What Is Multithreading Used For?

The main reason for incorporating threads into an application is to improve its performance. Performance can be expressed in multiple ways:

Multithreading also leads to minimization and more efficient use of computing resources. Application responsiveness is improved as requests from one thread do not block requests from other threads.

Additionally, multithreading is less resource-intensive than running multiple processes at the same time. There is much more overhead, time consumption, and management involved in creating processes as compared to creating and managing threads.

What Is an Example of Multithreading?

Most of the applications that you use on a daily basis have multiple threads running behind the scenes. Consider your internet browser. At any given time, you may have numerous tabs open, each one displaying various types of content. Multiple threads of execution are used to load content, display animations, play a video, and so on.

Another example of a multithreaded program that we are all familiar with is a word processor. While you are typing, multiple threads are used to display your document, asynchronously check the spelling and grammar of your document, generate a PDF version of the document. These are all happening concurrently, with independent threads performing these tasks internally.

Common Issues in Multithreaded Applications

For all the advantages of using multiple threads, they add complexity and can create tough bugs to solve. There are some common scenarios where you may encounter challenges with debugging multithreaded applications. These include:

See how both TotalView and GDB features handle these scenarios in a demonstration of the differences between the two debugging tools. Read the white paper.

How to Debug a Multithreaded Application

TotalView is designed for applications with hundreds of millions of lines of code and extensive parallelism and concurrency. TotalView’s comprehensive toolkit features capabilities for debugging multithreading in C, C++, and Fortran. TotalView supports debugging a large variety of threading technologies including pthreads, OpenMP, TBB, QThread, and many others, including debugging threads across a GPU.

The real thread debugging power of TotalView comes in its ability to individually control the execution of threads and proliferation of thread-level operations throughout the debugger. Users can set thread-level breakpoints to control the execution all the way down to an individual thread. They can also examine thread-specific data and easily compare the data across threads. With TotalView, developers can quickly gain an understanding of the state of their threads, examine data, and locate bugs in their code. Through debugging a multithreaded program, performance is boosted through improved parallelism, concurrency, and accuracy.

For a tutorial of debugging a multithreaded application with TotalView, the below video shows you how to easily examine and switch between threads, set thread-level breakpoints, and individually step and control threads.

Using TotalView for Debugging a Multithreaded Application

TotalView simplifies the debugging process for complex multithreaded programs. See why TotalView customers rely on our tools for all their debugging needs. Try free by clicking the button below.

Источник

Многопоточность на низком уровне

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Вот репозиторий с примерами из доклада. А под катом — перевод доклада и видео. Далее повествование будет от лица спикера.

У этого доклада две цели:

Микроархитектура

Знаете ли вы, что изображено ниже? Это «Колосс» — первый программируемый электронный компьютер, использовался для дешифровки вражеских сообщений. Особенность этой машины в том, у нее не было памяти: для ввода данных использовалась специальная лента с символами.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Это что-то вроде Intel Core i7 своего времени. Как вы видите, за 70 лет была проделана большая работа.

К чему это все? Обычно предполагают, что байт памяти представлен где-нибудь в ячейке оперативной памяти. Но на самом деле всё иначе: он может быть представлен в нескольких местах одновременно. Например, в шести ядрах, может быть в кэшах L1 и L2, в кэше L3, наконец, может быть в оперативной памяти. Важно упомянуть: в этой архитектуре процессора есть общий кэш L3, и между ними есть Uncore. Этот компонент отвечает за координацию ядер. Также есть QPI, который отвечает за разницу между CPU. Это относится только к мультипроцессорным системам.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Почему нас беспокоит архитектура процессора? По той же причине, по которой нам нужны несколько разных уровней кэшей. У каждого уровня своя задержка. Обращаю внимание на то, что цикл CPU на этой спецификации занимает 0,3 наносекунды и сравнивается с задержкой кэшей L1, L2, L3 и DRAM. Важно заметить, что извлечение конструкции из DRAM требует около 70 циклов процессора. Если вы хотите рассчитать эти значения для своего процессора, то могу посоветовать хороший бенчмарк SiSoft Sandra.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Теперь давайте посмотрим на это более подробно. Для простоты предположим, что здесь у меня есть двухпроцессорная система. У каждого из процессоров есть четыре ядра и L2-кэш, а L1-кэш отсутствует. Также есть L3-кэш и общая оперативная память.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Хорошая аналогия для понимания многопоточных систем — распределенные системы.

Если вы знаете, что такое очередь сообщений (message queue) или шина данных (message bus), вам будет легче понять многопоточность: похожие вещи есть внутри вашего процессора. Там есть очередь сообщений, шина сообщений, буферы — из-за всего этого у нас возникают проблемы с синхронизацией. При взаимодействии ядер информация распределена между L2 и L3-кэшами и памятью. Поскольку шины сообщений асинхронны, порядок обработки данных не гарантирован. Кроме кэширования процессор буферизует данные и может решить оптимизировать операции и отправлять сообщения на шину в другом порядке.

Переупорядочивание памяти

С таким поведением процессора сложно получить последовательное представление о памяти. Для того чтобы лучше разобраться, представим, что у нас есть две простые программы, которые запущены на двух процессорах или двух ядрах. Они делают одно и то же: записывают в память значение объявленной переменной, а затем выгружают из памяти. Как вы думаете, в каком порядке и на каких процессорах будут выполнены эти операции, и какие будут значения этих переменных? Каковы возможные наборы значений? От чего будет зависеть ответ?

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Все зависит от того, на какой машине запущены эти программы. Если вы поищете информацию о том, какие гарантии дают разные архитектуры, найдете похожую таблицу. В этой таблице буква Y (yes) означает, что определенная архитектура не дает никаких гарантий по определенной теме.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Итак, давайте рассмотрим одну архитектуру. Пусть это будет x86 или AMD64, здесь не так много Y. Это означает, что она дает нам много гарантий в разных вопросах. На самом деле, x86 изначально не разрабатывался под многоядерные процессоры, поэтому когда Intel начали добавлять новые ядра, они решили сохранить ту же семантику, что раньше.

По таблице видим, что процессор с этой архитектурой может переупорядочить операции «сохранить» (store), после операций «загрузить» (load). Когда вы хотите сохранить значение, достаточно отправить сообщение. Ждать ответа не обязательно. А когда вы «загружаете» данные, вам нужно отправить запрос и ждать ответа. Для этой операции процессор может применить различные оптимизации.

Теперь посмотрим на колонку ARM. Как видите, эта архитектура дает нам меньше гарантий. Причина очень проста: ARM не нацелена на совместимость с x86. Их целевые платформы были совершенно разные. А еще ARM использует слабую модель памяти, чтобы повысить производительность.

Вернемся к примеру с двумя программами. Напомню, что результат этой программы зависит от того, на каком процессоре он работает. Удивительно, что такие простые программы могут возвращать разные значения на разных машинах.

На Intel x86 вы можете быть уверены, что переменные A и B идут строго последовательно, то есть если удалось загрузить B, то переменная A точно инициализирована. А если всё это выполняется на ARM, то у нас нет никаких гарантий, в каком порядке все это будет выполняться и как процессор проведет оптимизацию.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Барьеры памяти

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Помимо оптимизации процессора, существует ещё оптимизация компилятора и среды выполнения. В контексте данной статьи под компилятором и средой я буду понимать JIT и CLR. Среда может кэшировать значения в регистрах процессора, переупорядочить операции и объединять операции записи (coalesce writes).

Например, для цикла for CLR может решить заранее рассчитать значение и вынести локальную переменную за пределы цикла. Во избежание этого, конечно же, можно использовать ключевое слово volatile, но бывают и более сложные случаи.

Давайте снова вернемся к программе с двумя переменными. Предположим, что эти процессоры выполняют команды «сохранить» A и «загрузить» B. Если между этими двумя командами находится барьер памяти, то процессор сначала отправит запрос «сохранить» B, подождет, пока она не выполнится. Барьеры памяти дают возможность поставить что-то вроде чекпоинта или коммита, как в базе данных.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Есть еще одна причина использовать барьеры памяти. Если вы пишете код на 32-битной машине с использованием long, DateTime или struct, то атомарность выполнения операций может нарушаться. Это значит, что даже когда в коде записана одна инструкция, на самом деле могут произойти две операции вместо одной, причем они могут выполняться в разное время.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Атомарные операции

Interlocked содержит такие операции, как инкрементирование ( Increment ), обмен ( Exchange ) и обмен через сравнение ( CompareExchange ).

Эти операции происходят на уровне кэша L3: есть строки кэша, размер которых составляет 64 байта. Для каждой строки определена структура данных, обеспечивающая блокировку на этом уровне. Если вы работаете с одним процессором, то все эти инструкции будут реализованы с помощью кэша L3, а если у вас многопроцессорная система, то будет происходить обмен сообщениями между различными процессорами.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Не стоит забывать про стоимость выполнения Interlocked-операций. Стоимость инкрементирования в кэше L1 примерно равна удвоенной задержке кэша L1. Вполне быстро! Но стоимость использования Interlocked-инкремента составляет уже целых 5,5 наносекунд, даже если это происходит в единственном потоке. Этот показатель близок к показателю задержки кэша L3. А если у вас два потока обращаются к одной кэш-линии, то стоимость удваивается: ядрам приходится ждать друг друга.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Проанализируем случай, когда двум ядрам приходится ждать друг друга. Для этого используем Intel Vtune Amplifier — профайлер со счетчиками производительности процессора. Он подсчитывает частоту цикла процессора и частоту процессора, нужную для выполнения одной инструкции. На картинке ниже показатель подсвечен красным. Профайлер выдает дополнительную информацию, почему соответствующее значение — это плохо. Если несколько ядер обращаются к одной кэш-линии, то возникнут проблемы с производительностью. Это особенно критично для приложений, которые обрабатывают большое количество транзакций в секунду.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Многозадачность

Если в материале ниже много незнакомых терминов или концепций, попробуйне сначала прочитать «Инструменты для работы с многопоточностью и асинхронностью: части первая и вторая».

И один процессор делает одно и то же, за исключением Hyper-threading, который способен выполнять другие команды.

Для процессора существует только понятие задачи ( Task ). Вместо потоков есть сегмент состояния задачи, который позволяет сменить таск. Состояние процессора означает состояние доступа к регистрам и маппинга памяти.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Весь код (финальная версия):

Класс Node (внутри класса MyConcurrentStack ) хранит значение и содержит ссылку на следующий элемент.

Давайте сначала посмотрим на неблокирующую реализацию стека:

Посмотрим на неблокирующую реализацию стека, здесь мы не используем ключевое слово lock и wait-операции:

Этот способ решения задачи основан на неблокирующей структуре данных. В методе TryPop() мы используем тот же прием:

Берем head и заменяем её следующим узлом, если, конечно, она уже не была изменена.

В время теста MyConcurentStack участвовало два ядра. Одно ядро выполняло операцию Push(), другое — операцию Pop(), ожидание отсутствовало в течение 6 миллионов операций по обмену сообщениями между двумя ядрами.

У этой структуры данных есть два недостатка:

Другая структура данных лишена этих недостатков. Эта структура данных называется «кольцевой буфер». В кольцевом буфере вам не нужно каждый раз выделять память. Есть один большой участок памяти, который перезаписывается при необходимости.

В результате все работает гораздо быстрее: 9 миллионов транзакций в секунду.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Операционная система (ядро Windows)

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Ядро Windows вводит концепции процесса и потока. Процессы — это виртуальное адресное пространство, которое представляет собой конфигурацию контроллера памяти. Однако процессы не являются темой этого доклада, поэтому мы больше сосредоточимся на потоках.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Здесь я хотел бы сделать одно замечание. Наверное, у многих сложилось впечатление, что поток делает какую-либо работу и выполняет задачи, но это не так. Основное предназначение потока — это ожидание.

Давайте докажу это. На этом компьютере у меня четыре ядра с гипертредингом, то есть восемь логических процессоров. Всего в системе 2384 потока.Так как логических процессоров всего 8, то получается, что все 2376 потоков в данный момент ожидают, пока до них дойдет очередь выполнения. В 99,9% случаев основное занятие потоков — это ожидание.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Одна из функций ядра Windows состоит в том, чтобы заставлять потоки ждать. У внутреннего ядра Windows есть граф зависимостей между потоками и объектами-диспетчерами (dispatcher objects) Среди этих объектов могут быть таймеры, объекты, семафоры и события.

В какой-то момент некоторые зависимости исчезают, и соответствующие потоки переходят из состояния ожидания (wait) в состояние готовности (ready). Потоки в состоянии готовности отправляются в очередь ожидания, а после этого они уходят на разные ядра и начинают выполняться.

Затем после ядра поток уходит обратно в очередь ожидания. Причина состоит в том, что закончилось время выполнения потока или была вызвана операция ожидания. Возвращение в очередь ожидания называется «вытесняющей многопоточностью».

Когда вы запускаете поток ожидания, фактически создается зависимость между потоком и объектом диспетчера.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Довольно интересный рассказ о реверс-инжиниринге планировщика Windows можно прочитать в статье «Планировщик Windows? Это очень просто».

Стоимость диспетчеризации уровня ядра

Сами объекты-диспетчеры, а это события, мьютексы, таймеры и семафоры — это объекты ядра. Они разделимы между процессами, и по этой причине считаются дорогими объектами.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Посмотрите на график, посмотрите на стоимость инкрементирования или доступа к кэшу L1, а затем — на стоимость присваивания объекта диспетчера ядра. Две наносекунды и 295 наносекунд — огромная разница! А создание объекта диспетчера вообще занимает 2093 наносекунды.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Структура SpinWait

Представьте, что у вас есть у вас есть два процессора, и на нулевом вы выполняете присваивание A = 1, потом устанавливаете барьер памяти, а затем снова выполняете присваивание B = 1.

На первом процессоре вы получаете А, равное 1, а затем вы ждете, пока B не присвоят значение 1. Казалось бы, такие операции должны быстро выполниться и в кэше L1, и даже в кэше L3. Здесь загвоздка в том, что выполнение нулевым процессором может прерваться из-за вытесняющего прерывания, и между операциями из строк 1 и 3 может пройти несколько миллисекунд. SpinWait способен решать такие проблемы.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Под капотом SpinOnce работает следующим образом:

Без SpinWait цикл мог бы выполняться бесконечно, потому что если нулевой процессор запустится как фоновый поток, то первый процессор заблокирует этот фоновый поток, до тех пор пока поток на первом процессоре не будет прерван.

Монитор и ключевое слово lock

Атрибут [MethodImplAttribute(MethodImplOptions.InternalCall)] означает, что методы реализованы в самом CLR. Алгоритм получения эксклюзивного доступа следующий:

Структуры данных из пространства имен System.Collections.Concurrent

Напоследок хочу немного рассказать о структурах данных, которые используются для обмена информацией между потоками.

Concurrent Stack

В ConcurrentStack вводится понятие производителей и потребителей, которые конкурируют за то, чтобы получить верхушку стека.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Concurrent Queue

В другой структуре данных ConcurrentQueue потребители конкурируют за разные узлы. Это увеличивает пропускную способность в два раза: производители и потребители конкурируют между собой только в своей группе.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Concurrent Bag

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Заключение

Источник

Multithreading in C

What is a Thread?
A thread is a single sequence stream within in a process. Because threads have some of the properties of processes, they are sometimes called lightweight processes.

What are the differences between process and thread?
Threads are not independent of one other like processes as a result threads shares with other threads their code section, data section and OS resources like open files and signals. But, like process, a thread has its own program counter (PC), a register set, and a stack space.

Why Multithreading?
Threads are popular way to improve application through parallelism. For example, in a browser, multiple tabs can be different threads. MS word uses multiple threads, one thread to format the text, other thread to process inputs, etc.
Threads operate faster than processes due to following reasons:
1) Thread creation is much faster.
2) Context switching between threads is much faster.
3) Threads can be terminated easily
4) Communication between threads is faster.

Can we write multithreading programs in C?
Unlike Java, multithreading is not supported by the language standard. POSIX Threads (or Pthreads) is a POSIX standard for threads. Implementation of pthread is available with gcc compiler.

A simple C program to demonstrate use of pthread basic functions
Please note that the below program may compile only with C compilers with pthread library.

In main() we declare a variable called thread_id, which is of type pthread_t, which is an integer used to identify the thread in the system. After declaring thread_id, we call pthread_create() function to create a thread.
pthread_create() takes 4 arguments.
The first argument is a pointer to thread_id which is set by this function.
The second argument specifies attributes. If the value is NULL, then default attributes shall be used.
The third argument is name of function to be executed for the thread to be created.
The fourth argument is used to pass arguments to the function, myThreadFun.
The pthread_join() function for threads is the equivalent of wait() for processes. A call to pthread_join blocks the calling thread until the thread with identifier equal to the first argument terminates.

How to compile above program?
To compile a multithreaded program using gcc, we need to link it with the pthreads library. Following is the command used to compile the program.

A C program to show multiple threads with global and static variables
As mentioned above, all threads share data segment. Global and static variables are stored in data segment. Therefore, they are shared by all threads. The following example program demonstrates the same.

Источник

What is Thread?

A thread is a flow of execution through the process code, with its own program counter that keeps track of which instruction to execute next, system registers which hold its current working variables, and a stack which contains the execution history.

A thread shares with its peer threads few information like code segment, data segment and open files. When one thread alters a code segment memory item, all other threads see that.

A thread is also called a lightweight process. Threads provide a way to improve application performance through parallelism. Threads represent a software approach to improving performance of operating system by reducing the overhead thread is equivalent to a classical process.

Each thread belongs to exactly one process and no thread can exist outside a process. Each thread represents a separate flow of control. Threads have been successfully used in implementing network servers and web server. They also provide a suitable foundation for parallel execution of applications on shared memory multiprocessors. The following figure shows the working of a single-threaded and a multithreaded process.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Difference between Process and Thread

S.N.ProcessThread
1Process is heavy weight or resource intensive.Thread is light weight, taking lesser resources than a process.
2Process switching needs interaction with operating system.Thread switching does not need to interact with operating system.
3In multiple processing environments, each process executes the same code but has its own memory and file resources.All threads can share same set of open files, child processes.
4If one process is blocked, then no other process can execute until the first process is unblocked.While one thread is blocked and waiting, a second thread in the same task can run.
5Multiple processes without using threads use more resources.Multiple threaded processes use fewer resources.
6In multiple processes each process operates independently of the others.One thread can read, write or change another thread’s data.

Advantages of Thread

Types of Thread

Threads are implemented in following two ways −

User Level Threads − User managed threads.

Kernel Level Threads − Operating System managed threads acting on kernel, an operating system core.

User Level Threads

In this case, the thread management kernel is not aware of the existence of threads. The thread library contains code for creating and destroying threads, for passing message and data between threads, for scheduling thread execution and for saving and restoring thread contexts. The application starts with a single thread.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Advantages

Disadvantages

Kernel Level Threads

In this case, thread management is done by the Kernel. There is no thread management code in the application area. Kernel threads are supported directly by the operating system. Any application can be programmed to be multithreaded. All of the threads within an application are supported within a single process.

The Kernel maintains context information for the process as a whole and for individuals threads within the process. Scheduling by the Kernel is done on a thread basis. The Kernel performs thread creation, scheduling and management in Kernel space. Kernel threads are generally slower to create and manage than the user threads.

Advantages

Disadvantages

Multithreading Models

Some operating system provide a combined user level thread and Kernel level thread facility. Solaris is a good example of this combined approach. In a combined system, multiple threads within the same application can run in parallel on multiple processors and a blocking system call need not block the entire process. Multithreading models are three types

Many to Many Model

The many-to-many model multiplexes any number of user threads onto an equal or smaller number of kernel threads.

The following diagram shows the many-to-many threading model where 6 user level threads are multiplexing with 6 kernel level threads. In this model, developers can create as many user threads as necessary and the corresponding Kernel threads can run in parallel on a multiprocessor machine. This model provides the best accuracy on concurrency and when a thread performs a blocking system call, the kernel can schedule another thread for execution.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

Many to One Model

Many-to-one model maps many user level threads to one Kernel-level thread. Thread management is done in user space by the thread library. When thread makes a blocking system call, the entire process will be blocked. Only one thread can access the Kernel at a time, so multiple threads are unable to run in parallel on multiprocessors.

If the user-level thread libraries are implemented in the operating system in such a way that the system does not support them, then the Kernel threads use the many-to-one relationship modes.

Что такое use multi threads. Смотреть фото Что такое use multi threads. Смотреть картинку Что такое use multi threads. Картинка про Что такое use multi threads. Фото Что такое use multi threads

One to One Model

There is one-to-one relationship of user-level thread to the kernel-level thread. This model provides more concurrency than the many-to-one model. It also allows another thread to run when a thread makes a blocking system call. It supports multiple threads to execute in parallel on microprocessors.

Disadvantage of this model is that creating user thread requires the corresponding Kernel thread. OS/2, windows NT and windows 2000 use one to one relationship model.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *