Разпределени и мрежови операционни системи

Мрежови операционни системи

Към класа на слабо свързаните системи могат да се отнесат мрежовите операционни системи. Те осигуряват среда, посредством която потребител от своя локален PC може да получи достъп до ресурсите на всеки друг отдалечен PC на мрежата. За да се осигури такава среда, мрежовите ОС трябва да предоставят като минимум две възможности:

  1. влизане като потребител в ОС на отдалечен компютър;
  2. прехвърляне на данни м/у локалния и всеки друг отдалечен PC.

При необходимост, потребителят може дистанционно да влезе в ОС на всяка друга машина, използвайки команда от вида:login <machine>
Прехвърлянето на файлове от една машина на друга може да се извърши с команда от типа:copy machine1:file1 machine2:file2
С тази команда файлът file1 се копира от работната станция machine1 в работната станция machine2 под името file2.
Стандартът POSIX (Portable Operating System) дефинира множество от библиотечни процедури, които всяка отворена ОС трябва да притежава, за да комуникира с друга отворена ОС. Първоначално стандартът POSIX е разработен за съгласуване на различните версии на системите UNIX, но впоследствие се  разпространява и за други ОС.
Реализацията на услугите в мрежовите OC се извършват съгласно модела клиент-сървър. Комуникацията м/у клиентите и сървъра се реализира с помощта на съобщения със специфичен формат. Клиентите изпращат към сървъра съобщения заявки (request), а сървърът връща резултата от изпълнението на заявката на клиентите със съобщение отговор (reply).
Възможностите, включени в мрежовите OC, позволяват върху тях да се реализират различни разпределени приложни с-ми.
Мрежовите операционни системи служат като платформа за разпределени инструментални среди, известни като междинни (middleware). Middleware е допълнително ниво на абстракция над мрежовите OC, реализиращо услуги с общо предназначение (general purpose). Основната цел на междинните системи се състои в предоставяне на простота и удобство за програмиране на разпределени системи. Тази цел се постига чрез:
осигуряване на прозрачност (transparency) при програмиране. Прозрачността означава скриване на детайлите и особеностите на: реализацията на мрежата   и апаратурата; комуникацията между програмни компоненти;
Маскиране на различията на OC на компютрите в мрежата и езиците за програмиране.
Разработени са различни класове системи middleware, различаващи се според мощността на програмните абстракции, които предоставят и възможностите за използване в хетерогенни мрежи и компютърни архитектури:
Отдалечено извикване на процедури (Remote Procedure Call – RPC). Предоставя програмна абстракция за обръщение към процедури през мрежата;
Middleware системи, ориентирани на съобщения (Message-oriented Middleware – MOM). MOM осигуряват абстракция на опашка от съобщения, достъпна през мрежата. Тя  е добре известната като – пощенска кутия (mailbox);
Middleware системи, ориентирани на обекти (Distributed Object Middleware). Осигуряват програмна абстракция за обръщение към методите на отдалечен обект по същия начин, както към обект, разположен в адресното пространство на извикващата програма. Най-известните с-ми от този клас са: CORBA; DCOM и др.


2.Разпределени ОС
Към класа на силно свързаните системи се отнасят разпределените ОС. Разпределените ОС са предназначени за работа в РС мрежи без обща памет. Те позволяват на отделните потребители еднотипен достъп до локалните и отдалечените РС ресурси, като създават илюзията за работа в еднопроцесорна с-ма с времеделение. Основните характеристики на разпределените ОС са:

  • единен глобален механизъм за междупроцесна комуникация;
  • единен глобален механизъм на защита на програми и данни;
  • един и същ механизъм за управление на процесите във всички машини с еднакъв интерфейс от с-мни извиквания за създаване, унищожаване, стартиране и преустановяване на процесите;
  • глобална файлова с-ма с добре дефинирана семантика;

При разпределените с-ми в/у вс. машини се изпълняват идентични ядра на ОС, които координират по подходящ начин своите действия.
Предимства на разпространените операционни системи:

  • Възможност за достъп до общи за всички процеси ;
  • Съвместно използване на ресурсите;
  • Възможност за комуникация в реално време между потребителите;
  • Гъвкавост при експлоатация;
  • Висока надеждност.
  • Разпределените системи  и редица специфични проблеми за разрешаване, към които могат да се отнесат:
  • Необходимост от разработване на разпределен софтуер;
  • Мрежови проблеми, свързани с необходимост от надеждна комуникация м/у отделните РС в мрежата;
  • Необходимост от сигурност и защита на общите данни;

