Какое назначение имеет ядро системы и интерпретатор команд linux

Обновлено: 05.07.2024

Shell: что это такое и зачем он нужен

Интерпретатор командной строки, или shell (shell -- оболочка) -- эта та программа, которая принимает команды от пользователя и исполняет их.

  • Взаимодействие с пользователем (редактирование командной строки, история команд и т.д.).
  • Обработка (расширение) шаблонов имен (" * ", " ? " и т.д.).
  • Перенаправление ввода/вывода команд.
  • Управление заданиями.

Кроме того, shell -- это специализированный язык программирования, в котором есть переменные, конструкции while, if, for и т.д., функции и много чего еще. Он позволяет писать как несложные сценарии для автоматизации повседневных задач, так и довольно сложные программы (например, запуск и останов большинства Unix'ов производятся сценариями на языке shell).

Хотя работа непосредственно в командной строке (а не в оболочке типа NortonCommander или какой-нибудь оконной) на первый взгляд не столь удобна, она обеспечивает более удобный доступ к таким функциям, как перенаправление ввода/вывода и управление заданиями -- оболочки типа Midnight Commander в этом случае будут только мешать.

Shell -- это не одна конкретная программа. Исторически существует несколько подвидов оболочек; "генеалогическое древо" представлено на Рис.1.

Рис.1: семейство
интерпретаторов командной строки

Не вдаваясь в подробности истории (краткое описание можно найти в разделе 3.10 книги "Unix: универсальная среда программирования" Кернигана и Пайка), стоит лишь заметить, что csh и tcsh не в полной мере реализуют командный язык sh, а zsh, являясь самой последней разработкой, умеет все, что и любой другой подвид, и плюс много чего еще.

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

Изложение в данном разделе основано на zsh (которая и используется на практических занятиях), но большая часть описанного верно и для других оболочек.

Совет
Совет: чтобы узнать, какой используется shell, надо выполнить команду

Перенаправление ввода/вывода file", "less file" 2. "cp src1 src2 dst" -- ошибка, "cat src1 src2 >dst" -- ok 3. "cat src >>dst" 4. "ls -l | less" 5. "sort log" -- ? : stderr! "ls -l >log 2>errlog", 2>/dev/null, 2>&1 7. zsh: "ls >file1 >file2" ---- 1.5 "ls -l >file" -- "file" войдет в список от ls! -->

Представим себе ситуацию: хочется посмотреть листинг директории /bin (в которой лежат многие программы). Выполняем команду " ls -l /bin " и. Результат в экран не помещается. А ведь бывают директории еще большего объема. Что делать?

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

Так, чтобы сохранить вывод нашей команды в файл, надо написать:

При этом весь вывод команды ls будет вместо терминала отправлен в файл. Символ " > " означает, что выходной поток должен быть помещен в указанный далее файл, а не выведен на терминал. Если в файле что-то было, то старое содержимое будет стерто.

Получив таким образом список файлов, его можно просмотреть командой less .

Еще один пример: можно слить содержимое нескольких файлов в один файл, "перехватив" выходной поток команды cat и отправив его в файл:

Сделать то же самое при помощи команды cp нельзя:

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

Первая команда cat скопирует содержимое file1 в all , а вторая -- допишет к нему содержимое file2 и file3 .

Использование " >> " очень удобно, если есть некий "долгоживущий" файл (например, протокол каких-то действий или результатов), к которому иногда надо дописывать данные в конец. Просто указать " >> " с какой-нибудь командой обычно намного быстрее, чем загружать файл в текстовый редактор и что-то дописывать.

Теперь вернемся к нашему первому примеру: как посмотреть листинг большой директории. Мы отправили вывод команды ls в файл, а потом запустили less для его просмотра. Сам же временный файл не имеет никакого смысла -- потом он больше не нужен.

Можно обойтись без временного файла, воспользовавшись конвейером:

Большинство команд, выдающих информацию из файла на экран ( cat, more, less ) устроены так, что они будут читать входной поток, если не указан никакой файл -- вот почему less показывает то, что ему "пришло" от ls .

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

Можно заставить команду читать вместо терминала не только выходной поток другой команды, но и обычный файл. Это делается при помощи оператора " < ", который указывает, что вместо терминала надо брать входной поток из указанного далее файла. Пример (команда " sort " построчно сортирует входные данные):

Что будет, если мы попросим ls показать файлы, которых нет?

Файлы которые есть, ls покажет, а про остальные скажет, что их нет. А теперь перенаправим вывод ls в файл:

В чем же дело?! Казалось бы, на экране ничего не должно появиться.

Замечание
Такое перенаправление потока stderr невозможно в оболочках csh и tcsh -- в них для этого используется другой, более запутанный синтаксис.

Этот способ работает и тогда, когда стандартный вывод отправляется по конвейеру другой программе.

Подробную информацию на эту тему можно найти в info-документации на zsh , набрав команду " info zsh redirection ".

Часто возникает задача: надо найти, в каком файле встречается некое слово или фраза. Для этого служит команда " grep ". Она ищет "образец" в указанных файлах (или в стандартном вводе, если файлы не указаны) и печатает все строки, на которых он встречается. Пример (найти строку " no "):

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

С ключом " -i " grep ищет, не различая маленькие/заглавные буквы:

  • " . " означает "любой символ".
  • " * " -- любое количество повторений (0 и больше) предшествующего символа.
  • "^" -- начало строки.
  • "$" -- конец строки.
  • Специальное значение имеют также символы ? , [ , ] , < , >, | , + , \ .

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

Пример (найти все символьные линки в директории /etc):

Здесь используется то, что для символьных линков ls первым символом строки (тип файла) выводит букву " l ".

Вообще говоря, в конвейере может участвовать сколько угодно команд. Так, команда

делает почти то же, что и в предыдущем примере, но отбирает только те директории, в имени которых есть "lib".

Совет
Команда grep -- одна из самых полезных и частоиспользуемых в Unix. Она столь же важна для нахождения файлов с нужным содержимым, как ls -- для нахождения файлов с нужным именем. Поэтому стоит хорошо освоить grep -- умелое владение ей позволяет сэкономить массу времени и сил. Кроме того, регулярные выражения широко используются во многих других программах.
(Не стоит пытаться понять, откуда такое странное название -- это длинная история.) -->

Фоновое исполнение задач

Часто бывает нужно запустить "долгоиграющую" программу, которая все равно пишет данные только в файл (например, какие-либо вычисления), или графическое приложение, которое не пользуется окном терминала. Но ведь пока программа запущена, терминал "принадлежит" ей, и им больше ни для чего нельзя пользоваться!

Unix позволяет запускать задачи в "фоновом режиме": если в конце командной строки указать символ " & ", то после запуска команды терминал можно продолжать использовать для ввода других команд.

Пример (запустить графический калькулятор):

В квадратных скобках shell печатает номер задания, а за ним -- номер процесса (об этом подробнее в следующем разделе).

Таким образом можно запустить в фоновом режиме несколько задач -- например, калькулятор, текстовый редактор и "снежную зиму":

Посмотреть список запущенных задач можно командой " jobs ":

(Символы "+" и "-" означают "последняя запущенная задача" и "предпоследняя").

Если у программы не предусмотрено способа завершить исполнение, то ее можно "убить" командой " kill ":

Символ процента и следующий за ним номер являются ссылкой на конкретное задание.

Если задача случайно запущена без символа " & ", то ее можно или завершить комбинацией клавиш Ctrl+C и потом запустить правильно, или "заморозить", нажав Ctrl+Z , а потом перевести в фоновый режим командой " bg " (сокращение от BackGround):

Бывает и обратное: случайно интерактивная программа (например, текстовый редактор) запущена в фоновом режиме. Интерактивные программы при этом автоматически "замораживаются" (потому, что они пытаются читать с терминала, который ей "не принадлежит"). Перевести их в "основной режим" можно командой " fg " (сокращение от ForeGround):

Замечание
Если командам bg и fg не указывать задачу, то они работают с последней запущенной -- той, что помечена символом "+".

Если попробовать набрать " exit " для выхода из системы (или из окна терминала) при исполняющихся в фоновом режиме задачах, то zsh не позволит выйти:

Повторная команда " exit " все же будет выполнена, но zsh постарается завершить фоновые задачи:

Чтобы zsh не считал своей обязанностью "убитие" фоновых задач при выходе, можно заставить его забыть про них:

Замечание
Другие оболочки (bash и tcsh) менее "заботливы", и завершают работу по первой же команде exit , оставляя фоновые задачи "беспризорными".

Чтобы запустить фоновую задачу и заставить zsh сразу же забыть про нее, надо набрать всю команду (включая " & ") в круглых скобках:

Допустим, запустив задачу в фоновом режиме, пользователь выходит из системы, оставляя задачу работать дальше. Хорошо, если это была графическая программа -- у нее почти наверняка будет хотя бы команда "Выход". А если нет, если это какая-либо счетная задача?

В этом случае придется воспользоваться средствами более низкого (системного) уровня -- управлением процессами.

Здесь следует сразу понять разницу. Задача (job) -- это одна или несколько программ (например, конвейер), запущенных из оболочки, которыми можно управлять при помощи команд оболочки jobs , bg , fg и kill . Процесс (process) -- это любая программа, запущенная любым способом (из оболочки; другой программой -- например, из графического меню; самой операционной системой при запуске и т.д.).

Для просмотра списка процессов служит команда " ps ". У нее есть довольно много ключей, которые к тому же различаются в BSD и SystemV. Поэтому здесь приведем лишь несколько наиболее часто встречающихся вариантов ее использования. В основном изложение относится к BSD-версии команды ps (в том числе и Linux), эквиваленты для SysV-версии (Solaris, IRIX) приведены отдельно.

Команда ps без параметров выводит список почти всех процессов, принадлежащих запустившему ее пользователю.

Из всей информации, что выдает ps , для нас пока интересны поля PID и COMMAND.

PID (Process IDentifier) -- это число, уникальное для каждого процесса, которое используется, например, для того, чтобы приостановить или завершить его исполнение. COMMAND -- название программы и ее параметры.

"Почти" -- потому, что в список не включаются процессы "без терминала", т.е. те, которые запущены в фоновом режиме, а окно, из которого это было сделано, потом было закрыто. Чтобы эти процессы также отображались, надо указать ключ " -x "; в поле TTY у них стоит " ? ".

Ключ " -a " показывает процессы всех пользователей, а не только запустившего ps.

Ключ " -u " выдает более полную информацию о каждом процессе -- потребление процессорного времени, памяти, время запуска.

Ключ " -f " выдает список процессов "со связями", позволяя понять, какой из процессов является чьим "родителем" и чьим "потомком".

Следует заметить, что в получившийся список может попасть и сам grep -- в его командной строке тоже присутствует искомое слово, а поскольку ps и grep исполняются параллельно (а может и не попасть, в случае если команда ps отработает раньше, чем запустится grep ).

Замечание
Команда ps в последних версиях Linux при указании любых ключей выдает предупреждение типа

На это надо просто не обращать внимания -- просто команда ps сейчас находится в процессе переделки со стандарта BSD на стандарт Unix98, и это предупреждение -- следствие попытки обеспечить совместимость.
  • " ps " без параметров выводит список процессов, запущенных в данной сессии (т.е. в том же окне, что и ps).
  • " ps -u пользователь " выводит список всех процессов указанного пользователя.
  • " ps -e " показывает все процессы (аналог " ps -a " в BSD)
  • " ps -f " показывает более полную информацию (аналог " ps -u " в BSD)

Команде kill можно указывать не только номер задания, но и PID. Так, команда " kill 1206 " пошлет команду завершения процессу с номером 1206. Стоит напомнить, что при запуске задач оболочка кроме номера задания печатает также PID соответствующего процесса (или процессов, в случае конвейера):

Вообще говоря, " kill " не завершает процесс, а посылает ему сигнал . Процесс же, получив сигнал, может завершиться, а может и предпринять какое-либо другое действие, например, проигнорировать сигнал.

Есть несколько десятков сигналов, каждый из которых имеет свой смысл. Каждый сигнал имеет как имя, так и номер, но, поскольку номера разные в разных Unix'ах, то лучше использовать имена. Чтобы указать kill , какой сигнал послать, надо указать его имя (или номер), предваренное дефисом:

Вот список самых часто употребляемых сигналов:

СигналНазначение
TERMTERMinate -- завершить работу.
Используется командой kill по умолчанию
INT INTerrupt.
Посылается при нажатии пользователем Ctrl+C
STOP"замерзнуть"
CONTCONTinue -- "размерзнуть"
HUP HangUP -- "повесить трубку".
Посылается при выходе пользователя из системы программам, запущенным в этой же сессии
KILL"умереть"

Сигналы TERM, INT, HUP и KILL обычно приводят к завершению работы программы. Разница между ними в том, в каких случаях они посылаются и в том, что одни сигналы программа перехватывает, а другие -- нет.

Сигнал KILL программа перехватить не может, поэтому если она не реагирует больше ни на что, то остается использовать его. Номер KILL во всех Unix'ах -- 9, поэтому его часто указывают по номеру, а не по имени -- " kill -9 ". Сигнал KILL следует использовать только в крайних случаях, когда ничто другое не помогает. Дело в том, что перехватив, к примеру, сигнал TERM, программа может корректно завершить работу, при надобности сохранив данные в файлы и восстановив правильное состояние терминала, а KILL не дает ей такой возможности.

Вообще говоря, большая часть функций по управлению заданиями реализуется при помощи сигналов. Так, послав программе сигнал STOP, получим тот же эффект, что и при нажатии Ctrl+Z .

В большинстве современных Unix'ов есть возможность послать сигнал процессу, указав его не по номеру, а по имени программы. Для этого служит команда " killall " -- она посылает сигнал всем процессам с указанным именем. Пример:

Не стоит ей злоупотреблять -- эта команда мало того, что "убивает" все процессы с таким именем, она пытается "убить" даже процессы с таким именем у других пользователей (чего ей Unix, естественно, не позволяет сделать).

В большинстве современных клонов Unix есть программа, позволяющая оперативно отслеживать, какие процессы запущены в системе и какие из них потребляют больше всего процессорного времени. Эта программа называется " top ".

top показывает процессы по убыванию "потребления" процессора. ("top" -- верхушка, вверху показываются те процессы, которые потребляют больше). К сожалению, как видно из приведенного примера, сам top также потребляет немало -- на старых компьютерах типа 486 он иногда пожирал больше 10%.

Где брать информацию про shell

Поскольку команды jobs , bg и fg -- это внутренние команды оболочки, то их описание следует искать в описании оболочки. Информация про перенаправление ввода/вывода имеется там же.

Для оболочек bash и tcsh лучше всего смотреть man-страницы. Для zsh -- info-документацию:

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

В качестве решения вопроса с операционной системой компанией AT&T была создана операционная система Unix, которая дала старт возникновению открытого программного обеспечения и созданию Linux. Но давайте по порядку.

История возникновения Unix


Первоначально Unix использовалась в основном в университетах и крупных финансовых корпорациях. К 1978 году насчитывалось около 600 машин с установленной на них системой Unix.

Появление проекта GNU

В восьмидесятые годы 20 века многие компании, в числе которых IBM и HP, начали создавать свои собственные (в том числе и коммерческие) версии системы Unix. Это привело к путанице дистрибутивов Unix. И к тому же фирмы, продающие свои дистрибутивы, прямо запрещали распространять их исходные коды. Из-за этого другие программисты не могли применять уже внедренные к тому моменту новые компоненты системы, и им приходилось писать их заново.

В 1982 году программист из Массачусетского технологического института (MIT) Ричард Столлман сталкивается с проблемой того, что существующая на тот момент коммерческая лицензия программного обеспечения, с которым он вынужден работать, ограничивает свободу своего использования и не позволяет Столлману обмениваться исходными кодами ПО даже в стенах института.


В рамках проекта GNU создаются необходимые для разработки ядра системы компоненты: текстовый редактор Emacs, набор компиляторов gcc, интерпретатор bash, архиватор gzip, утилиты sed, gawk, Autoconf и многие другие. Помимо этого, в 1988 году с целью юридически закрепить за пользователями права на копирование, модифицирование и распространение программ и исходных кодов проекта GNU, Столлманом публикуется лицензия GNU GPL (сокр. от «GNU General Public License» = «Универсальная общественная лицензия GNU»). Однако, несмотря на все его успехи, даже спустя 8 лет после старта проекта, не хватало самого важного компонента операционной системы — её ядра…

История создания Linux

В январе 1991 года, финский студент Линус Торвальдc, находясь под впечатлением от купленной им книги «Проектирование и реализация операционных систем» автора Эндрю С. Таненбаума, с целью детального изучения концепций и строения ОС Unix, решает купить новый компьютер на базе процессора Intel 80386, на который ставит разработанную Таненбаумом учебную ОС Minix.

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

И тогда в августе 1991 года Торвальдс объявляет в сети Usenet о том, что создает свою собственную (свободную) операционную систему с открытыми исходными кодами — Linux. Стоит отметить, что в тот момент речь еще не шла о полноценной системе, скорее это был её прообраз в виде ядра.

17 сентября того же 1991 года, без каких-либо особо публичных объявлений, выходит Linux версии 0.01.

А уже 16 апреля 1994, когда, по мнению Линуса, система стала полностью работоспособной, вышел первый, после более чем двух лет развития, мажорный релиз системы — Linux 1.0.

Открытие исходных кодов операционной системы сыграло решающую роль в дальнейшем развитии Linux. Но необходимо все-таки помнить, что технически Linux — это только лишь ядро, без сопутствующих прикладных программ. Полноценной ОС его делает сопутствующее программное обеспечение. Пока роль такого программного обеспечения играли компоненты учебной системы Таненбаума.


Таким образом, миру явилась полноценная работающая операционная система под названием «GNU/Linux», которую мы привыкли называть просто «Linux», состоящая из ядра Linux, написанного Торвальдсом, и окружающего программного обеспечения, созданного в рамках проекта Столлмана, GNU.

Что такое Linux?

Linux — это семейство Unix-подобных операционных систем, использующих ядро Linux, которое разработал финно-американский программист Линус Торвальдс. ОС, использующие ядро Linux, называются дистрибутивами Linux, и они являются такими же операционными системами как Microsoft Windows или Apple macOS, но с одной очень важной особенностью, а именно — их исходные коды являются открытыми, так как они распространяются под лицензией GNU GPL, которая подразумевает создание свободного и открытого программного обеспечения (open source software). Это означает, что у любого пользователя есть право изучать и изменять исходный код.

Примечание: Стоит отметить, что есть также и платные дистрибутивы Linux, например, Red Hat Enterprise Linux, Astra Linux Special Edition и др.


Пингвин Tux — талисман Linux

GNU/Linux или Linux?

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

Архитектура Linux-систем

На следующем рисунке показана архитектура Linux-систем:


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

Утилиты (vi, cat, sed, date, компиляторы и др.) — служебные программы, которые предоставляют пользователю большую часть функциональных возможностей операционной системы.

Ядро Linux

Как вы наверняка знаете, на компьютере может быть запущено сразу несколько программ: какие-то из них работают в фоновом режиме, другие могут ожидать определенных действий от пользователя, а третьим необходимо получать информацию из другой запущенной программы. В такой ситуации именно ядро берет на себя функцию оптимального распределения ресурсов компьютера между запущенными программами и организацию параллельной работы множества различных процессов. Оно первым загружается в оперативную память компьютера и всегда находится в запущенном состоянии, постоянно взаимодействуя с его аппаратным обеспечением и установленными программами.

Как правило, большинство ядер делятся на три типа:

Микроядро — это ядро, состоящее из нескольких подгружаемых в память по мере надобности независимых модулей, выполняющихся в отдельных адресных пространствах. По сути, в таком варианте исполнения оно не сильно отличается от обычных прикладных программ. К достоинствам данного ядра можно отнести теоретически большую надежность в сравнении с другими архитектурами (в действительности же не всё так радужно и гладко) и его модульность (легкость в подключении дополнительных частей ядра). К минусам микроядерной архитектуры относится то, что ядро, построенное по такой схеме, получается очень медленным (ведь ему нужно постоянно переключаться между отдельными частями).

Монолитное ядро — это полная противоположность микроядра, т.к. в памяти компьютера всегда находится весь (или почти весь) код ядра, вследствие чего скорость его работы выше в сравнении с микроядром.

Гибридное ядро — это ядро, сочетающее в себе элементы как монолитной, так и микроядерной архитектур.

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

Заключение

Linux поддерживает целый ряд аппаратных устройств от телефонов и до суперкомпьютеров. Каждая операционная система на базе ядра Linux имеет ядро Linux и набор ПО для управления аппаратными ресурсами компьютера.

На следующих уроках мы детально рассмотрим тему лицензии GNU GPL, сравним Linux и Windows, выполним обзор дистрибутивов Linux и продолжим наше погружение в изучение Linux.

Главная, постоянно находящаяся в оперативной памяти, часть ОС Linux называется ядром (Kernel). Ядро ОС обрабатывает прерывания от устройств, выполняет запросы системных процессов и пользовательских приложений, распределяет виртуальную память, создает и уничтожает процессы, обеспечивает многозадачность посредством переключения между ними, содержит драйверы устройств, обслуживает файловую систему (см. рис. 3.1).


Рис. 3.1. Устройство ОС Linux

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

Начальная загрузка системы состоит в том, что файл с образом ядра считывается в оперативную память, начиная с нулевого адреса. Этот файл находится в каталоге /boot и называется vmlinuz-x.y.z, где x.y.z — это номер версии ядра. На текущий момент большинство дистрибутивов основано на ядре версии 2.4, хотя уже вышло ядро 2.6 (Fedora Core 3) и кое-где еще встречается версия 2.2.

По соглашению разработчиков ядра, все ветви с четным номером (2.2, 2.4 и т.д.) считаются стабильными и рекомендуются для широкого использования, а на ветвях с нечетным номером испытываются новые идеи, Линус Торвальдс предложил распространить эту схему нумерации и на третью цифру версии: в ядра с нечетными номерами добавлять новые функции, а в четных — только исправлять обнаруженные ошибки.

В UNIX-подобных системах в отличие от других ОС ядро минимизировано и не выполняет ни одной функции, служащей непосредственно пользователю. Для этой цели применяются многочисленные утилиты, выступающие в качестве посредников между пользователем и ядром. Только в комплекте с ними ядро образует полноценную операционную систему.

Итак, ядро обслуживает запросы процессов. Что же такое процесс? Это понятие является базовым в UNIX-подобных системах. Процесс можно представить себе как виртуальную машину, отданную в распоряжение одной задачи. Каждый процесс считает, что он на машине один и может распоряжаться всеми ее ресурсами. На самом же деле процессы надежно изолированы друг от друга, так что крушение одного не может повредить всей системе (сколько раз вы наблюдали в Windows, как сбой одной программы приводил к общему зависанию?).

Каждый процесс выполняется в собственной виртуальной памяти (см, рис. 3.2), в которую никакой другой процесс вмешаться не может. Этим и обеспечивается устойчивость всей системы.


Рис. 3.2. Виртуальная память процесса

Напоминаю, что такое виртуальная память. Каждому процессу разрешено считать, что его адреса начинаются с нулевого адреса и от него наращиваются. Таким образом, в 32-разрядной ОС процесс может адресовать 4 гигабайта оперативной памяти. Механизм виртуальной памяти позволяет процессу думать, что именно столько ему и выделено, хотя физически объем ОЗУ вашей машины — какие-то жалкие 256 Мбайт. Недостающую память заменяет жесткий диск путем записи временно не используемых страниц памяти в раздел подкачки (свопинга).

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

Данный текст является ознакомительным фрагментом.

Продолжение на ЛитРес

Глава 1 Введение в ядро Linux

Глава 1 Введение в ядро Linux Даже после трех десятилетий использования операционная система (ОС) Unix все еще считается одной из самых мощных и элегантных среди всех существующих операционных систем. Со времени создания операционной системы Unix в 1969 году, это детище Денниса

Ядро Linux в сравнении с классическими ядрами Unix

Ядро Linux в сравнении с классическими ядрами Unix Благодаря общему происхождению и одинаковому API, современные ядра Unix имеют некоторые общие характерные черты. За небольшими исключениями ядра Unix представляют собой монолитные статические бинарные файлы. Это значит, что они

Ядро в роли арбитра

Ядро в роли арбитра Так кто же определяет, который из потоков должен выполняться в данный момент времени? Этим занимается ядро.Ядро определяет, который из потоков должен использовать процессор в данный момент времени и переключает контекст на этот поток. Давайте

Ядро системы

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

IPLabs Linux Team: начало русского Linux’а

IPLabs Linux Team: начало русского Linux’а Следующая веха на пути русского Linux’а – 1998 год, когда фирма IPLabs (точнее, ее подразделение – IPLabs Linux Team) совместно с Институтом логики (на самом деле это были одни и те же люди – Алексей Новодворский, Алексей Смирнов и Юрий Девяткин с

Linux (ядро)

1.4. Ядро

1.4. Ядро Ядро — это сердце ОС, в котором реализовано управление физическими и программными ресурсами компьютера. Помимо этого оно позволяет получить доступ к различному железу. Например, ранние версии ядра обеспечивали работу только двух USB-устройств: клавиатура и мышь.

20.5.1. Зачем обновлять ядро?

Семантическое ядро

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

Составьте семантическое ядро

Составьте семантическое ядро Чтобы успешно продвигать свой бизнес в Интернете, необходимо правильно составить семантическое ядро.Семантическое ядро, говоря простым языком, – это слова, которые будут наиболее точным образом характеризовать направленность вашей

Глава 1 Как устроен компьютер

Глава 1 Как устроен компьютер Эта глава посвящена обзору аппаратных средств персонального компьютера. В ней мы также кратко познакомимся с понятием программного обеспечения и узнаем о назначении операционной системы.• Аппаратные средства ПК• Как включить

Ядро API Firebird

Ядро API Firebird Программирование с использованием API необходимо при написании драйверов для создания сценариев в таких языках, как PHP и Python, и при разработке объектно- ориентированных классов доступа к данным для объектно-ориентированных языков типа Java, C++ и Object Pascal.

Как устроен Internet

Как устроен Internet Internet качественно отличается от телеграфа, телефона, газет, радио и телевидения: информация здесь не только доставляется адресату, но и просто предоставляется на всеобщее обозрение, и каждый может сам найти и воспользоваться именно тем, что ему интересно.

Технология мысленных приказов: как устроен первый интерфейс «мозг — мозг» Андрей Васильков

1. Ознакомиться с теоретической частью к лабораторной работе.

2. Зарегистрироваться в системе LINUX.

3. Определить день недели, в который Вы родились.

4. Получить подробную информацию обо всех активных процессах.

5. Используя редактор VI (см. приложение), создать два текстовых файла (с расширением TXT) и командой САТ просмотреть их на экране.

6. Получить информацию о работающих пользователях, подсчитать их количество и запомнить в файле.

7. Объединить текстовые файлы в единый файл и посмотреть его на экране.

8. Посмотреть приоритет своего процесса и уменьшить скорость его выполнение за счет повышения номера приоритета.

9. Используя редактор VI, написать программу на языке СИ и запустить ее на трансляцию в фоновом режиме.

10. Показать преподавателю исходный текст программы на языке СИ, текстовый файл, файл с сохранением количества пользователей.

11. Продемонстрировать выполнение СИ - программы.

12. Удалить свои файлы и выйти из системы.

Контрольные вопросы

1. Перечислите основные функции и назначение многопользовательской многозадачной операционной системы LINUX и ее отличительные особенности от однопрограммной системы DOS.

2. Какое назначение имеет ядро системы и интерпретатор команд?

3. В чем заключается понятие "процесс" и какие операции можно выполнить над процессами?

4. Как задаются и выполняются простые и сложные команды?

5. Какие функции выполняет командный интерпретатор Shell?

ЛАБОРАТОРНАЯ РАБОТА № 2

ИЗУЧЕНИЕ ФАЙЛОВОЙ СИСТЕМЫ И ФУНКЦИЙ ПО ОБРАБОТКЕ И УПРАВЛЕНИЮ ДАННЫМИ

Цель работы

Целью работы является изучение структуры файловой системы OC LINUX, изучение команд создания, удаления, модификации файлов и каталогов, функций манипулирования данными.

Теоретическая часть

Файловая структура системы LINUX

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

Файловая структура LINUX имеет иерархическую древовидную структуру. В корневом каталоге размещаются другие каталоги и файлы, включая 5 основных каталогов:

bin - большинство выполняемых командных программ и shell - процедур;

tmp - временные файлы;

usr - каталоги пользователей (условное обозначение);

etc - преимущественно административные утилиты и файлы;

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

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

Полное имя файла может включать имена каталогов, включая корневой, разделенных косой чертой, например: /home/student/file.txt. Первая косая черта обозначает корневой каталог, и поиск файла будет начинаться с него, а затем в каталоге home, затем в каталоге student.

Один файл можно сделать принадлежащим нескольким каталогам. Для этого используется команда ln (link):

ln <имя файла 1> <имя файла 2>

Имя 1-го файла - это полное составное имя файла, с которым устанавливается связь; имя 2-го файла - это полное имя файла в новом каталоге, где будет использоваться эта связь. Новое имя может не отличаться от старого. Каждый файл может иметь несколько связей, т.е. он может использоваться в разных каталогах под разными именами. Команда ln с аргументом -s создает символическую связь:

ln -s <имя файла 1> <имя файла 2>

Здесь имя 2-го файла является именем символической связи. Символическая связь является особым видом файла, в котором хранится имя файла, на который символическая связь ссылается. LINUX работает с символической связью не так, как с обычным файлом - например, при выводе на экран содержимого символической связи появятся данные файла, на который эта символическая связь ссылается.




В LINUX различаются 3 уровня доступа к файлам и каталогам:

1) доступ владельца файла;

2) доступ группы пользователей, к которой принадлежит владелец файла;

