9. Вычислительные потоки Unix (Linux). Управление потоками. Файловая система Unix (верхний уровень представления).
Поток выполнения - в вычислительной технике, наименьшая последовательность запрограммированных команд, которые могут независимо управляться планировщиком, являющимся частью операционной системы. Реализация потоков и процессов различается в операционных системах, но в большинстве случаев поток является составной частью процесса. Несколько потоков могут существовать в одном процессе, одновременно выполняться и совместно использовать ресурсы, такие как память, в то время как разные процессы не делят эти ресурсы. В частности, потоки процесса совместно используют свой исполняемый код и значения переменных в любой момент времени.
Стандартизованным интерфейсом для реализации потоков является POSIX Threads (Pthreads), который представляет собой набор вызовов библиотеки C-функций. Поставщики ОС могут свободно внедрять интерфейс по желанию, но разработчик приложения должен иметь возможность использовать один и тот же интерфейс на нескольких платформах. Большинство платформ Unix, включая Linux, поддерживают Pthreads.
Многопоточные библиотеки предоставляют вызов функции для создания нового потока, который принимает функцию в качестве параметра. Затем создается параллельный поток, который запускает функцию и завершается, когда функция возвращается. Библиотеки потоков также предлагают функции синхронизации, которые позволяют реализовать функции многопоточности без условий гонки с использованием взаимных исключений, условных переменных, критических секций, семафоров, мониторов и других примитивов синхронизации.
Стандарт POSIX определяет два основных типа данных для потоков: pthread_t – дескриптор потока ; pthread_attr_t – набор атрибутов потока.
Стандарт POSIX специфицирует следующий набор функций для управления потоками:
pthread_create(): создание потока pthread_exit():завершение потока (должна вызываться функцией потока при завершении) pthread_cancel():отмена потока pthread_join():заблокировать выполнение потока до прекращения другого потока, указанного в вызове функции pthread_detach():освободить ресурсы занимаемые потоком (если поток выполняется, то освобождение ресурсов произойдёт после его завершения) pthread_attr_init():инициализировать структуру атрибутов потока pthread_attr_setdetachstate():указать системе, что после завершения потока она может автоматически освободить ресурсы, занимаемые потоком pthread_attr_destroy():освободить память от структуры атрибутов потока (уничтожить дескриптор).
Файловая система ОС UNIX
С точки зрения пользователя в ОС UNIX существует два типа объектов: файлы и процессы.
Все данные хранятся в виде файлов, доступ к периферийным устройствам осуществляется через чтение/запись в специальные файлы. При запуске программы ядро загружает соответствующий исполняемый файл, создает образ процесса и передает ему управление. Во время выполнения процесс может считывать или писать данные в файл. С другой стороны, вся функциональность ОС определяется выполнением соответствующих процессов. Таким образом, понятия файловой системы и процессов тесно взаимосвязаны.
В UNIX файлы организованы в виде древовидной структуры (дерева), называемой файловой системой. Каждый файл имеет имя, определяющее его расположение в дереве FS. Корнем дерева является корневой каталог (root directory), имеющий имя “/”. Имена всех файлов, кроме “/ содержат путь - список каталогов, которые надо пройти, чтобы достичь файла. Все доступное файловое пространство объединено в единое дерево каталогов, корнем которого является каталог “/”. Таким образом, полное имя любого файла начинается с “/”. Полное имя файла не содержит идентификатора устройства (HDD, CD-ROM или удаленного компьютера в сети), на котором он фактически находится. Символ “/”является разделителем в структуре каталогов. Каждый файл имеет связанные с ним метаданные (хранящиеся в индексных дескрипторах - inode), содержащие все характеристики файла и позволяющие ОС выполнять операции над ним. Метаданные хранят права доступа, владельца-пользователя и владельцагруппу, указатели на дисковые блоки, хранящие данные. В метаданных нет сведений об имени файла.