Цели при проектиране на разпределени системи

При проектиране и разработка на разпределени системи се преследва постигане на следните основни характеристики:
Прозрачност (transparency). Прозрачността се дефинира като скриване от потребителите и приложните програмисти на разпределената с-ма, така че тя да изглежда като еднопроцесорна с-ма.
Гъвкавост (flexibility). Гъвкавостта позволява лесно добавяне на нови функционални възможности в с-мата. Два подхода за изграждане, които оказват влияние върху гъвкавостта:
монолитно ядро на ОС (monolithic kernel). Представлява е ядро на централизирана операционна система, разширено с мрежови средства и интегрирани услуги за отдалечен достъп. Предимство- висока производителност. Недостатък – ниската гъвкавост на с-мата;
микроядро на ОС (microkernel). Предоставя минимален набор услуги – механизъм за междупроцесна комуникация, управление на паметта, управление на вход-изход на ниско ниво, ограничено управление и планиране на процесите на ниско ниво.
Надеждност (reliability). Неизправностите в разпределените системи като правило са частични, ако някои компоненти откажат, другите продължават да функционират.
Производителност (performance). Постигането на по-висока производителност по сравнение с централизираните с-ми е най-важната преследвана цел на разпределените с-ми. Според степента на разпаралелване се различават дребнозърнест (fine-grained) и едрозърнест (coarse-grained) паралелизъм. Дребнозърнестият паралелизъм предполага паралелно изпълнение на множество малки програмни фрагменти. Степента на паралелизъм е висока, и честотата на взаимодействие м/у фрагментите е висока. При едрозърнестия паралелизъм степента на паралелизъм е по-малка, тъй като паралелно се изпълняват големи програмни фрагменти. Тяхното взаимодействие е по-слабо, което води до намаляване на комуникационните разходи.
Разширяемост (scalability). Една система е разширяема, ако остава ефективна при значително увеличаване както на ресурсите, така и на потребителите в с-мата.. Подходящи са само разпределени алгоритми, които имат следните характеристики:

  • няма единствена машина, която да събира информация за цялата на система;
  • машините вземат решения, базирани само на локално достъпна информация;
  • срив в една машина не предизвиква срив в работата на алгоритмите;

Модел клиент-сървър

1.Въведение – Той отразява взаимодействието между паралелно изпълняващи се програмни процеси. клиент-сървър, при които клиентите и сървърите се изпълняват върху различни машини, свързани в мрежа – локална (LAN) или глобална (WAN).
Комуникацията м/у клиентите и сървърите се базира на протокол без установяване на връзка, наречен протокол заявка-отговор . За комуникацията клиент-сървър в локална мрежа са необходими само три протоколни нива. Физическото и каналното ниво са необходими за доставянето на пакетите
Системното извикване send() изпраща съобщението от адрес &message на процес с идентификатор destination. Изпращащият процес да се блокира, докато съобщението не бъде изпратено. Системното извикване receive() блокира процеса, до получаване на съобщение за него.
Oсновните проблеми, които трябва да се решат са следните:

  1. Начин на адресиране на процесите;
  2. Блокиране или неблокиране на процеса при изпълнение на send() и receive();
  3. Буфериране или небуфериране на изпращаните и получавани съобщения;
  4. Осигуряване или не на надеждност при доставката на съобщенията;
  5. Избор на архитектура на сървъра – последователна или паралелна;