3) остальные пользователи.

Для каждого уровня существуют свои байты атрибутов, значение которых расшифровывается следующим образом:

r – разрешение на чтение;

w – разрешение на запись;

x – разрешение на выполнение;

Первый символ байта атрибутов определяет тип файла и может интерпретироваться со следующими значениями:

l – символическая связь;

в – блок-ориентированный специальный файл, который соответствует таким периферийным устройствам, как накопители на магнитных дисках;

с – байт-ориентированный специальный файл, который может соответствовать таким периферийным устройствам как принтер, терминал.

В домашнем каталоге пользователь имеет полный доступ к файлам (READ, WRITE, EXECUTE; r, w, x).

Атрибуты файла можно просмотреть командой ls -l и они представляются в следующем формате:

| | | | Доступ для остальных пользователей

| | | Доступ к файлу для членов группы

| | Доступ к файлу владельца

| Тип файла (директория)

Пример. Командой ls -l получим листинг содержимого текущей директории student:

- rwx --- --- 2 student 100 Mar 10 10:30 file_1

- rwx --- r-- 1 adm 200 May 20 11:15 file_2

- rwx --- r-- 1 student 100 May 20 12:50 file_3

После байтов атрибутов на экран выводится следующая информация о файле:

- число связей файла;

- имя владельца файла;

