Программирование в операционных системах
Основные правила программирования на СИ++, SHELL, AWK при работе с операционными системами семейства UNIX. Теоретические аспекты и примеры использования языков программирования. Характеристика правил разработки командных файлов в ОС UNIX, MSDOS.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | методичка |
Язык | русский |
Дата добавления | 17.02.2012 |
Размер файла | 52,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Системный вызов exit
Системный вызов exit (завершить процесс) имеет следующий формат:
exit (arg)
int arg;
Параметр arg имеет смысл, определенный в описании вызова wait.
Системный вызов ехit завершает процесс. При этом выполняется очистка некоторых областей памяти, например буферов ввода-вывода. Восемь младших битов аргумента передаются процессу-предку. Возвращаемое значение равно нулю.
Ниже приводится пример использования системных вызовов fork, wait, exit
main ()
{
int pid, status, died;
switch (pid=fork()) /* порождаем новый процесс */
{
саsе -1: /* аварийное завершение */
printf («Can't fork\n»);
ехit(-1);
саsе 0: /* процесс-потомок */
рrintf («I am the child\n»);
exit (3);
default: /* процесс предок ожидает окончание процесса-потомка */
died = wait (&status);
}
printf («Child was %d\n», pid);
printf (« %d died \n», died);
printf («Exit value %d\n», status>>8);
printf («Exit status %d\n», status &0377);
exit (0);
}
Системные вызовы ехес1, ехес1е, ехесv и ехесvе
Системные вызовы ехес1, ехес1е, ехесv и ехесvе (выполнить файл) имеют форматы:
execl (name, arg0, arg1, arg2, …, 0)
char *name;
char *arg0, *arg1, *arg2, …
execle (name, arg0, arg1, arg2, …, 0, envp)
char *name;
char *arg0, *arg1, *arg2, …
charn *envp[ ];
execv (name, argv)
char *name, *arg[ ];
execve (name, argv, envp)
char *name, *arg[ ], *envp[ ];
Системные вызовы ехес1, ехес1е, ехесv и ехесvе заменяют программу текущего процесса. Новая программа загружается из файла с именем namе, который либо является исполняемым, либо содержит интерпретируемую программу.
Исполняемый файл должен иметь соответствующий формат. Значения передаваемых параметров содержатся:
- для системных вызовов ехес1 и ехес1е - в списке указателей на строки аrg0, arg1...;
- для системных вызовов ехесv и ехесvе - в массиве argv, в виде текстовых строк.
По принятому в системе UNIX соглашению, программе должен передаваться хотя бы один параметр - имя этой программы. Обычно, в качестве имени программы используется базовое (без указания "пути") имя файла name.
Массив envp содержит имена и значения макропеременных среды процесса. Новая программа наследует все открытые файлы, за исключением тех, для которых установлен флаг с1оsе-оn-ехес. Все сигналы, которые игнорировались до выполнения вызовов ехес1, ехес1е, ехесv и ехесvе, будут игнорироваться и после их выполнения. Однако, все. установленные ранее варианты реакций на сигналы заменяются на стандартные.
Каждый процесс имеет реальные и эффективные идентификаторы пользователя и группы. Реальные идентификаторы соответствуют идентификаторам пользователя, который запустил данный процесс, а эффективные определяют права доступа процесса.
Если статус файла с именем name содержит признак set-UID, то при выполнении новой программы изменяются права доступа процесса, т.е. эффективные идентификаторы процесса заменяются на значение идентификаторов владельца файла с именем name. Когда программа начинает выполняться, она вызывается следующим образом:
main (argc, argv, envp)
int argc;
char **argv, **envp;
где argc - количество аргументов в массиве argv, а argv - массив символьных указателей на сами аргументы.
Возврат из системных вызовов ехес1, ехес1е, ехесv, ехесvе всегда означает ошибку. При этом возвращается значение -1 и код ошибки в переменной еггnо. Если данный процесс выполняется в привилегированном режиме, то его полномочия не изменяются, даже если статус файла содержит признак set UID (set-GID).
Ниже приводится пример использования системных вызовов fork, wait, exit, execl.
main()
{
int pid, status;
switch(pid=fork()) /* порождаем новый процесс */
{
case -1: /* аварийное завершение */
printf («Can' t fork\n»);
exit(1);
case 0: /* процесс-потомок */
printf («I am the child\n»);
execl («/bin/echo», «echo», «Hello mike!», 0);
/* запускаем команду echo «Hello mike!» */
printf («Exec error\n»); /* процесс предок */
wait (&status);
/* ожидаем завершение процесса-потомка */
}
/* Процесс-отец выводит на экран код завершения и статус завершения
процесса-потомка */
printf («Exit value %d\n», status>>8);
printf («Exit status %d\n, status & 0377);
exit(0);
}
Системный вызов getpid
Системный вызов getpid возвращает значение идентификатора текущего процесса. Системный вызов getpid (запрос идентификатора текущего процесса) имеет следующий формат:
int getpid( )
Системные вызовы getgid, getegid
Системные вызовы getgid, getegid (запрос идентификатора группы) имеют форматы:
int getgid( )
int getegid( )
Вызов getgid возвращает реальный идентификатор группы текущего процесса, а вызов getegid - эффективный идентификатор группы. Реальный идентификатор группы определяется при регистрации в системе. Эффективный идентификатор определяет дополнительные права доступа при выполнении программы в режиме set-GID (установка идентификатора группы владельца выполняемого файла).
Системные вызовы getuid, geteuid
Системные вызовы getuid, geteuid (запрос идентификатора пользователя) имеют следующие форматы:
int getuid ( )
int geteuid ( )
Системный вызов getuid возвращает реальный идентификатор пользователя для текущего процесса, a geteuid возвращает эффективный идентификатор пользователя. Реальный идентификатор пользователя совпадает с идентификатором, под которым пользователь зарегистрирован в системе. Эффективный идентификатор определяет права доступа пользователя в текущий момент. Такой механизм позволяет программе, работающей в режиме set-UID (установка прав доступа владельца объектного файла), определять, кто ее вызвал.
Системный вызов setgid
Системный вызов setgid (установить реальный идентификатор группы процесса) имеет формат:
setgid (rgid) int rgid;
Системный вызов setgid устанавливает идентификатор группы текущего процесса в соответствии с значением параметра rgid. Изменять реальный идентификатор группы можно только в процессе, работающем в привилегированном режиме. В обычном режиме допускает только замена эффективного идентификатора на значение соответствующее реальному идентификатору группы процесса. При успешном завершении, возвращается значение 0, иначе -значение -1 и код ошибки в переменной еrrnо. Код ошибки может принимать значение
[EPERM] (текущий процесс не является привилегированным, и были специфицированы изменения, отличные от замены эффективного идентификатора группы на реальный).
Системный вызов setuid
Системный вызов setuid (установить реальный идентификаторы пользователя) имеет следующий формат:
setuid (ruid) int ruid;
Системный вызов setuid устанавливает текущему процессу реальный идентификатор пользователя в соответствии со значением параметра ruid. Изменять реальный идентификатор пользователя можно только в процессе, работающем в привилегированном режиме. В обычном режиме допускается только замена эффективного идентификатора на значение, соответствующее реальному идентификатору. При успешном завершении вызова, возвращается значение О, иначе - значение -1 и код ошибки в переменной еrrnо.
Код ошибки:
[EPERM] - текущий процесс не является привилегированным, и были специфицированы изменения, отличные от замены эффективного идентификатора на реальный.
Ниже приведен пример программы, распечатывающей на стандартный вывод информации о реальных и эффективных идентификаторах пользователя и группы для текущего выполняемого процесса, а также его идентификатор.
main ( )
{
int pid,uid, gid;
int euid, egid;
pid = getpid();
uid *= getuid();
gid = getgid;
euid = geteuid();
egid = getegid();
printf("\tProcess: PID = %d\n", pid);
printf («uid = %d gid = %d\n", uid, gid);
printf("euid = %d egid = %d\n", euid, egid);
}
Системный вызов nice
Системный вызов nice (установить процессу приоритет) имеет следующий формат:
nice (incr)
Системный вызов nice устанавливается текущему процессу новый приоритет, равный текущему приоритету плюс значение аргумента incr. Значение аргумента incr должно лежать в определенном диапазоне, конкретные границы которого зависят от версии ОС UNIX.
UNIX 7. Диапазон значений incr лежит в пределах от -20 до 20. Отрицательное приращение может задавать только привилегированный пользователь.
UNIX System V. Диапазон значений incr лежит в пределах от 0 до 39. Приращения, выходящие за границы этого диапазона, уменьшаются до граничных значений. Чем выше значение аргумента incr, тем ниже устанавливаемый приоритет.
При успешном завершении вызова, возвращается новое значение приоритета минус 20, иначе - значение -1 и код ошибки в переменной еrrnо.
Код ошибки:
[EPERM] Значение incr не лежит в пределах установленного диапазона и эффективный идентификатор владельца процесса не является идентификатором суперпользователя.
Приведенная ниже программа является исходным текстом команды nice UNIX версии System V (вызова какой-либо команды на выполнение с измененным приоритетом):
nice {приращение приоритета} команда
#inc1ude <stdio.h>
#include<ctype.h>
main (argc, argv) int argc; char *argv [];
{
int nicarg = 10; /* приращение приоритета по умолчанию */
extern errno;
/* Разбираем аргументы команды */
if(argc > 1 && argv[l][0] = `-`) { /* если задано приращение приоритета */
register char *p = argv[l];
if(*++p != `-`) --р;
whi1e(*++p)
if(!isdigit(*p)) { /* указано не числовое значение */
fprintf(stderr, "nice: argument must be numeric.\n");
exit(2);
}
nicarg == atoi (&argv[l] [1]);
/* в переменной nicarg записываем значение приращения приоритета */
argc--;
argv++;
}
if (argc < 2) { /* если не задана команда */
fprintf(stderr, "nice: usage: nice [-num] command\n");
exit(2);
}
nice(nicarg); /* изменяем приоритет процесса */
execvp(argv [1], &argv[l]); /* выполняем команду */
fprintf(stderr. "%s: %d\n", argv[l], errno);
/* если ошибка при запуске команды, то печатаем переменную errno */
exit(2);
}
Дополнительно: Для просмотра запущенных в системе процессов используется команда ps, команда top делает моментальный снимок запущенных в системе процессов, команда nice позволяет изменить приоритетность процесса, команда kill служит для уничтожения процесса.
Практическое задание к выполнению лабораторной работы на тему «СИ. Управление процессами»
1. Просмотреть запущенные в системе процессы.
2. Просмотреть запущенные в системе процессы с указанием их идентификаторов,
3. На втором терминале запустить редактор vi.
4. Определить идентификатор этого процесса.
5. Войти в систему непривилегированным пользователем на третьем терминале.
6. Уничтожить данный процесс.
7. Написать на shell сценарий. Меню выбора: 1 - Просмотр процессов. 2 - Выход. Запуск сценария обеспечивает просмотр запущенных в системе процессов.
8. Написать СИ-программу с использованием функций fork(), execl(), wait(), exit(). Откомпилировать программу и запустить на выполнение.
2.4 Управление оперативной памятью
Цель лабораторной работы: изучение возможностей языка программирования СИ, СИ++ для обращения к ячейкам оперативной памяти, управления ОП.
Основные понятия. Указатели на простые переменные
Указатель - это адрес памяти, распределяемой для размещения идентификатора (в качестве идентификатора может выступать имя переменной, массива, структуры, строкового литерала). В том случае, если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находиться скалярная величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя: спецификатор-типа [модификатор] * описатель
Спецификатор-типа задает тип объекта и может быть любого основного типа, типа структуры, смеси. Задавая вместо спецификатора-типа ключевое слово void, можно своеобразным образом отсрочить спецификацию типа, на который ссылается указатель. Переменная, объявляемая как указатель на тип void, может быть использована для ссылки на объект любого типа. Однако для того, чтобы можно было выполнить арифметические и логические операции над указателями или над объектами, на которые они указывают, необходимо при выполнении каждой операции явно определить тип объектов. Такие определения типов может быть выполнено с помощью операции приведения типов.
В качестве модификаторов при объявлении указателя могут выступать ключевые слова const, near, far, huge. Ключевое слово const указывает, что указатель не может быть изменен в программе. Размер переменной объявленной как указатель, зависит от архитектуры компьютера и от используемой модели памяти, для которой будет компилироваться программа. Указатели на различные типы данных не обязательно должны иметь одинаковую длину.
Для модификации размера указателя можно использовать ключевые слова near, far, huge.
Примеры:
unsigned int * a; // переменная а представляет собой указатель
// на тип unsigned int (целые числа без знака)
double * x; // переменная х указывает на тип данных с
// плавающей точкой удвоенной точности //
char * fuffer ; // объявляется указатель с именем fuffer,
// который указывает на переменную типа char
double nomer;
void *addres;
addres = & nomer;
(double *)addres ++;
Переменная addres объявлена как указатель на объект любого типа. Поэтому ей можно присвоить адрес любого объекта (& - операция вычисления адреса). Однако, как было отмечено выше, ни одна арифметическая операция не может быть выполнена над указателем, пока не будет явно определен тип данных, на которые он указывает. Это можно сделать, используя операцию приведения типа (double *) для преобразования addres к указателю на тип double, а затем увеличение адреса.
const * dr;
Переменная dr объявлена как указатель на константное выражение, т.е. значение указателя может изменяться в процессе выполнения программы, а величина, на которую он указывает, нет.
unsigned char * const w = &obj.
Переменная w объявлена как константный указатель на данные типа char unsigned. Это означает, что на протяжении всей программы w будет указывать на одну и ту же область памяти. Содержание же этой области может быть изменено.
Указатель на величину одного типа может быть преобразован к указателю на величину другого типа. Однако результат может быть не определен из-за отличий в требованиях к выравниванию и размерах для различных типов.
Указатель на тип void может быть преобразован к указателю на любой тип, и указатель на любой тип может быть преобразован к указателю на тип void без ограничений. Значение указателя может быть преобразовано к целой величине. Метод преобразования зависит от размера указателя и размера целого типа следующим образом:
- если размер указателя меньше размера целого типа или равен ему, то указатель преобразуется точно так же, как целое без знака;
- если указатель больше, чем размер целого типа, то указатель сначала преобразуется к указателю с тем же размером, что и целый тип, и затем преобразуется к целому типу.
Целый тип может быть преобразован к адресному типу по следующим правилам:
- если целый тип того же размера, что и указатель, то целая величина просто рассматривается как указатель (целое без знака);
- если размер целого типа отличен от размера указателя, то целый тип сначала преобразуется к размеру указателя (используются способы преобразования, описанные выше), а затем полученное значение трактуется как указатель.
Массивы и указатели на массивы
С++ и С интерпретируют имя массива как адрес его первого элемента. Таким образом, если x - массив, то выражения &x[0] и x эквивалентны. В случае матрицы - назовем ее mat - выражения &mat[0][0] и mat также эквивалентны.
С++ позволяет использовать указатели для обращения к разным элементам массива. Когда Вы вызываете элемент x[i] массива x , то выполняются две задачи: получит базовый адрес массива, т.е. узнать где находится первый элемент массива и использовать i для вычисления смещения базового адреса массива. Фактически, если есть указатель ptr на базовый адрес массива, т.е.
prt = x;
то можно записать :
адрес элемента x[i] = адрес x + i * sizeof(базовый тип)
или
адрес элемента x[i] = ptr + i * sizeof(базовый тип)
В С++ это записывается более коротким образом
адрес элемента x[i] = ptr + i
При последовательном обращении к элементам массива можно использован метод инкремента/декремента указателя, т.е. операцию ++ и --, например
ptr++
a = * ptr++
a = * (ptr--)
Указатели на структуры
С++ поддерживает объявление и использование указателей на структуры. Для присвоения адреса структурной переменной указателю того же типа используется тот же синтаксис, что и в случае простых переменных. После того, как указатель получит адрес структурной переменной, для обращения к элементам структуры нужно использовать операцию ->.
Общий синтаксис для доступа к элементам структуры с помощью указателя имеет вид
structPtr -> aMember
где structPtr -указатель на структуру, aMember - элемент структуры.
Пример:
struct point
{
double x;
double y;
};
point p;
point* ptr = & p;
ptr->x = 23.3;
ptr->y = ptr->x + 12.3;
Динамическое распределение ОП
Операции new и delete. Существует много приложений, в которых необходимо создавать новые переменные и динамически распределять для них память во время выполнения программы. В языке С для этого имеются функции динамической памяти, такие как malloc, calloc, free. В С++ введены новые операции - new и delete, которые лучше контролируют тип создаваемых динамических данных. К тому же эти операции работают с конструкторами и деструкторами ( раздел объектно-ориентированное программирование).
Операции new и delete имеют следующий синтаксис:
указатель = new тип;
delete указатель;
Операция new возвращает адрес динамически распределенной переменной. Операция delete освобождает динамически распределенную память, на которую ссылается указатель.
Если динамическое распределение памяти с помощью операции new потерпело неудачу, оно выбрасывает исключение типа xalloc, объявленное в заголовочном файле EXCEPT.H, поэтому часто динамическое распределение памяти осуществляется внутри блока try. Пример:
try
{
int *pint;
pint = new int;
*pint = 33;
cout << «Указателю выделена память и в ней хранятся данные» << *pint << endl;
delete pint;
}
catch (xalloc&)
{
cout << «Ошибка при выделении памяти» << endl;
Практическое задание к выполнению лабораторной работы на тему «СИ++. Управление оперативной памятью»
1. Написать программу, в которой инициализация переменных различного типа осуществляется с помощью указателей. Значения переменных выводятся на экран.
2. Написать программу, определяющую минимальное, максимальное значения элементов одномерного массива. Элементы массива вводятся с клавиатуры с использованием указателей.
3. Вывести на экран номер элемента одномерного массива, его значение, адрес ячейки памяти с использованием указателей. Элементы массива вводятся с клавиатуры.
4. Написать программу, суммирующую элементы одномерного массива. Элементы массива вводятся с клавиатуры. Ввод данных, обращение к элементам массива осуществляется с помощью указателей.
5. Отсортировать элементы массива. Ввод данных осуществляется с использованием указателей.
6. Написать программу с использованием переменной типа структура. Ввод/вывод, обращение к элементам структуры осуществляется с помощью указателей.
7. Написать программу с использованием операций new, delete (например, просуммировать элементы массива, память под массив распределить динамически).
КОНТРОЛЬНЫЕ ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
1. Что изучает курс «Системное программное обеспечение».
2. Основной принцип модульного программирования.
3. Почему в системном программировании используется язык СИ?
4. Исходный код, объектный код, исполняемый код. Что это такое?
СИ++:
5. Как определить константы с использованием директивы #define?
6. Как определить формальные константы?
7. Как определить размер данных, занимаемых переменной?
8. Как обратиться к элементу массива?
9. Как объявить двумерный массив?
10. Как объявить массив и присвоить начальные значения для матрицы?
11. Какие бывают форматы объявления перечисления?
12. Что такое структура?
13. Какой синтаксис имеет определение структуры? Приведите пример определения структуры.
14. Приведите пример определения экземпляра структуры с использованием тега.
15. Как обратиться к элементу структуры? Приведите пример.
16. Чем отличается объединение от структуры с точки зрения использования памяти?
17. Приведите пример объединения.
18. Приведите пример инициализации составного объекта: структуры, объединения.
19. Для чего используются указатели?
20. Какой синтаксис объявления указателя? Приведите пример объявления указателя.
21. Приведите пример присвоения указателю конкретного значения.
22. Приведите пример объявления указателя на структуры и его использования в тексте программы.
23. Для чего в СИ используется ключевое слово typedef?
24. Что такое функция?
25. Чем функция main отличается от других функций?
26. Что находится в заголовочных файлах?
27. Каким образом они подключаются к программе?
28. Что происходит, если выполнение функции не заканчивается командой return?
29. Данные какого типа не может возвращать функция?
30. Какой тип используется для функции, не возвращающей значения?
31. Что такое список формальных параметров?
32. Что такое спецификатор типа функции?
33. Что содержит тело функции?
34. Что такое рекурсивная функция?
35. Могут ли передаваться данные функции main?
36. Для чего используются глобальные внешние переменные?
37. Что такое время жизни объекта?
38. Что такое область видимости объекта?
39. Какие бывают спецификаторы класса памяти? Чем они отличаются?
40. Чем отличается использование локальных и глобальных переменных?
41. Что такое директивы препроцессора?
42. Что такое макроподстановки? Приведите пример.
43. Что такое встроенные функции?
44. Классы. Пример объявления.
45. Конструкторы. Пример объявления.
46. Деструкторы. Пример объявления.
47. Наследование. Пример объявления производного класса.
48. Системные вызовы creat, read, open, write, close. Примеры использования.
49. Системные вызовы fork, execl, wait, nice, exit. Примеры использования.
СПИСОК ЛИТЕРАТУРЫ
1. Герхард Франкен, Сергей Молявко MS DOS для пользователя. - Киев, 1993.
2. Теренс Чан Системное программирование на СИ++ для Unix. / Под ред. Коломыцева, Киев, 1997.
3. Э. Немет, Г. Снайдер Unix. Руководство системного администратора. - Киев: BHV, 1997.
4. Дегтярев Е.К. Введение в Unix. - М.: Память, 1992.
5. Свиридов С.В. Системные вызовы ОС UNIX. - М.: Память, 1992.
6. Страуструп Б. Язык программирования СИ++/ Пер с англ. - М.: Радио и связь, 1991.
7. Дунаев С. UNIX-сервер. Настройка, конфигурирование, работа в операционной среде, Internet-возможности: в 2-х томах. Том 1. - М.: Диалог-МИФИ, 1999.
8. Дунаев С. UNIX-сервер. Настройка, конфигурирование, работа в операционной среде, Internet-возможности: в 2-х томах. Том 2. - М.: Диалог-МИФИ, 1999.
9. Шамер Л., Негус К. UNIX (серия «Без проблем») / Пер. с англ. - М.: Бином, 1998.
10. Д. Такет, С. Барнет Специальное издание. Использование LINUX / Пер. с англ.-4-е изд. - К.:, Н.:, СПб.: Издательский дом «Вильямс», 1999.
Размещено на Allbest.ru
Подобные документы
Компиляция программ на языке C/C++. Компиляция нескольких файлов. Библиотеки объектных файлов. Создание статической и динамической библиотеки. Функции работы. Создание динамической библиотеки для решения системы линейных уравнений.
курсовая работа [27,4 K], добавлен 07.08.2007История развития ОС UNIX, ее достоинства. Управление компьютером под управлением UNIX. Интерпретация командной строки и структура файловой системы. Команды управления процессами. Средства системного администрирования и учетные записи пользователей.
презентация [78,1 K], добавлен 12.05.2014История появления операционной системы Unix. Перекомпиляция Unix в коды любой аппаратной платформы, ее многозадачность и многотерминальность. Основные отличия Unix от других операционных систем. Использование Unix в качестве сервера и рабочей станции.
реферат [28,1 K], добавлен 05.04.2010Интерфейс API, реализация функций API на уровне ОС, системы программирования и с помощью внешних библиотек. Характеристики сетевого интерфейса прикладного программирования Winsock, особенности его применения в операционных системах UNIX и Windows.
контрольная работа [74,2 K], добавлен 04.06.2015Изучение основных правил проектирования операционных систем. Структура файловой системы. Компоненты, обеспечивающие способы организации, поиска и управления информацией. Краткий обзор специальных и обыкновенных файлов. Основные команды системы UNIX.
методичка [36,4 K], добавлен 02.12.2009Сущность и принцип работы операционной системы, правила и преимущества ее использования. Возможности различных операционных систем, их сильные и слабые стороны. Сравнительная характеристика систем Unix и Windows NT, их потенциал и выполняемые задачи.
реферат [10,5 K], добавлен 09.10.2009Понятия языка программирования, разновидности и характеристика языков. Исторический обзор их создания и применения. Классификация, примеры использования. Характеристики языков программирования с точки зрения элементов объектной модели, их популярность.
реферат [463,6 K], добавлен 07.09.2009Понятие и особенности операционной системы UNIX как одной из самых популярных в мире операционных систем, история разработки и развития. Оценка возможности постоянного наращивания мощности кластера путем присоединения дополнительных компьютеров.
презентация [6,1 K], добавлен 23.10.2013Иерархическая структура файловой системы Unix. Согласованная обработка массивов данных, возможность создания и удаления файлов, буферный кэш. Защита информации, трактовка периферийных устройств как файлов. Внутренняя структура файловой системы Unix.
реферат [102,2 K], добавлен 23.03.2010Эволюция и классификация ОС. Сетевые операционные системы. Управление памятью. Современные концепции и технологии проектирования операционных систем. Семейство операционных систем UNIX. Сетевые продукты фирмы Novell. Сетевые ОС компании Microsoft.
творческая работа [286,2 K], добавлен 07.11.2007