Възможност за разширяемост.
2.Адресиране
За да може да изпрати съобщение-заявка към нужния сървър, клиентът трябва да знае неговия адрес.
Адресът на сървъра може да бъде открит и използван по един от следните начини:
Твърдо зададен адрес в кода на програмата на клиента. Всяка промяна в адреса на сървъра, изисква преработка и прекомпилиране на програмата на клиента;
Откриване на сървъра чрез broadcast . За да се получи лесно преместваем сървър е необходимо присвояване на уникален адрес на процеса, който да не съдържа адрес на машина. Този адрес може да се получи по два различни начина: чрез обръщение към специализиран централен процес или самоназначаване на адрес. В първия случай е необходим централен процес, раздаващ последователни адреси на процесите. Във втория случай процесът сам избира собствен идентификатор от голямо разредно адресно пространство.
Преди да изпрати съобщение-заявка към сървъра клиентът трябва да открие машината, върху която той се изпълнява. За целта той изпраща по broadcast специален локализиращ пакет, съдържащ адреса на сървъра. Този пакет се приема от всички машини. В случай на положителна проверка, съответната ОС изпраща обратно съобщение към клиента, съдържащо мрежовия адрес на машината. Клиентът използва този адрес за изпращане на съобщение-заявка към сървъра.
За намаляване на трафика от broadcast съобщения клиентът може да кешира получаваните отговори. При необходимост от следващо обръщение към сървъра, клиентът първо търси адреса на машината в локалната си кеш.
Откриване на адреса чрез сървър на имена (name server) (фиг.3-c).  В този случай е необходима допълнителна машина, върху която се изпълнява сървър на имена, даващ съответствие между име на услуга и адрес на машина. Подходът дава възможност за обръщение към сървър по име на услугата, която предоставя. Името на услугата е постоянно и може да бъде заложено в програмата на клиента. При необходимост от получаване на услугата, клиентът първо се обръща към сървъра на имена, запитвайки за адреса на машината, върху която нужният  сървър текущо е зареден. След получаване на отговор с адреса на сървъра, клиентът се обръща директно към него със съобщение-заявка.
Локализация на сървър:
а) твърдо зададен адрес;
b) използване на broadcast;
c) използване на сървър на имена
3.Блокиращи и не-блокиращи комуникационни примитиви
Описаните системни извиквания send() и receive() реализират блокираща (blocking) комуникация между процесите. Този тип комуникация е известна още като синхронна (synchronous).

Блокираща (синхронна) комуникация.

Когато процес изпълни send(), той задава адреса на назначението и указва адреса на буфера, чието съдържание трябва да се изпрати по това назначение. Докато ядрото на ОС изпълни нужните действия по формиране и изпращане на съобщението, процесът се блокира. На него ще му се разреши да продължи изпълнението си със следващата след send() инструкция едва, след като съобщението бъде окончателно изпратено.
Блокиращите примитиви са лесни за реализация. Те не изискват буфериране на съобщенията в адресното пространство на ядрото, поради което съобщенията по-бързо се изпращат в мрежата.
Не-блокираща (асинхронна) комуникация.
Примитивите send() и receive() могат да бъдат реализирани и като не-блокиращи, т.е. асинхронни.
Ако send() е не-блокиращ примитив, управлението се връща на извикващия процес веднага, преди да бъде изпратено съобщението. По този начин се предоставя възможност процесът да може да продължи изпълнението си едновременно с изпращането на съобщението. Процесът в този случай обаче не може да разбере, кога съобщението е изпратено и е безопасно да използва повторно буфера за ново съобщение. Решаването на проблемa може да се постигне по два начина:
копиране на съобщението в буфер на ядрото;
генериране на прекъсване към процеса, щом съобщението бъде изпратено.
В първия случай съобщението се копира в буфер на ядрото, а буферът на процеса се освобождава. Недостатъкът се състои в това, че всяко изходящо съобщение трябва да се копира от адресното пространство на процеса в адресното пространство на ядрото. Това копиране при голяма изходяща комуникация, от една страна, може да доведе до снижаване на производителността, а от друга до загуба на съобщения, поради ограниченото пространство за буфери в системата.
При втория случай след извикване на send() на процеса се разрешава да продължи изпълнението си. Съобщението се изпраща от буфера на процеса и не се губи време за копиране. Този метод е високо ефективен и позволява висока степен на паралелизъм.

4.Буфериране