- размер файла в байтах;

- дата создания файла (или модификации);

Атрибуты файла и доступ к нему, можно изменить командой:

chmod <коды защиты> <имя файла>

Коды защиты могут быть заданы в числовом или символьном виде. Для символьного кода используются:

знак плюс (+) - добавить права доступа;

знак минус (-) - отменить права доступа;

r,w,x - доступ на чтение, запись, выполнение;

u,g,o - владельца, группы, остальных.

Коды защиты в числовом виде могут быть заданы в восьмеричной форме. Для контроля установленного доступа к своему файлу после каждого изменения кода защиты нужно проверять свои действия с помощью команды ls -l.

chmod g+rw,o+r file.1 - установка атрибутов чтения и записи для группы и чтения для всех остальных пользователей;

ls -l file.1 - чтение атрибутов файла;

chmod o-w file.1 - отмена атрибута записи у остальных пользователей;

>letter - создание файла letter. Символ > используется как для переадресации, так и для создания файла;

cat - вывод содержимого файла;

cat file.1 file.2 > file.12 - конкатенация файлов (объединение);

mv file.1 file.2 - переименование файла file.1 в file.2;

mv file.1 file.2 file.3 directory - перемещение файлов file.1, file.2, file.3 в указанную директорию;

rm file.1 file.2 file.3 - удаление файлов file.1, file.2, file.3;.

