
- •Оглавление
- •1 Создание и конфигурирование системы в среде Oracle Virtual Box
- •2 Изучение процессов и потоков в Linux
- •2.4 Контрольные вопросы
- •3 Изучение возможности командной оболочки и способы применения основных команд и утилит ос Windows
- •3.3.5. Изучение команды Copy
- •3.3.6. Изучение команды Xсopy
- •3.3.7. Изучение команды Move
- •Move [{/y|/-y}] [источник] [результат], где
- •3.3.8. Изучение команды Replace
- •Replace [диск1:][путь1] имя_файла [диск2:][путь2] [/a] [/p] [/r] [/w] Replace [диск1:][путь1] имя_файла [диск2:][путь2] [/p] [/r] [/s] [/w] [/u],
- •3.3.9. Изучение команды Ren (Rename)
- •Ren [диск:][путь] имя_файла1 имя_файла2,
- •3.3.10. Изучение команд Del (Delete) и Erase
- •Del [диск:][путь] имя_файла [...] [/p] [/f] [/s] [/q] [/a[:атрибуты]] Erase [диск:][путь] имя_файла [...] [/p] [/f] [/s] [/q] [/a[:атрибуты]]
- •3.3.11. Изучение команды Dir
- •Dir [диск:][путь][имя_файла] [...] [/p] [/q] [/w] [/d] [/a[[:]атрибуты]][/o[[:]порядок_сортировки]] [/t[[:]поле_сортировки]] [/s] [/b] [/l] [/n] [/X] [/c] [/4]
- •3.3.12. Изучение команды Cd (ChDir)
- •Cd [[/d] [диск:][путь] [..]] [[/d] [диск:][путь] [..]], Chdir [[/d] [диск:][путь] [..]] [[/d] [диск:][путь] [..]],
- •3.3.13. Изучение команды Md (MkDir)
- •Mkdir [диск:]путь, Md [диск:]путь,
- •3.3.14. Изучение команды Rd (RmDir)
- •Rmdir [диск:]путь [/s] [/q], Rd [диск:]путь [/s] [/q],
- •3.4 Практические навыки
- •4 Основы работы в среде Windows xp
- •4.4 Контрольные вопросы:
- •4.5 Практические навыки:
- •5 Сетевая установка ос Windows
- •Контрольные вопросы
- •6 Создание и управление учетными записями пользователей
- •6.3.1 Активация гостевой учетной записи
- •6.3.2 Отключение гостевой учетной записи
- •6.3.3 Настройка консоли ммс
- •6.3.4 Создание локальной учетной записи пользователя
- •Контрольные вопросы
- •6.5 Практические навыки
- •7 Использование реестра
- •7.4 Контрольные вопросы
- •8 Управление дисковыми квотами
- •8.4 Контрольные вопросы
- •8.5 Практические навыки
- •9 Использование дисковых утилит
- •9.3.1. Дефрагментация дисков
- •9.3.2. Использование утилиты Проверка диска
- •9.3.3. Использование утилиты Очистка диска
- •9.4 Контрольные вопросы
- •9.5 Практические навыки
- •10 Установка и настройка сетевых протоколов
- •10.4 Контрольные вопросы
- •10.5 Практические навыки
- •11 Настройка параметров безопасности системы
- •11.4 Контрольные вопросы
- •12 Архивация и восстановление данных
- •12.4 Контрольные вопросы
- •Архив в формате zip
- •Архив в формате rar
- •13 Изучение возможностей утилиты cmd
- •14.4 Практические навыки
- •14 Создание командных файлов
- •15 Изучение графического интерфейса Linux. Работа с поисковой системой
- •15.4 Контрольные вопросы
- •Внешний вид
- •Главное меню kde
- •Центр управления kde
- •Настройка панели и значков на рабочем столе
- •16 Основные команды работы с каталогами и файлами
- •16.1 Цель работы
- •16.2 Приборы и оборудование
- •16.2.1 Пэвм типа ibm pc
- •16.3 Порядок выполнения работы
- •16.4 Контрольные вопросы
- •16.5 Практические навыки
- •Основные команды работы с каталогами
- •Управление файлами
- •Генерация имен файлов и каталогов (Pathname Expansion)
- •17 Создание ссылок на файлы
- •17.4 Контрольные вопросы
- •17.5 Практические навыки
- •Ссылки на файлы
- •18 Назначение и изменение прав доступа к файлам
- •18.4 Контрольные вопросы
- •18.5 Практические навыки
- •19 Управление пользователями и группами
- •19.4 Контрольные вопросы
- •14.5 Практические навыки
- •20 Менеджер архивов ark
- •20.4 Контрольные вопросы
- •Утилита ark
- •21 Изучение текстового редактора VI
- •21.4 Контрольные вопросы
2.4 Контрольные вопросы
2.4.1. Дайте определение понятия «процесс».
2.4.2. Что означает термин «поток»?
2.4.3. Дайте определение понятию «приоритет».
2.4.4. Дайте определение понятию «сигнал».
2.4.5. Какие характеристики процесса относят к дескриптору процесса?
2.4.6. Перечислите изученные вами команды работы с процессами.
2.4.7. Для каких практических целей можно использовать nice-фактор?
Приложение 1
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Для управления процессами существует такая подсистема как менеджер процессов. В Linux реализована многозадачность с вытеснением и менеджер процессов полностью управляет процессами. Каждый процесс имеет свой контекст. Контекст процесса это таблица распределения памяти, текущий статус процесса, приоритет процесса, данные о используемых ресурсах, маска сигналов, идентификаторы процесса и другие свойства. Идентификатор процесса состоит из идентификатора PID и идентификатора родительского процесса PPID.
Самый первый пользовательский процесс называется init. Его PID всегда равен 1, а PPID равен 0, так как он не имеет родительского процесса, а порождается ядром на определенном этапе загрузки системы. Все остальные процессы являются дочерними процессами и имеют PPID отличный от нуля. Для того чтобы породить новый процесс, родительский вызывает функцию ядра fork(), в результате которой происходит клонирование родительского процесса и получается абсолютно одинаковый процесс на начальном этапе. Единственное отличие: у дочернего процесса увеличивается PID. PID дочернего процесса всегда будет больше чем у родительского. В остальном контекст полностью будет совпадать с родительским. Затем для дочернего процесса запускается функция exec(), которая начинает уже изменять контекст на нужный, загружать в память код программы и т.д.
Операционная система Linux является многопользовательской. У каждого процесса есть такой параметр как “владелец” - от имени которого выполняется процесс. Это UID процесса. Также у процесса есть такой параметр как GID (по аналогии с GID пользователя). Кроме этого есть такие параметры как EUID(эффективный UID) и EGID (эффективный GID). Возможности процесса в системе определяются именно этими параметрами: EUID и EGID.
EUID = UID пользователя, если бит setuid = 0 EUID = UID программы, если бит setuid = 1
В определенный момент времени работать может только один процесс. Но так как переключение между процессами происходит очень быстро (тысячи переключений в секунду), то создается впечатление, что все они работают одновременно. Сколько процессорного времени и других ресурсов выделить каждому процессу решает менеджер процессов. В принятии этого решения играет роль такой параметр процесса как nice (или nice-фактор). nice-фактор - это числовое значение. Чем оно больше, тем меньше ресурсов (процессорного времени и т.д.) будет выделяться процессу во время его работы.
Многие процессы выполняют операции ввода/вывода информации в/из терминала. Поэтому есть такой параметр как Терминал. А есть процессы, которые работают в фоновом режиме. Такие процессы не привязаны к терминалу. Например, процесс cron.
Для просмотра процессов и их свойств предназначена команда ps. Команда имеет очень много ключей и параметров. Все их можно посмотреть в man ps. Программе ps можно передавать как параметры, так и ключи. Напомню, что перед ключом (или последовательностью ключей) всегда стоит дефис, а параметры пишутся без дефиса. Сравните результаты команд ps с ключом (ps -a) и с параметром (ps a). Как видите, результаты существенно отличаются. А теперь рассмотрим еще несколько распространенных вариантов команды ps.
Чтобы отобразить все существующие процессы предназначена команда ps aux. Результат ниже сокращен (процессов гораздо больше):
igor@adm-ubuntu:~/linux$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 11740 0.0 0.0 3124 448 ? S< 11:28 0:00 udevd --daemon igor 11805 0.0 0.0 1848 548 pts/0 S+ 11:43 0:00 ping 192.168.222.10 igor 11915 0.0 0.1 2640 1040 pts/2 R+ 12:00 0:00 ps aux
По команде ps aux можно увидеть достаточно обширный объем информации. Расшифровка столбцов следующая:
USER - владелец процесса PID - PID процесса %CPU - процент использования процессора. Это время использования процессора, деленное на общее время существования процесса. %MEM - процент использования физической оперативной памяти. VSZ - объем виртуальной памяти, выделенной процессу (в Килобайтах) RSS - объем физической оперативной памяти, выделенной процессу (в Килобайтах) TTY - к какому терминалу “привязан” процесс STAT - статус (состояние) процесса. R - выполнение, S - ожидание, T - остановлен, Z - “зомби” START - время когда был запущен процесс TIME - количество процессорного времени, которое брал себе процесс. Обычно там нули или малое число (0:00 - 0:09). Если число большое, то процесс загружает процессор и следует проверить все ли с ним в порядке. COMMAND - имя команды. Какой код был выполнен во время исполнения функции exec().
Чтобы увидеть информацию о nice-факторе необходимо выполнить команду ps lax:
igor@adm-ubuntu:~$ ps lax F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 1 1000 2760 1 20 0 17928 5512 poll_s Ss ? 0:01 gnome-screensaver 0 1000 5859 3543 20 0 6292 3512 wait Ss pts/2 0:00 bash 0 1000 12275 5859 20 0 3752 1564 wait S+ pts/2 0:00 man ps
Особый интерес для нас предоставляют следующие столбцы:
PPID - отображен PID родительского процесса. Например, для первой строки примера PPID равен 1, значит родительским для этого процесса, является процесс init. Процесс из третьей строки является дочерним процесса из второй строки и т.д. NI - значение nice-фактора. PRI - приоритет процесса.
Nice-фактор - это параметр, который влияет на приоритет процесса. Чем выше число в столбце PRI тем ниже приоритет процесса. Пользователи могут изменить приоритет процесса при помощи изменения nice-фактора. Для этого существуют две команды: nice и renice. Диапазон значений nice-фактора невелик: от -20 до 19. Когда создается дочерний процесс, то он наследует nice-фактор своего предка. По умолчанию большинство пользовательских процессов имеют nice-фактор 0, так как именно такой nice-фактор установлен для процесса init. Чтобы изменить nice-фактор запускаемого процесса используют команду nice:
igor@adm-ubuntu:~$ nice -n 5 sleep 30 &
igor@adm-ubuntu:~$ ps lax | grep sleep F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 0 1000 3567 3543 20 0 6292 3528 wait Ss pts/0 0:00 bash 0 1000 13098 3567 25 5 2952 628 hrtime SN pts/0 0:00 sleep 30
Синтаксис команды простой: через ключ -n мы передаем значение приращения nice-фактора, а затем идет команда для которой будет устанавливаться новый nice-фактор. Речь идет именно о приращении, так как реальный nice-фактор нового процесса будет равен nice-фактору родительского процесса сложенному с числом, передаваемым команде nice. В приведенном выше примере nice-фактор родительского процесса (оболочки bash) равен нулю, значит nice-фактор дочернего будет 0+5=5, что мы и видим на результатах.
Обычные пользователи могут только увеличивать nice-фактор, но не могут его уменьшать. Сделано это для того, чтобы пользователи не смогли создавать высокоприоритетные процессы. Если от имени пользователя выполнить команду nice -n -5 sleep 30 &, получим сообщение об ошибке. Уменьшать nice-фактор может только пользователь root.
Если необходимо изменить nice-фактор уже запущенного процесса, то используют команду renice. Например:
igor@adm-ubuntu:~$ renice 14 13229 13229: старый приоритет 10, новый приоритет 14
где 13229 это PID процесса для которого меняется nice-фактор. Из примера, также видно, что число 14 это уже не приращение, а просто новое значение nice-фактора. Если необходимо изменить nice-фактор всех процессов одного пользователя, то используется ключ -u. Например, изменим nice-фактор всех процессов пользователя test:
test@adm-ubuntu:~$ ps lax | grep test 4 1001 13256 5630 20 0 8656 3036 wait S pts/1 0:00 su - test 0 1001 13297 13266 20 0 3056 824 pipe_w S+ pts/1 0:00 grep –color=auto test test@adm-ubuntu:~$ renice 5 -u test 1001: старый приоритет 0, новый приоритет 5 test@adm-ubuntu:~$ ps lax | grep test 4 1001 13256 5630 25 5 8656 3036 wait SN pts/1 0:00 su - test 0 1001 13302 13266 25 5 3056 820 pipe_w SN+ pts/1 0:00 grep –color=auto test
Для каких практических целей можно использовать nice-фактор? Например, если какие-то процессы занимают в данный момент большое количество процессорного времени, то для более быстрого определения проблемы можно запустить интерпретатор команд с более низким nice-фактором. Операции разного рода кодирования или сжатия, которые требуют много времени (часы), можно запускать с более высоким nice-фактором, чтобы не загружать систему. Быстродействие современных процессоров, таково, что к изменению nice-фактора прибегают все реже, но тем не менее иногда он может быть очень полезен.
Давайте теперь рассмотрим основной способ “общения” процессов - сигналы. Один процесс при помощи ядра может передать другому процессу специальное числовое значение сигнала. Процесс вызывает функцию передачи сигнала и передает необходимую информацию (код сигнала, PID процесса) ядру. Ядро передает сигнал процессу получателю и отслеживает, как этот сигнал обрабатывается. Сигналы обозначаются цифрами или мнемоническими обозначениями. Перечень сигналов можно вывести командой kill -l.
Мнемонические имена, которые вы видите (SIGTERM, SIGINT, SIGKILL) начинаются с приставки SIG. Имена в этом виде используются в языках программирования таких как С. В интерпретаторе bash используются или числа или мнемонические имена, но без приставки SIG - TERM, INT, KILL.
Часть сигналов (INT, TERM) являются перехватываемыми. Это означает, что процесс при получении такого сигнала должен перейти на специальную подпрограмму, которая занимается обработкой сигнала. Если подпрограммы обработки нет (а ее написанием занимаются разработчики программы, которая выполняется в контексте процесса), то управление передается ядру, которое выполняет действия по умолчанию, описанные для каждого сигнала.
Часть сигналов являются такими, которые можно заблокировать. Например, один процесс посылает сигнал TERM другому процессу, а он в свою очередь не закончил операции ввода/вывода. В таком случае второй процесс может заблокировать полученный сигнал (опять таки в обработчике сигнала) до момента выполнения необходимой операции ввода/вывода. Сигнал TERM - это сигнал корректного завершения работы процесса. Обработчик этого сигнала, должен выполнить все необходимые действия для правильного завершения работы.
И есть третья группа сигналов, которые не блокируются и для которых не нужны обработчики. Примером такого сигнала является сигнал KILL. Этот сигнал уничтожает процесс, так как для него нет обработчиков в процессах, то он будет обрабатываться ядром по умолчанию и так как он не блокируемый, то действия будут выполняться немедленно.
Пока мы говорили о том как процессы “общаются” между собой с помощью сигналов. Но мы (пользователи) также можем посылать сигналы процессам. Например, комбинация клавиш Ctrl+C посылает процессу сигнал INT, который прерывает выполнение процесса. Если вы наберете в терминале команду sleep 100, то команда не вернет управление терминалу пока не завершится. Прервать выполнение этой команды можно нажав комбинацию клавиш Ctrl+C.
Сигнал KILL не блокируется и не перехватывается и ведет к немедленному завершению процесса.
Сигнал INT в отличие от KILL является блокируемым сигналом и перехватываемым. Сигнал TERM также является перехватываемым и блокируемым и предназначен для корректного (предпочтительного) завершения работы процесса. Сигнал QUIT - похож на TERM, но позволяет сохранить дамп памяти. Сигнал HUP - сейчас этот сигнал чаще всего интерпретируется процессами как “прочесть конфигурационные файлы”.