При изпълнение на примитива receive(address, &message) процесът съобщава на ОС своя адрес, по който очаква да получи съобщение (address) и буфера (&message), където да се запише пристигналото за този адрес съобщение. В случая се казва, че процесът слуша по указания адрес и е готов да получи едно съобщение, изпратено на този адрес. Когато съобщението пристигне, ядрото на ОС го записва в зададения буфер и събужда процеса . Тази реализация работи добре, ако сървърът изпълни receive() преди клиентът да извика send(). Ако send() се изпълни преди  receive(), получаващата ОС няма да знае кой от нейните процеси използва адреса, към който е адресирано новопристигналото съобщение и къде да го запише. Възможни решения на проблема са:
Отхвърляне на съобщението. Пристигналото съобщение не се приема;
Съхраняване на пристигналите съобщения в ядрото на ОС за кратко време;
Използване на буферирани примитиви. Менажирането на буферите се опростява чрез дефиниране на специална структура от данни, наречена пощенска кутия (mailbox);
Забрана на процес да изпраща съобщение, ако няма място за неговото приемане. Изпращащият процес се блокира, докато не се получи потвърждение, че изпратеното съобщение е получено.
5.Архитектура на сървър
Всеки сървър се изпълнява като спящ (sleeping) процес, който се активира при пристигане на заявка от клиент. Обикновено сървърният процес е безкраен процес. Според броя едновременно обслужвани клиенти, сървърите могат да бъдат реализирани като:
Последователни (sequential). Клиентите се обслужват последователно един по един. В този случай трябва да се организира опашка (mailbox), в която да се съхраняват постъпващите заявки от клиенти;
Паралелни (concurrent). Паралелните сървъри могат да обслужват едновременно множество клиенти. Те се състоят от един главен (master) процес и множество подчинени (slave) процеси . Главният процес е безкраен и се грижи за приемане на заявки от клиентите. Когато пристигне заявка, той създава нов процес за обслужването й. Пример за многопроцесна реализация е Web сървърът Apache за

Unix и Linux.

С паралелната реализация на сървърите
се постига висока ефективност на обслужване на клиентите. Недостатъкът се състои в значителната системна работа, необходима за създаване, унищожаване и превключване на процесите. Тя може да бъде съкратена, ако вместо подчинени процеси се използват нишки (threads). Работата на сървъра при организация с нишки е аналогична. Главната нишка приема потребителските заявки и за изпълнението на всяка заявка назначава подчинена нишка. Пример за многонишкови сървъри са Web сървърите IIS и Apache върху Windows платформа.
Сървърите могат да изпълняват клиентските заявки:
Самостоятелно. Обикновено сървърът извършва сам всички логически последователности от действия, за да изпълни клиентската заявка;
Взаимодействайки с други сървъри. В редица случаи сървърът не може самостоятелно да обслужи клиента, обикновено поради липса на достъп до нужната информация. В този случай той може да потърси съдействието на други сървъри, изпращайки им заявки. По аналогичен начин работят DNS сървърите.

Команди за работа с файлове и директории

Структура на директориите в Linux

Файловата система на Linux е йерархична дървовидна структура от директории . Главната директория се нарича корен и се отбелязва със символа ‘/’. Тя съдържа списък на директориите от първо ниво, всяка от които съдържа списък на директории от второ ниво (поддиректории) и (или) файлове и т.н.
Предназначението на най-важните директории от първо ниво е следното:
/bin – съдържа най-важните команди на UNIX;
/sbin – разширява директорията /bin с команди, използвани предимно от най-привилегирования потребител;
/usr е корен на поддърво, директориите на което съдържат: изпълними файлове на команди (/usr/bin), стандартни библиотеки (/usr/lib), справочни файлове (/usr/man), команди за администриране и др.
/boot – съдържа файлове, използвани по време на начално зареждане на системата;
/etc – съдържа специфични за машината конфигурационни файлове;
/var. Поддървото на /var съдържа файлове, които се променят по време на работа на системата. Това са директории с опашки към различни устройства (например принтери) или програми (електронна поща, новини и др.), журнални файлове, временни файлове и т.н.;
/root – домашна директория на най-привилегирования потребител;
/dev – съдържа специални файлове за всички устройства на машината;
/home. Тази директория съдържа потребителските “домашни” (home) директории. Започвайки от своята home директория всеки потребител може да строи собствено дърво на директории, достъпно само за него;
/proc – поддървото на /proc се разполага в паметта, а не върху диска. Използва за съхраняване на информация за процесите и за системата, която се използва динамично по време на работа.
1.2    Спецификация на файл
За да може да се работи с даден файл, той трябва да бъде напълно определен. Пълната спецификация на файл включва:
<пътека>/име,където:
<пътека> – пътека до файла;
име – име на файла.
Пътеката задава местоположението на файла в дървото на директориите. Имената на директориите в пътеката се отделят едно от друго със символа ‘/’. Пътеката до файл може да бъде задавана по два различни начина:
Абсолютна пътека. Определя се от коренната директория. /home/nada/books
Относителна пътека. Относителната пътека се задава от текущата директория, като текущата директория се задава със знака ‘.’.:
./books
Друг начин за задаване на относителна пътека е по отношение на потребителската home директория, която в пътеката се заменя със знака ‘~’. ~/books
Името на файла се приема от интерпретатора като еднороден символен низ, без отделени по смисъл полета. В символния низ могат да се съдържат и редица специални символи, в това число и символът ‘.’ :
‘*’ – заменя n произволни символа. В командите се използва за групиране на файлове;
‘?’ – заменя един произволен символ в името на файла;
[x-y] – задава област от символи, към която принадлежи символ от името на файла;
[a,b,c] – задава множество от символи, от което може да бъде символ в името на файла.
Например
*a?[m-x]*.b[l,m,q]?

Защита на файлове и директории

В UNIX и Linux се използват три типа права на достъп до файл:

  • Право за четене (read).  за преглеждане на файла;
  • Право за запис (write). за промяна или изтриване на файла;
  • Право за изпълнение (execution). Файлът да се стартира като програма;
  • Когато даден файл се създаде, системата присвоява определени права за достъп до него по премълчаване.
  • Правата за достъп до директориите имат различно значение по сравнение с файловете:
  • Право за четене (read). Дава право за разпечатване на съдържанието;
  • Право за запис (write). Дава право за добавяне и премахване на файлове;
  • Право за изпълнение (execution). Това право позволява получаване на информация за файловете й. Директорията може да стане текуща работна директория.
  • Според правото на собственост към определен файл потребителите се делят на три категории:
  • Собственик (user). В правата за достъп се обозначава с u. Това е потребителят, създал файла.
  • Група (group). Обозначава се с g. Групата се състои от колектив потребители.

Всеки друг потребител (other). Обозначението е o. Това е всеки друг потребител, който не е собственик или член на групата, към която принадлежи собственика.
Всеки файл има собственик и група. За всяка категория потребители правата на достъп read, write и execute трябва да бъдат разрешени или забранени. За да се визуализират правата на достъп за всяка категория потребители, може да се използва командата ls –l. Първият символ в задава неговият тип. Следващите девет символа задават правата на достъп. Те се разбиват на три групи
Правата на достъп до файл могат да бъдат променяни с командата chmod, имаща следния основен формат:
chmod <access rights> <filename>,
където аргументът <access rights> определя новите права на достъп до файла, зададен с аргумента <filename>. Аргументът <access rights> :
<user type code>+/-<access>,
където
<user type code> – задава категорията потребители, за която се отнася правото за достъп. Използват се обозначенията u, g и о. Могат да се зададат едновременно в различно съчетание;
операторите +и – определят добавяне (+) или отнемане (-) на право на достъп;
<access> – задават новите права на достъп, които се обозначават със символите r, w и x.
Пример
$    chmod u+rwx  myfile – задава за собственика на файла myfile права на достъп за четене, запис и изпълнение;
$    chmod go-w sample – отнема правото за запис на групата и на всички останали потребители към файла sample;
$    chmod u+rwx,g+rx,o+x * – задава на собственика права за четене, запис и изпълнение, на групата четене и изпълнение и на всички останали право за изпълнение за всички файлове в текущата директория.
$    chmod u+rwx,go-rwx myfile – дава пълни права за собственика и отнема всички права на групата и останалите потребители.

Команден интерпретатор в UNIX и Linux