cp file.1 file.2 - копирование файла с переименованием;

mkdir namedir - создание каталога;

rm dir_1 dir_2 - удаление каталогов dir_1 dir_2;

ls [acdfgilqrstv CFR] namedir - вывод содержимого каталога; если в качестве namedir указано имя файла, то выдается вся информация об этом файле. Значения аргументов:

- l –- список включает всю информацию о файлах;

- t – сортировка по времени модификации файлов;

- a – в список включаются все файлы, в том числе и те, которые начинаются с точки;

- s – размеры файлов указываются в блоках;

- d – вывести имя самого каталога, но не содержимое;

- r – сортировка строк вывода;

- i – указать идентификационный номер каждого файла;

- v – сортировка файлов по времени последнего доступа;

- q ­– непечатаемые символы заменить на знак ?;

- с – использовать время создания файла при сортировке;

- g – то же что -l, но с указанием имени группы пользователей;

- f – вывод содержимого всех указанных каталогов, отменяет флаги -l, -t, -s, -r и активизирует флаг -а;

- С – вывод элементов каталога в несколько столбцов;

- F – добавление к имени каталога символа / и символа * к имени файла, для которых разрешено выполнение;

- R – рекурсивный вывод содержимого подкаталогов заданного каталога.

cd <namedir> - переход в другой каталог. Если параметры не указаны, то происходит переход в домашний каталог пользователя.

pwd - вывод имени текущего каталога;

grep [-vcilns] [шаблон поиска] <имя файла> - поиск файлов с указанием или без указания контекста (шаблона поиска).

- v – выводятся строки, не содержащие шаблон поиска;

- c – выводится только число строк, содержащих или не содержащих шаблон;

- i – при поиске не различаются прописные и строчные буквы;

- l – выводятся только имена файлов, содержащие указанный шаблон;

- n – перенумеровать выводимые строки;

- s – формируется только код завершения.

1. Напечатать имена всех файлов текущего каталога, содержащих последовательность "student" и имеющих расширение .txt:

Читайте также: