Введение. Что такое Многозадачность и для чего она нужна.
Многозада́чность (англ. multitasking) — свойство операционной системы или среды программирования обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов.
Существует 2 типа многозадачности[1]:
Процессная многозадачность (основанная на процессах - одновременно выполняющихся программах).
Поточная многозадачность (основанная на потоках).
AboutLinux
2.2. Введение в многозадачность Linux
Операционная система Linux является многозадачной. За многозадачность отвечает ядро. Что же представляет собой многозадачность? Мы привыкли под этим термином понимать концепцию одновременного выполнения нескольких программ. Однако такое понимание не является корректным в плане программирования. Во-первых - реально многозадачности не существует. Во-вторых - есть понятие процесс и есть понятие программа, которые нельзя отождествлять.
Итак, многозадачности не существует. Действительно, любой компьютер - это императивная машина, т.е. машина, основанная на последовательном анализе состояния вычислителя и изменении состояния этого вычислителя. Число комбинаций всевозможных состояний в такой системе конечно. Многозадачность, реализованная в операционных системах - это иллюзия, весьма удобная пользователю. Любая многозадачность - это абстракция императивности. То есть, мы думаем, что два процесса выполняются одновременно, а на самом деле они просто поочередно используют процессор для выполнения своих команд. За очередностью использования процессора следит хитрое ядро, которое и создает иллюзию многозадачности.
Чем же программа отличается от процесса? Программа - это нечто, готовое к выполнению, а процесс - это выполняющийся экземпляр программы. Почему экземпляр? Все дело в том, что одну и ту же программу можно запустить, например, два раза. Таким образом получится два процесса, хотя программа одна.
К каждому процессу в Linux привязываются два 16-разрядных числа - идентификатор процесса и идентификатор родителя. Первое число обычно обозначают PID (Process IDentifier), а второе - PPID (Parent Process IDentifier). Каждый процесс имеет свой уникальный PID. А что же такое PPID? Дело в том, что все процессы в Linux имеют иерархическую структуру. То есть одни процессы рождают другие процессы. Пусть процесс 1 породил процесс 2. В таком случае процесс 1 называют родителем или родительским процессом, а процесс 2 - потомком или дочерним процессом. Процесс 2, являющийся дочерним, может стать одновременно и родителем. И есть только один процесс, возвышающийся над всеми процессами и не имеющий родителя - это процесс init с идетрификатором 1 (PID=1). Это процесс запускается при загрузке системы. Программой соответствующей этому процессу является демон init, запускаемый ядром.
Из статьи про Java
Ясное дело, что если ваш компьютер не оснащен несколькими процессорами, то операционная система всего лишь распределяет свои вычислительные ресурсы между разными программами, создавая впечатление их параллельного выполнения.
Такое распределение ресурсов возможно, поскольку компьютер не всегда занят работой, например, при наборе текста, и процессор большую часть времени находится в состоянии бездействия.
К примеру, даже если очень быстро набирать символы на клавиатуре и на ввод одного символа тратить всего 1/20 секунды, то даже это будет огромный интервал для процессора. Ведь современные процессоры могут обрабатывать миллионы запросов в секунду.
Многозадачность может быть реализована двумя способами: или операционная система прерывает выполнение задачи, или управление операционной системе возвращается по усмотрению самой программы, например, после выполнения определенной задачи.
Первый способ называется вытесняющей многозадачностью (preemptive multitasking), а второй - кооперативной (или невытесняющей) многозадачностью (cooperative multitasking).
Кооперативная многозадачность применяется в ранних версия Windows и Mac OS 9, а вытесняющая - в UNIX, Linux, Windows NT/2000/XP и Mac OS X.
Вытесняющая многозадачность работает гораздо эффективнее кооперативной, но ее сложнее реализовать. Даже более того, некорректно написанная программа в режиме кооперативной многозадачности способна поглотить все вычислительные ресурсы системы.
Многопоточные программы развивают идею многозадачности на более низком уровне: отдельные программы способны выполнять одновременно несколько задач. Каждая задача обычно сокращенно называется потоком (thread) или полностью - потоком управления (thread of control).
Программы, способные запускать более одного потока, называются многопоточными (multithreaded). Каждый поток выполняется в отдельном контексте, т.е. создается видимость того, что каждый поток имеет собственный процессор с регистрами, памятью и своим кодом.
В чем же заключается разница между несколькими процессами и несколькими потоками? Существенное различие состоит в том, что каждый процесс имеет набор собственных переменных, тогда как потоки обращаются к одним и тем же данным.
С технической точки зрения гораздо проще создавать и уничтожать отдельные потоки, чем запускать новые процессы. Именно по этой причине все современные операционные системы поддерживают многопоточноть. Более того, процессы взаимодействуют гораздо медленнее и с большими ограничениями, чем потоки.
Многопоточность имеет очень большое практическое значение. К примеру, браузер должен обладать возможностью одновременной загрузки нескольких файлов, а почтовая программа должна позволять читать старые сообщения во время получения новых.
Одним из преимуществ языка программирования Java является то, что в нем используется специальный поток для сбора мусора в фоновом режиме, который избавляет программистов от необходимости управлять памятью.
Программы с графическим пользовательским интерфейсом используют отдельный поток для сбора интерфейсных событий в среде операционной системы.
Во многих языках программирования для использования инструментов многопоточности необходимо загружать внешние пакеты. В языке Java все средства, необходимые для многопоточного программирования, являются встроенными, что значительно облегчает решение таких задач.
История
В 1987 году в результате совместных усилий Microsoft и IBM появилась первая многозадачная система для персональных компьютеров с процессором Intel 80286, в полной мере использующая возможности защищённого режима - OS/2. Эта система была хорошо продуманна. Она поддерживала вытесняющую многозадачность, виртуальную память, графический пользовательский интерфейс (не с первой версии) и виртуальную машину для выполнения DOS- приложений. Фактически она выходила за пределы простой многозадачности с её концепцией распараллеливания отдельных процессов, получившей название многопоточности.
OS/2 с её развитыми функциями многозадачности и файловой системой HPFS со встроенными средствами многопользовательской защиты оказалась хорошей платформой для построения локальных сетей персональных компьютеров. Наибольшее распространение получили сетевые оболочки LAN Manager компании Microsoft и LAN Server компании IBM, разработанные этими компаниями на основе одного базового кода. Эти оболочки уступали по производительности файловому серверу NetWare и потребляли больше аппаратных ресурсов, но имели важные достоинства – они позволяли, во-первых, выполнять на сервере любые программы, разработанные для OS/2, MS-DOS и Windows, а во-вторых, использовать компьютер, на котором они работали, в качестве рабочей станции.
HT
Многоядерные процессоры: теория (на примере Intel и AMD)
Сейчас 2-х ядерным процессором уже никого не удивишь. Другое дело, что е у каждого в компьютере стоит такой процессор. Кому-то не позволяют финансы, а кому-то устойчивые слухи, что многоядерные процессоры это очередная туфта, вроде SLI, предназначенная для вытягивания денежки из карманов пользователей.
В принципе так и есть - тактовую частоту процессоров стало наращивать все труднее и труднее,(растет число транзисторов, проводников и выделяемое тепло) и, стало быть, надо искать что-то на смену "гонки за мегагерцами". А добавляя ядра, производительность в ряде современных приложений уже можно заметно поднять, не повышая частоты. Да и пресловутый закон Мура (удвоение числа транзисторов на кристаллах) надо бы чем-то поддержать, а многоядерность - чуть ли не самый простой путь для этого…
Однозначно одно, (хотя бы судя по опросу который я проводил) никто бы не отказался от C2D(особенно бесплатно).
Давайте посмотрим как борются две технологии - две компании, ну и разберемся нужен ли дома многоядерник? Надеюсь моя статья поможет определится тем, кто в ближайшее время планирует апгрейд, и тем кто уже купил много ядерный процессор - разобраться как это работает.
*любителям картинок здесь будет скучно
Часть 1. Немного истории и терминов.
Очевидно, что "ноги" у многоядерных процессоров растут из многопроцессорных систем. А вариантов создания многопроцессорных систем - неисчислимое множество: даже простое перечисление всего созданного заняло бы слишком много места. Однако существует их общепринятая классификация по доступу к памяти:
1. SMP-системы (Symmetrical Multi Processor systems). В подобной системе все процессоры имеют совершенно равноправный доступ к общей оперативной памяти. Работать с такими системами программистам - сущее удовольствие (если, конечно, создание многопоточного кода можно назвать "удовольствием"), поскольку не возникает никаких специфичных "особенностей", связанных с архитектурой компьютера. Но, к сожалению, создавать подобные системы крайне трудно: 2-4 процессора - практический предел для стоящих разумные деньги SMP-систем. Конечно, за пару сотен тысяч долларов можно купить системы и с большим числом процессоров… но при цене в несколько миллионов (!) долларов за SMP с 32-мя CPU становится экономически более целесообразно использовать менее дорогостоящие архитектуры.