Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Дальше идет что-то неопределенное, в лекциях трудно разобраться в порядке.



27)Почему надо делать привязку к ядру процессора?

КН Потому что у ядра есть кэш память и если раздельные потоки, то о ней можно забыть.

28) Для чего приложения создают с несколькими потоками?

КН Скорость переключения

29) Когда мы используем программу в различных процессах?

Процесс не является программой, но процесс и поток очень походи в linux.

Процесс – вспомогательная программа, адресное пространство, набор ресурсов

КН Если запускаем программу несколько раз.

30) Чем отличаюстя поток, процесс, программа и задача(нити) на уровне ядра linux?

! Реализацию выполнения программного кода называют процессом (process) – абстрактное понятие в системах POSIX

! Поток выполнения – объект, выполняющий операции внутри процесса:

– Счётчик команд (program counter)

– Стек выполнения

– Набор регистров процессора

! Поток в Linux:

– Процесс, использующий ресурсы (АП) совместно с другими процессами

– Имеет структуру task_struct

– Представляется для ядра обычным процессом

! Каждый процесс предусматривает наличие двух виртуальных ресурсов

– Виртуальный процессор

• Создаёт для процесса иллюзию монопольного использования всей вычислительной системы (ВС)

• Физическим процессором совместно пользуются десятки процессов

• Эта виртуализация и помещение процессов на физический процессор называется планированием процессов

– Виртуальная память

• Создаёт для процесса иллюзию что процесс один располагает всей памятью ВС

! Потоки одного процесса:

– Совместно используют одну и ту же виртуальную память (адресное пространство)

– Каждый получает свой виртуальный процессор

! Процесс, содержащий несколько потоков, называется многопоточным (многопоточной программой, ну кто бы, сука, мог подумать? )

• В Linux уникальная реализация потоков – это специальный тип процессов.

! Программа не является процессом

– Процесс – выполняющаяся программа +набор ресурсов + адресное пространство (АО)

– Несколько процессов могут выполнять одну и ту же программу

– Несколько процессов могут использовать одни и те же ресурсы (файлы, АО)

! Понятие задача и процесс взаимозаменяемы

– Процессы в ядре называют задачами (tasks)(представление работающей программы в ядре)

– Представление работающей программы в режиме пользователя – процесс

! Процессы в системе

Рассказ о жизни процессов естественно начать с самого начала — с их появления на свет. Так вот, процессы размножаются... почкованием: системный вызов Linux, создающий новый процесс, называется clone, а дочерний процесс представляет собой почти точную копию родительского. Только далее он выполняет назначенную ему функцию, а исходный процесс — то, что написано в программе после вызова clone.

Нить и задача

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

Помимо процессов описанного выше вида бывают еще «ущербные», порождаемые с помощью функции kernel_thread для внутренних системных нужд. У них нет параметров командной строки, как правило, они не имеют открытых файлов и т. д. Поскольку, несмотря на свою ущербность, эти процессы все равно фигурируют в списке задач, в литературе иногда различают полноценные процессы, порожденные из «пространства пользователя» (userspace), и задачи, т. е. все процессы, включая внутренние процессы ядра.

Процесс и программа

Процессы, выполняющие разные программы, образуются благодаря применению имеющихся в стандартной библиотеке Unix функций «семейства exec»: execl, execlp, execle, execv, execve, execvp. Эти функции отличаются форматом вызова, но в конечном итоге делают одну и ту же вещь: замещают внутри текущего процесса исполняемый код на код, содержащийся в указанном файле.

Таким образом, операция запуска программы, которая в DOS и Windows выполняется как единое целое, в Linux (и в Unix вообще) разделена на две: сначала производится запуск, а потом определяется, какая программа будет работать.

31) Больший номер – позже запущен – почему это важно

! Однако, для обратной совместимости со старыми версиями ОС Unix и Linux мак симальное значение этого параметра по умолчанию составляет всего лишь (что соответствует типу данных short int). Ядро хранит значение данного параметра в поле pid дескриптора процесса.

 

Это максимальное значение является важным, потому что оно определяет мак симальное количество процессов, которые одновременно могут существовать в си стеме. Хотя значения 32768 и достаточно для офисного компьютера, для больших серверов может потребоваться значительно больше процессов. Чем меньше это зна чение, тем скорее нумерация процессов будет начинаться сначала, что приводит к нарушению полезного свойства: больший номер процесса соответствует процессу, который запустился позже. Если есть желание нарушить в системе обратную совместимость со старыми приложениями, то администратор может увеличить это макси мальное значение во время работы системы с помощью записи его в файл /ргос/ sys/kernel/pid_max.

Да, это не ответ на вопрос, ну и что.

32)Зачем тратить регистр на хранение описателяя. Процесса?

! Ну какой мудак так формирует вопрос, тут же непонятно о чем спрашивают – зачем тратить именно регистр, а не что-то другое, может зачем нужно хранить описатель, нужно ли его именно хранить? Затем, чтобы знать все о процессе:

Содержит всю информацию об определённом процессе и данные, которые описывают выполняемую программу:

• Открытые файлы

• Адресное пространство

• Ожидающие обработку сигналы

• Состояние процесса

• Многое другое

Обычно в ядре на задачи ссылаются через указатель на описатель процесса.

КН – Для ускорения процесса.

33)Зачем создание процесса разбивать на два системных вызова?

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

! Процессы, выполняющие разные программы, образуются благодаря применению имеющихся в стандартной библиотеке Unix функций «семейства exec»: execl, execlp, execle, execv, execve, execvp. Эти функции отличаются форматом вызова, но в конечном итоге делают одну и ту же вещь: замещают внутри текущего процесса исполняемый код на код, содержащийся в указанном файле.