Интерпретацията на командите към операционната система се осъществява от команден интерпретатор. Командният интерпретатор в ОС UNIX и Linux е известен като обвивка на системата (shell).
Командният интерпретатор изпълнява две основни функции:
интерпретира командите на системата, като ги чете и предава към ядрото на ОС за изпълнение.
осигурява среда за изпълнение на командите на потребителите (user environment), която може да се настройва индивидуално.
3.3    Команди за работа с директории
3.3.1. Създаване на директория
Създаване на нова директория се извършва с командата mkdir, която има следния основен синтаксис:
mkdir [<path>]/<dirname>
Пример
$ mkdir /home/nada/games  – създава поддиректория на директория nada с име games;
$ mkdir data – създава поддиректория  на текущата директория с име data.
3.3.2. Смяна на текущата работна директория
cd [<path>]/<dirname>
Пример
$    cd /home/nada/examples – текуща работна директория става директорията /home/nada/examples;
$    cd ..  – текуща работна директория става родителската директория;
3.3.3. Проверка на текущата работната директория
Пример: $ pwd
3.3.4. Извеждане съдържанието на директория
ls [<path>]/<dirname>
Пример
$ ls – извежда имената на файловете и поддиректориите на текущата работна директория;
$ ls /home/staff/ruskova/rpc – визуализира имената на файловете и поддиректориите, съдържащи се в директория /home/staff/ruskova/rpc;
$ ls –a  – опцията a предизвиква извеждане и на скритите файлове
$ ls –R – разпечатва рекурсивно съдържанието на всички поддиректории, започвайки с текущата работна директория;
$ ls –l –опцията l  предизвиква визуализация на списъка на файловете във вид на таблица.
тип на файла и права на достъп;
брой връзки към файла.
собственик на файла.
група.
дължина на файла.;
три колони, задаващи датата на създаване на файла – месец, дата, година;
име на файла.
3.3.5. Изтриване на директория
Пример
$ rmdir ~/pipe/pipe1 – изтрива директория ~/pipe/pipe1,
3.2    Команди за работа с файлове
3.4.1. Създаване на файл
Файл може да бъде създаден с командата:
cat  >  [<path>]<filename>
Непосредствено след стартиране на командата от клавиатурата се въвежда съдържанието на файла. Процедурата завършва с въвеждане на символа за край на файл Ctrl/D.
3.4.2. Изтриване на файлове
rm [<path>]<filename>
Пример
$ rm * – изтрива безусловно всички файлове от текущата директория;
$ rm –i *.c  – изтрива от текущата директория всички файлове с окончание ‘.c’, като за изтриването на всеки от тях изисква потвърждение от клавиатурата.
3.4.3. Копиране на файлове
cp[<path>]<filename1>
[path]<filename2>
Тази команда копира съдържанието на файла. Командата позволява да се копират група файлове от една директория в друга.
Пример
$ cp *.c ~/source – създава копия на всички файлове от текущата директория с имена, завършващи с ‘.c’, в директория ~/source.
3.4.4. Преименуване на файлове
mv[<path>]<filename1> [<path>]<filename2>
Командата се използва и за прехвърляне на файл или група файлове от една директория в друга.
Пример
$mv abc xyz – преименува файла abc на xyz.
$mv * ./examples/os – прехвърля всички файлове от текущата директория в поддиректория ./examples/os със същите имена.
3.4.5. Извеждане на съдържанието на файл
cat  [<path>]<filename>
more [<path>]<filename>
less [<path>]<filename>
Командите more и less извеждат съдържанието на файловете по страници за разлика от cat, чийто изход се извежда без да може да се контролира от потребителя.
Пример
$ cat myfile – извеждане на екрана съдържанието на файла myfile.
$ more myfile – извежда по страници съдържанието на файла myfile.
3.4.6. Сравняване на файлове
Командата
cmp[<path>]<filename1>  [<path>]<filename2>
сравнява съдържанието на файловете, зададени като първи и втори аргумент.
Командата
diff[<path>]<filename1>  [<path>]<filename2>
сравнява съдържанието на файловете, зададени като първи и втори аргумент и формира листинг с откритите разлики, който се визуализира на екрана.
Командата
diff3[<path>]<filename1> [<path>]<filename2> [<path>]<filename3>
сравнява едновременно три файла.
3.4.7. Търсене на символен низ във файлове
Зададен символен низ може да се търси във файл или група файлове с командата:
grep  “<string>”  [<path>]<filename> …
Командата grep търси указания като първи аргумент символен низ в зададените чрез следващите аргументи файлове и извежда списък от редовете, в които символният низ е намерен.
Пример
$ grep “Hello world” *.c – търси символния низ “Hello world” във всички файлове от текущата директория, чиито имена окончават на “.c”.
3.4.8. Анализ на съдържанието на файл
wc  [<path>]<filename>
извежда анализ на съдържанието на зададения файл във вид брой символи, брой думи и брой редове.
Пример
wc –cw myfile.c – извежда броя символи и броя думи, от които се състои съдържанието на файла myfile.c.

4.Получаване на помощна информация
4.1. Справочни страници (manual pages)
за вътрешните команди с командата help:
help [<command_name>]

