Cтраница 3
Во-вторых, существует возможность так называемого непосредственного управления буферами. С помощью макрокоманды GETBUF программа получает информацию об адресе очередного буфера из буферной области; эта информация впоследствии используется в макрокомандах READ и WRITE. GETBUF должна передать программе адрес нового буфера из буферной области. [31]
В режиме перемещения по макрокоманде GET запись пересылается из буфера в рабочую область программы, а по макрокоманде PUT - из рабочей области в буфер. В режиме указания по макрокоманде GET программа получает в регистре сведения об адресе буфера, содержащего очередную введенную запись, и по макрокоманде PUT - сведения об адресе буфера, содержащего очередную запись, предназначенную для вывода. [32]
ЪД и проведены изменения, запись о них в журнале будет отсутствовать. Для завершения журнала, как правило, предоставляются программы окончательного закрытия журнала, которые работают как автономные утилиты, определяют адрес несброшенного буфера, используя управляющие таблицы СУБД, записывают его в журнал и закрывают ленту. При этом важным моментом является то, что СУБД должна сначала формировать запись журнала, а потом проводить изменения БД. Очевидно, возможны отказы, при которых будет потеряно содержимое основной: памяти и журнал не будет успешно закрыт. В некоторых системах аппарат управления данными реализован таким образом, тобы избежать подобных ситуаций, о чем будет говориться ниже. В журнал может заноситься физическое и логическое представление данных БД. При физическом представлении данных в журнал помещается копия блока, содержащего изменения. При логической записи в журнал помещается некоторая сжатая информация, которая может быть использована для восстановления БД при применении специальных алгоритмов. При физической записи, например в IDMS [8], обеспечивается очень быстрое восстановление, но может потребоваться существенно больший объем внеш-ней и основной памяти и значительные накладные временные рас-ды на ведение журнала. [33]
Она может возникнуть по макрокомандам PUT, PUTX или CLOSE. По макрокоманде PUT ( режим загрузки), если не удается записать блок данных на внешнее устройство, то в регистре 1 указывается адрес буфера вывода, а в регистре 0 - адрес рабочей области, в которой находятся первые 16 байт блока ЮВ. [34]
В режиме перемещения по макрокоманде GET запись пересылается из буфера в рабочую область программы, а по макрокоманде PUT - из рабочей области в буфер. В режиме указания по макрокоманде GET программа получает в регистре сведения об адресе буфера, содержащего очередную введенную запись, и по макрокоманде PUT - сведения об адресе буфера, содержащего очередную запись, предназначенную для вывода. [35]
Возвращают число байт ( без завершающего нулевого символа), скопированных в буфер. Параметры: nIDItem и nFlags действуют так же, как для всех предыдущих функций; rString - ссылка на объект класса CString, получающий строку; IpString - адрес буфера, куда должна копироваться строка; nMaxCount - размер буфера. Следует иметь в виду, что символы, не поместившиеся в буфер, будут отброшены. [36]
Во-вторых, существует возможность так называемого непосредственного управления буферами. С помощью макрокоманды GETBUF программа получает информацию об адресе очередного буфера из буферной области; эта информация впоследствии используется в макрокомандах READ и WRITE. GETBUF должна передать программе адрес нового буфера из буферной области. [37]
Во-первых, поскольку распределение адресов памяти, в том числе и буферов приема данных, является предметом заботы операционной системы узла коммутатора, отправитель вынужден перед каждой передачей данных по шине согласовывать с получателем адреса буферов назначения. Для этого в [1] Уровневая модель взаимодействия узлов коммутатора включает специальный Уровень сообщений. На этом уровне согласование адресов буферов производится обменом сообщениями между отправителем и получателем в соответствии с достаточно сложным Почтовым протоколом, что следует рассматривать как чистые накладные расходы передачи данных, неизбежные при системе адресации, свойственной традиционным системным шинам. [38]
Макрокоманды данной группы предназначены для обмена данными между фоновой и оперативной программами. После приема сообщения первое слово буфера будет содержать действительное, число принятых слов. При описании используются аргументы: BUF - адрес буфера, содержащего информацию для обмена; WCNT - счетчик; CRTN - адрес подпрограммы завершения, выполняющейся по окончании обмена. [39]
Системные вызовы выполняются за серию шагов. Первый и третий параметры передаются по значению, а второй параметр передается по ссылке, то есть передается адрес буфера ( на то, что это ссылка, указывает символ &), а не его содержимое. Эта команда процессора представляет собой обычную команду вызова процедуры и применяется для вызова любых процедур. [40]
SPFUN, с помощью которой, например, выполняются действия с магнитной лентой. FUNC содержит код операции, которую необходимо выполнить на устройстве. SPFUN, определяется при программировании драйвера. Следует помнить, что монитор контролирует адрес буфера на допустимость, проверяя, принадлежит ли указанная ячейка программе. [41]
Директива BADDR устанавливает счетчик для задания адреса буфера данного типа, длина которого в словах равна значению выражение. Тип буфера может быть или Modulo или Reverse-carry. Если счетчик не равен нулю, эта директива вычисляет базовый адрес, кратный 2 где 2к выражение. Будет выдана ошибка, если недостаточно памяти, чтобы задать базовый адрес. В отличие от других директив распределения адреса буферов, значение счетчика не увеличивается целочисленным выражением в поле операнда; в счетчике остается базовый адрес буфера. Блок памяти, предназначенной для буфера, ни каким значением не инициализируется. Если буфер Modulo определен, выражение должно попадать в диапазон 2 J. Если буфер Reverse-carry обозначен и мощность выражения не равна двум, будет выдано предупреждение. [42]
Системные вызовы выполняются за серию шагов. Сначала при подготовке к вызову библиотечной процедуры read, которая фактически осуществляет системный вызов read, вызывающая программа помещает параметры в стек, как показано в шагах / - Знарис. Компиляторы С и C помещают параметры в стек в обратном порядке, так исторически сложилось ( чтобы первым был параметр для рте. Первый и третий параметры передаются по значению, а второй параметр передается по ссылке, то есть передается адрес буфера ( на то, что это ссылка, указывает символ &), а не его содержимое. Эта команда процессора представляет собой обычную команду вызова процедуры и применяется для вызова любых процедур. [43]
Директива BUFFER указывает начало буфера данного типа. Данные распределены для буфера до тех пор, пока не сталкиваются с директивой ENDBUF. Команды и большинство директив описания данных могут находиться между парой BUFFER и ENDBUF, хотя директивы BUFFER не могут быть вложены и некоторые типы директив, такие как MODE, ORG, SECTION и другие буферные директивы не могут использоваться. Выражение представляет размер буфера. Если распределено большее количество данных, чем определено размером буфера, выдается ошибка. Директива BUFFER устанавливает счетчик для задания адреса буфера данного типа, длина которого в словах равна значению выражение. Буферный тип может быть как Modulo или Reverse-carry. Если текущее значение счетчика не ноль, эта директива вычисляет базовый адрес, кратный 2, где 2k iV выражение. Выдается ошибка, если не имеется достаточного объема памяти, чтобы задать базовый адрес. В отличие от других буферных директив значение счетчика не увеличивается выражением в поле операнда; в счетчике остается базовый адрес буфера. Если буфер Modulo определен, выражение должно попадать в диапазон 2 J. Если буфер Reverse-carry обозначен и мощность выражения не равна двум, будет выдано предупреждение. [44]
Описав планирование процессов в мультимедийных системах, продолжим наше изучение мультимедийных файловых систем. В этих файловых системах применяются парадигмы, отличные от используемых в традиционных файловых системах. Сначала мы рассмотрим традиционный файловый ввод-вывод, затем обратим внимание на то, как организованы мультимедийные файловые серверы. Для доступа к файлу процесс сначала обращается к системному вызову open. Если эта операция проходит успешно, процессу возвращается нечто вроде маркера, называемого дескриптором или описателем файла. С этого момента процесс может обращаться к системному вызову read, указывая на входе полученный маркер, адрес буфера и счетчик байтов в качестве параметров. При этом операционная система возвращает в буфер требуемые данные. Пока процесс не завершил свою работу, он может издавать дополнительные системные вызовы read, а затем процесс должен обратиться к системному вызову close, чтобы закрыть файл и вернуть ресурсы системе. [45]