Таким образом, операция запуска программы, которая в DOS и Windows выполняется как единое целое, в Linux (и в Unix вообще) разделена на две: сначала производится запуск, а потом определяется, какая программа будет работать. Есть ли в этом смысл и не слишком ли велики накладные расходы? Ведь создание копии процесса предполагает копирование весьма значительного объема информации.

Смысл в данном подходе определенно есть. Очень часто программа должна совершить некоторые действия еще до того, как начнется собственно ее выполнение. Скажем, в разбиравшемся выше примере мы запускали две программы, передающие друг другу данные через неименованный канал. Такие каналы создаются системным вызовом pipe; он возвращает пару файловых дескрипторов, с которыми в нашем случае оказались связаны стандартный поток ввода (stdin) программы wc и стандартный поток вывода (stdout) программы dd. Стандартный вывод wc (как, кстати, и стандартный ввод dd, хотя он никак не использовался) связывался с терминалом, а кроме того, требовалось, чтобы командный интерпретатор после выполнения команды не потерял связь с терминалом. Как удалось этого добиться? Да очень просто: сначала были отпочкованы процессы, затем проделаны необходимые манипуляции с дескрипторами файлов и только после этого вызван exe.

34)Что для системы дает копирование при записи? (см. вопрос 36)

35) Почему важно запускать порождаемый поток раньше родительского?

КН – Это связано с копированием при записи. Это важно, т к при этом учитывается, что данные используются процессором совместно

! Если возврат из функции copy_process() происходит успешно, то новый порожденный процесс возобновляет выполнение. Порожденный процесс намеренно запускается на выполнение раньше родительского.

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

36) Что дает системе COW?

! Вероятно молоко.

В Linux – механизм копирования при записи (copyon-write, COW)

– Откладывает или вообще предотвращает копирование

– Вместо создания дубликата АП оба процесса могут использовать одну копию АП (м. б. > 10 Мб)

– При изменении данных создаётся копия

– Если никогда не делается запись (exec() сразу после fork()), то копирование не проводится вовсе

– fork() требует только:

• Копирование таблиц страниц

• Создание описателя процесса

!! Механизм копирования при записи (англ. Copy-On-Write, COW) используется для оптимизации многих процессов, происходящих в операционной системе, таких как, например, работа с памятью или файлами на диске (пример — ext3cow).

Главная идея copy-on-write — при копировании областей данных создавать реальную копию только когда ОС обращается к этим данным с целью записи.

Например, при работе UNIX-функции fork() вместо копирования выполняется отображение образа памяти материнского процесса в адресное пространство дочернего процесса, после чего ОС запрещает обоим процессам запись в эту память. Попытка записи в отображённые страницы вызывает исключение (exception), после которого часть данных будет скопирована в новую область.

37)Какие ОП пометки/какие данные процесса после завершения процесса?

КН - Счетчик обнуляется, Остается: продолжает опис процессором структуры

Task_struct(находится в стеке на уровне ядра) thread_info – освоб. С пом. Родителей

38)Если род процесс завершился до завершения дочернего?

! сли родительский процесс по какой-то причине завершится раньше дочернего, последний становится " сиротой" (orphaned process). " Сироты" автоматически " усыновляются" программой init, выполняющейся в процессе с номером 1, которая и принимает сигнал об их завершении.

39)Зачем при завершении обходить список порожденных процессов, находивш в состояии трассировки?

40)Антон, есть еще что нибудь интересное?

При вызове fork() возникают два полностью идентичных процесса. Весь код после fork() выполняется дважды, как в процессе-потомке, так и в процессе-родителе.

Процесс-потомок и процесс-родитель получают разные коды возврата после вызова fork(). Процесс-родитель получает идентификатор (PID) потомка. Если это значение будет отрицательным, следовательно при порождении процесса произошла ошибка. Процесс-потомок получает в качестве кода возврата значение 0, если вызов fork() оказался успешным.

! Потомок наследует от родителя все кроме следующих признаков:

  • идентификатора процесса (PID, PPID);
  • израсходованного времени ЦП (оно обнуляется);
  • сигналов процесса-родителя, требующих ответа;
  • блокированных файлов (record locking).

Наследует:

  • сегменты кода, данных и стека программы;
  • таблицу файлов, в которой находятся состояния флагов дескрипторов файла, указывающие, читается ли файл или пишется. Кроме того, в таблице файлов содержится текущая позиция указателя записи-чтения;
  • рабочий и корневой каталоги;
  • реальный и эффективный номер пользователя и номер группы;
  • приоритеты процесса (администратор может изменить их через nice);
  • контрольный терминал;
  • маску сигналов;
  • ограничения по ресурсам;
  • сведения о среде выполнения;
  • разделяемые сегменты памяти.

Когда потомок вызывает exit(), код возврата передается родителю, который ожидает его, вызывая wait(). WEXITSTATUS() представляет собой макрос, который получает фактический код возврата потомка из вызова wait().

Функция wait() ждет завершения первого из всех возможных потомков родительского процесса. Иногда необходимо точно определить, какой из потомков должен завершиться. Для этого используется вызов waitpid() с соответствующим PID потомка в качестве аргумента. Еще один момент, на который следует обратить внимание при анализе примера, это то, что и родитель, и потомок используют переменную rv. Это не означает, что переменная разделена между процессами. Каждый процесс содержит собственные копии всех переменных.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-03-25; Просмотров: 939; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.025 с.)
Главная | Случайная страница | Обратная связь