5.Пренасочване на входния и изходния потоци
При създаване на процес за изпълнение на дадена команда към него се привързват устройства или файлове, от които той получава необходимите входни данни и извежда изходните резултати. Устройството, от което постъпва входният поток данни, се нарича (stdin), а устройството, което извежда изходният поток данни, се нарича (stdout). Освен stdin и stdout се задава и стандартен изход за грешки (stderr), където се  извеждат съобщенията за грешка. По премълчаване stderr и stdout са привързани към едно и също устройство – монитора на компютъра.
Свойството на UNIX и Linux да работят по един и същ начин с устройства и файлове позволява пренасочване на стандартните вход, изход и изход за грешки към други устройства или файлове. За тази цел се използват символите:

  • ‘>’ – пренасочване на стандартния изход;
  • ‘<’ – пренасочване на стандартния вход;
  • ‘2>’ – пренасочване на стандартния изход за грешка;
  • ‘>&’ – пренасочване и на стандартния изход и на стандартния изход за грешка;
  • ‘>>’ – добавяне на изходния поток към края на файл.

Пример
Пренасочването е демонстрирано с използване на командата cat.
$ cat – командата cat по премълчаване приема входния си поток данни от клавиатурата и изпраща изходния поток данни на екрана на монитора на компютъра.
$ cat > dat.txt – изходният поток на cat се пренасочва към файла dat.txt;
$ cat < dat.txt – входният поток е от файла dat.txt. Съдържанието на файла dat.txt се разпечатва на стандартния изход – екрана на компютъра. Този запис на командата е еквивалентен на:
$ cat dat.txt
$ cat < oldfile > newfile – пренасочване на входния поток от файла oldfile и на изходния поток към файла newfile. По този начин се създава копие на входния файл oldfile. Действието е еквивалентно на командата cp. Може да се запише още като:
$ cat oldfile > newfile
$ cat oldfile1 oldfile2 > newfile – извършва конкатенация на съдържанието на файловете oldfile1 и oldfile2 и я записва във файла newfile. Командата може да конкатенира повече от два файла.
Ако файлът, към който се насочва изходът не съществува, то той се създава. Ако файлът съществува, старото му съдържание се препокрива.
$ > file – ако файлът file съществува, неговото съдържание се нулира. Ако не съществува се създава нов файл с това име и с нулево съдържание;
$ cat < file1 >> file2 – Съдържанието на файла file1 се добавя към съдържанието на файла file2. С тази команда се осъществява обединяване на два и повече файла;
$ cat file1 file2 >> file3 – конкатенира съдържанието на file1 и file2 и го добавя към края на файл file3.
Пренасочване на стандартния изход за грешка може да се извърши по следния начин:
$ gcc myfile.c 2> errorfile – пренасочва съобщенията за грешки от компилатора gcc към файл errorfile;
$ gcc myfile >& errorfile – пренасочва и изходния поток и изхода за грешки от компилатора gcc към файла errorfile.
В определени случаи може да се наложи да се спре стандартният изход и да се предотврати неговото извеждане върху екрана. За тази цел се използва пренасочване към специален файл с име /dev/null. Файлът /dev/null е уникален с това, че насочените към него данни изчезват.
Пример
$ gcc myfile.c 2> errorfile >/dev/null – съхранява във файла errorfile съобщенията за грешки от компилатора gcc, като едновременно с това игнорира стандартния изход.
6.Конвейери от команди
Понякога се налага на една команда да работи с изходните данни, генерирани от друга команда. Например получаване на броя на файловете в дадена директория може да се реализира със следната последователност от команди:
$ ls ~/examples > tmpfile
$ wc –w tmpfile
$ rm tmpfile
Каналът се отбелязва със символа ‘|’. Свързаните с канал команди образуват команден конвейер, който има следния вид:
<command> | <command>
Конвейерът за получаване на броя на файловете в дадена директория ще има следния вид:
$ ls ~/examples | wc –w
Пример
$  ls | grep “tgz” | wc –w – извежда броя на файловете от текущата директория, в чиито имена се съдържат символите ‘tgz’;
$ who | wc –l – извежда броя на текущо работещите потребители в системата.
Пренасоченият изходен поток не се визуализира на екрана.
Пример
$  ls | grep “tgz” | tee /dev/tty | wc –w – междинният резултат от работата на командата grep се разклонява от командата tee към екрана на монитора, зададен със специалния файл /dev/tty и към следващата команда в конвейера wc;
$ ls | grep “tgz” | tee /dev/tty save_file | wc –w – междинният резултат се извежда на екрана и се съхранява във файла save_file.
Най-често конвейерът се използва за разбиване на изходния поток на дадена команда с цел извеждане на екрана по страници. Извеждането по страници се осъществява с командите more и less.
Пример
$ cat myfile | more – извежда по страници съдържанието на файла myfile.

Потребители и групи

Операционните системи UNIX и Linux са многопотребителски операционни системи и позволяват едновременна работа в системата на множество потребители. Всеки потребител се регистрира в системата с уникално потребителско име (username). Достъпът на потребител в системата се контролира чрез потребителското име и парола. Потребителските имена и пароли в криптиран вид се съхраняват във файла /etc/passwd. Освен потребителско име на всеки потребител се присвоява уникален идентификационен номер (user identification number – UID).
Информация за текущо работещите в системата потребители може да се получи с командите:
who – визуализира текущо работещите потребители;
w – визуализира сумарна и индивидуална информация за текущо работещите потребители и техните процеси.
finger – освен име на потребител, терминал и хост, командата извежда и личното име на всеки потребител, както и информация за неговото работно място и телефон;
finger –l – извежда многоредова информация за потребителите;
whoami – извежда потребителското име на текущия потребител;
who am I – извежда информация за текущия потребител във същия формат, както командата who.
Определен брой потребители се обединяват в групи, за да могат съвместно да използват определени файлове.  Всяка група има име и групов идентификационен номер (group identification number – GID), който се използва от системата за идентификация на групата. Съвместно потребителският UID и груповия GID определят типа на достъп, който потребителят има към файловете и другите системни ресурси. Информацията за групите се съхранява във файла /etc/group.
Групите, към които принадлежи потребител могат да се визуализират с командата groups, имаща следния формат: groups [<username>],
където username е потребителско име.
Пример
$ groups – извежда списък от групите, към които принадлежи текущия потребител;
$ groups charly – извежда списък от групите, към които принадлежи потребител с потребителско име charly.
С командата id се визуализират потребителския и груповия идентификатор на потребителя.

Сходни статии:

  1. Процеси в Linux Типове Linux процеси Определение за процес е изпълняваща се програма. Докато самата програма с нейните данни се съхранява във файл върху диск и поради тази причина се разглежда като пасивен обект, процесът изпълнява определена работа в системата и е динамичен...
  2. Програмно осигуряване на CAD/CAM системи Програмното осигуряване може да се представи в четири части: базово програмно осигуряване, чиято основна компановка е операционната система; графично програмно осигуряване; база данни и системи за тяхното управление; Приложно програмно осигуряване При Програмно осигуряване на CAD/CAM системата могат да се...
  3. Поддържащи услуги в агентните системи В стандартизираните модели на FIPA са дефинирани две групи поддържащи услуги за агентните системи: за управление и за трансфер на съобщения. Основната роля на услугите за управление е установяване на мястото, където агентът е регистриран, услугите, които предлага, ограничения на...
  4. Мултимедийни системи и технологии във Виртуалната реалност Ръкавици. Ръкавиците все още не се използват масово във VR поради високата си цена. Най-често за отчитане движението на потребителя се използва технология от вградени еластични световоди и датчици. Когато потребителят свие например пръст от ръката, то в съответния световод...
  5. Протоколи и услуги ориентирани към пренасяне на информация TCP (Transfer Control Protocol) – протокол за управление на обмена на информация. Този протокол обслужва връзките. Данните се изпращат на пакети, които съдържат заглавна част и данни. Надеждността на обмена се осигурява от контролни суми и сравнения между изпратената и...
  6. Мениджърски информационни системи МИС работят с предварително ясно определени информационни потоци, прилагат сравнително елементарни из4ислителни процедури за обобщаване на информацията, използвана от мениджърите  на тактическо ниво за целите на контрол, мониторинг, планиране и организиране на дейностите във фирмата. Екзекутивни и стратегически информационни системи...

Responses are currently closed, but you can trackback from your own site.

One Response to “Разпределени и мрежови операционни системи”

  1. [...] пасивен обект, процесът изпълнява определена работа в системата и е динамичен обект. Той постоянно се променя с [...]

Subscribe to RSS Feed Follow me on Twitter!