Статья по предмету Компьютеры, программирование

  • 141. Небезопасная безопасная JAVA
    Статьи Компьютеры, программирование

    Введение селективного контроля за ресурсами потребовало реализации «контекста выполнения» проверяя права доступа объекта к ресурсу, JVM вынуждена анализировать не только данный объект, но и предыдущие элементы стека вызовов, предоставляя доступ тогда и только тогда, когда нужным правом владеют все объекты в стеке (в терминологии Sun это называется принципом минимизации привилегий). Принцип минимизации привилегий, как легко видеть, вступает в противоречие с принципом инкапсуляции. Объект too, опирающийся на объект bar, в «правильных» ООП-языках не знает о внутреннем устройстве bar, и потому bar может (при необходимости) пользоваться ресурсами, недоступными для too. Классическим примером тому является системный вызов операционной системы, осуществляемый прикладной программой. Объект «файл», имеющий прямой доступ к диску, предоставляет остальным объектам набор методов для создания/удаления/чтения и записи файлов, гарантируя, что никакой другой объект не разрушит данные на диске. Если же следовать принципу минимизации привилегий, то прямой доступ к диску необходимо предоставить всем объектам, что абсурдно. Другими словами, если объектно имеет право вызывать данный метод объекта bar с заданными аргументами, то bar обязан обслужить вызов, в противном случае пришлось бы учитывать возможный граф вызовов объектов, что требует огромных затрат памяти и процессорного времени. Механизм, реализованный в JVM, обходит эту проблему путем создания привилегированного интервала, при выполнении которого контекст (т. е. предыдущие вызовы объектов) игнорируется, в результате чего становится возможным появление программ, нарушающих делегированные им права доступа (не важно, сознательно или нет). На это еще можно было бы закрыть глаза, если бы не тяжеловесность реализации и высокие накладные расходы. Как женщина не может быть «слегка» беременной, так и система не бывает «практически» безопасной.

  • 142. Некоторые аспекты безопасности Веб-серверов на Unix платформах
    Статьи Компьютеры, программирование

    Очень важным моментом в настройке Веб-сервера является настройка файла прав доступа (access.conf). Необходимо начать с корня дерева документов сервера и при необходимости конкретизировать установки ниже по дереву для отдельных подкаталогов. На мой взгляд более надежно использовать директиву , а не , т.к. она защищает конкретные наборы файлов, независимо от того, как вы к ним попали (ведь в серверах под Unix можно очень эффективно пользоваться линками к файлам и директориям, делая логическую структуру дерева документов более удобной). Если вы используете Alias, очень внимательно проанализируйте все возможные варианты построения логического дерева (пути к файлу).

  • 143. Некоторые аспекты обеспечения эффективности работы системы управления базами данных
    Статьи Компьютеры, программирование

    Производительность всей системы в целом зависит от функционирования кэш-буфера БД, он состоит из блоков памяти того же размера, что и блоки Oracle. Все данные загружаются в кэш-буфер. В них же выполняется и любое обновление данных, поэтому очень важно правильно устанавливать размер буфера. Oracle переносит данные на диск (используется подкачку swap-данных) в соответствии с порядком их размещения в списке LRU (least recently used - наиболее давно использовавшиеся). Этот список отслеживает обращение к блокам данных и учитывает частоту обращения к ним. Когда выполняется обращение к блоку данных, хранящемуся в кэш-буфере, он помещается в тот конец списка - MRU (most recently used - недавно использованные). При этом, если серверу требуется место в кэш-буфере для загрузки нового блока с диска он обращается к списку LRU и решает какой из блоков перенести на диск, для того чтобы освободить место для нового блока. У блоков наиболее удаленных в списке от MRU самая большая вероятность удаления из кэш-буфера. Дольше всего остаются в кэш-буфере те блоки, обращение к которым производится наиболее часто. Анализ функционирования кэш-буфера выявил следующую блок-схему его работы.

  • 144. Непрерывная подача чернил
    Статьи Компьютеры, программирование

    Когда все высохнет СНПЧ практически готова. Делаем по два отверстия в крышках банок WWM чернил. Одно для трубочки (причем лучше если тесное), одно тонкое для подачи воздуха. Личная рекомендация вырезать из поролона маленький цилиндрик по диаметру крышки и приклеить его к ней. Зачем это нужно? Чтобы всякий мусор из атмосферы не поступал в банку, соответственно и в чернила. Осталось установить СНПЧ. Для этого нужен будет большой хомут. Снимите с принтера защелки для картриджей они вам больше не нужны. Установите полученные «CНПЧ-картриджи» вместо обычных и в обхват прижмите их хомутиком. Далее потребуется закрепить трубку посередине принтера. Для этого можно использовать обычный канцелярский зажим, но все делают по-разному. Важно, чтобы трубки были закреплены посередине. Справа их можно прикрепить обычным скотчем и концы опустить в соответствующие банки. Постарайтесь их не перепутать! Иначе результатом будет потраченные впустую чернила. И много! :-) Все. СНПЧ готова. Пользуйтесь.

  • 145. Новое - хорошо забытое старое
    Статьи Компьютеры, программирование

    Откомпилированный машинный код выполняется с минимумом проверок и верификатор из динамического вырождается в статический. В частности, если произойдет переполнение буфера, то хакер без труда сможет внедрить туда shell-код и передать ему управление, захватив все привилегии виртуальной машины, достаточно часто выполняемой с правами администратора. Отсутствие динамического анализа и скрупулезных проверок времени исполнения (их наличие сильно замедлило бы производительность) позволяет злоумышленнику сравнительно честными путями вырываться за пределы виртуальной машины, вызывая произвольные API-функции операционной системы или даже модифицируя саму виртуальную машину по своему усмотрению. К тому же JIТ-компиляторы при некоторых обстоятельствах сурово ошибаются, генерируя неправильный код. Рассмотрим пример некорректной работы Symantec JIТ-компилятора, используемого, в частности, в браузере Netscape версий 4.04.79 под Windows/x86. Байт-код забрасывает на вершину стека нулевую константу (команда aconst_null), после чего вызывает локальную подпрограмму командой jsr 11, где тут же выталкивает двойное слово с вершины стека в виртуальный регистр R1 и возвращается из нее обратно, переходя по адресу, содержащемуся в виртуальном регистре R1 (а в нем как раз и лежит адрес возврата из локальной подпрограммы). Так что с точки зрения верификатора все выглядит предельно корректно и у него никаких претензий нет. Что же касается JIТ-компилятора, то перед входом в функции он сохраняет регистр ЕАХ в стеке (условно соответствующий виртуальному регистру R1), далее обнуляет его (команда XOR ЕАХ.ЕАХ), но не кладет в стек, а прямо так в регистре и оставляет. Потом вызывает локальную подпрограмму (инструкция CALL I1), забрасывая на стек адрес возврата (то есть адрес первой следующей за ней команды инструкции POP ЕСХ). В самой же подпрограмме компилятор стягивает с вершины стека двойное слово, помещая его в регистр ЕАХ (команда POP ЕАХ), что совершенно правильно. Затем, отрабатывая RET 1, вместо того, чтобы сразу прыгнуть на JMP ЕАХ, по совершенно непонятным причинам еще разлезет в стек и копирует в ЕАХ двойное слово, находящееся на его вершине (инструкция «MOV ЕАХ, [ESP]»), в результате чего реальный переход осуществляется по физическому указателю, находящемуся в регистре ЕАХ. Обычно там собирается мусор и программа (вместе с Java-машиной) просто рушится. При желании можно воздействовать на ЕАХ, засунув в него указатель на shell-код или что-то подобное. Для этого перед вызовом функции jump() достаточно выполнить последовательность команд виртуальной машины: iloadj/ireturn. Сейчас эта дыра уже закрыта.

  • 146. Новый «креатив» от Adobe Systems
    Статьи Компьютеры, программирование

    В основу нового комплексного решения от Adobe Systems разработчики заложили два основных понятия: интеграция и специализация. Под интеграцией понимается не только свободный обмен контентом между различными приложениями CS (и даже между ПК и мобильными устройствами), но и возможность создания общего рабочего пространства для сетевых пользователей. Специализация подразумевает, что каждый пользователь сможет подобрать решение, соответствующее специфике его работы. При этом не придется переплачивать за ненужные опции и освобождать для них дополнительные ресурсы компьютера. В соответствии с этим Adobe CS3 насчитывает шесть вариантов дистрибутивов, отличающихся составом приложений и служб. Назначение каждого дистрибутива легко понять из его названия. Так, Adobe CS3 Design Standard и его расширенный вариант Design Premium созданы для подготовки материалов к печати, а также (во втором варианте) публикации их в сети Интернет. Adobe CS3 Web Standard предназначен для профессионального Web-дизайна. Его расширенная версия Web Premium дополнена средствами разработки интерактивных решений. Adobe CS3 Production Premium подойдет для проектирования мультимедийных продуктов и монтажа видео. И наконец, Master Collection универсальный дистрибутив, включающий в себя все новые разработки Adobe Systems в рамках проекта Creative Suite 3. Нужно добавить, что и центральное приложение CS3 редактор Photoshop (версия 10.0) также выпускается в двух вариантах:

  • 147. О некоторых задачах анализа и трансформации программ
    Статьи Компьютеры, программирование

    Таким образом можно получить количественную классификацию маскирующих преобразований. Для каждого маскирующего преобразования приводится оценка сложности маскировки и оценка трудоёмкости демаскировки. Значение, получаемое как разность оценки трудоёмкости демаскировки и оценки сложности маскировки, позволяет оценить насколько демаскировка данного маскирующего преобразования сложнее, чем маскировка. Исходя из этого определяются маскирующие преобразования, применение которых неоправдано, например, переформатирование программы, разложение циклов, локализация переменных; методы маскировки, которые следует применять только в комплексе с другими методами, например, изменение идентификаторов, внесение дублирующего кода и методы маскировки, применение которых наиболее оправдано, например, внесение тождеств, переплетение процедур, построение диспетчера, повышение косвенности. Сравнение двух маскирующих преобразований приведено в таблице 3. Через D обозначена разность OC-DL, через ?1 обозначено расстояние между текстами замаскированной и исходной программ fib, а через ?2 - расстояние между текстами демаскированной и исходной программ. Из таблицы следует, что маскирующее преобразование построения диспетчера предпочтительнее, так как, при равных с методом внесения тождеств трудо-затратах на демаскировку, обеспечивает лучшее соотношение усложнения программы к цене преобразования.

  • 148. О новых поколениях корпоративных информационных систем в XXI веке
    Статьи Компьютеры, программирование

    В этой статье подробно рассмотривается только шкала наименований, где значениями являются названия других типов объектов. Это соответствует очень активно обсуждаемому сейчас фундаменту нового поколения Web (Semantic Web), так называемых “Triples” (http://triple.semanticweb.org/), включающих иерархию Subject-Property-Object, где под Subject имеется в виду прежде всего какой-то объект, под Property какое-то Свойство (Признак), а под Object значение этого признака (Value), измеренное по шкале наименований. С точки зрения ТК и ТИ [10] этому значению соответствует какой-то другой Subject, что позволяет создавать семантические сети. Сейчас Семантическая Паутина (Semantic Web - http://ru.wikipedia.org/wiki/Semantic_Web) и ее Triples являются очень горячей точкой обсуждения общемировым ИТ сообществом и уже начинают “браться на вооружение” ведущими IT вендорами (прежде всего Oracle - http://www.oracle.com/technology/tech/semantic_technologies/index.html). Однако сама идеология RDF-Triples требует совершенствования с учетом ТК и ТИ. В своей системе “Штатные расписания” еще до перехода на OEBS (http://www.oracle.com/global/ru/oramag/january2002/russia_mmkplan.html) мы использовали элементы такого подхода в метамодели (SPV), реализованной средствами Oracle CASE, использующей иерархию Subjects-Properties-Values и много дополнительных связей. В отличие от RDF систему triples можно назвать SPV-triples. Хотя это была только прототипная модель, но многие ее черты выходили за рамки существующего подхода RDF.

  • 149. Обзор методов оптимизации кода для процессоров с поддержкой параллелизма на уровне команд
    Статьи Компьютеры, программирование

    VLIW-процессор способен работать с большей эффективностью, чем суперскалярный, поскольку у него нет необходимости заниматься динамическим анализом кода. Суперскалярный процессор, тем не менее, превосходит его в качестве планирования команд, поскольку имеет больше информации. Так, при статическом анализе невозможно предсказать случаи непопадания в кэш при чтении из памяти, из-за чего при выполнении возможны простои, в то время как динамический планировщик в этом случае может запустить другие готовые к исполнению команды. Компилятор не имеет права поменять местами команду чтения из памяти с последующей командой записи в память, поскольку адрес записи, возможно, совпадает с адресом чтения. Динамическому планировщику эти адреса уже известны, следовательно, он обладает большей свободой переупорядочения команд. Еще одно преимущество суперскалярных процессоров заключается в поддержке механизма предсказания ветвлений (branch prediction) и выполнения по прогнозу ветвления (control speculation). Аппаратура выбирает направление ветвления исходя из частоты предыдущих ветвлений в этой точке и с упреждением исполняет команды из более вероятной ветви. Это дает ускорение, если прогноз был верен. При неверном прогнозе аппаратура аннулирует результаты упреждающих вычислений.

  • 150. Обзор программных словарей и переводчиков
    Статьи Компьютеры, программирование

    Каждый, кто хоть раз сталкивался с переводом, знает, как утомительно листать толстые словари в поисках неизвестного иностранного слова. К счастью, для этого можно задействовать компьютер, оборудованный специализированным ПО, к которому относятся, например, электронные словари (базы данных), где каждому слову поставлен в соответствие его перевод (иногда с описанием вариантов, приведением синонимов и т.д.). Процедуры поиска и сортировки обеспечивают быстрое нахождение искомого. Несмотря на многообразие продуктов этого класса, по своей структуре и функциям все они похожи. Различия касаются обычно интерфейса, возможностей расширения и наполнения. Как правило, серьезные словари включают в себя содержание нескольких дополняющих друг друга «бумажных» версий и поддерживают загрузку других словарных баз. Они часто дополняются системами контекстного перевода, позволяющими переводить слово, на которое пользователь указывает курсором. Конечно, для этого словарь должен постоянно находиться в памяти компьютера.

  • 151. Обзор процессоров i80x86
    Статьи Компьютеры, программирование

    В 1976 году фирма Intel начала усиленно работать над микропроцессором i8086. Размер его регистров был увеличен в два раза, что дало возможность увеличить производительность в 10 раз по сравнению с 8080. Кроме того, размер информационных шин был увеличен до 16 разрядов, что дало возможность увеличить скорость передачи информации на микропроцессор и с него в два раза. Размер его адресной шины также был существенно увеличен - до 20 бит. Это позволило 86-му прямо контролировать 1М оперативной памяти. Как прямой потомок i8080, i8086 унаследовал большую часть множества его команд. Регистры этого процессора были разработаны таким образом, что они могли обрабатывать как 16-ти битные значения, так и 8-ми битные - также как это делал i8080. Память i8086 была также доработана специальным образом. Весь мегабайт оперативной памяти не представлялся единым полем, а был разделен на 16 сегментов величиной по 64К. Таким образом, память 8086 можно было представить, как объединенную вместе память нескольких i8080. i8086 работал с каждым сегментом по отдельности, не позволяя большим информационным структурам переходить через границы сегментов. В некотором смысле i8086 опередил свое время. Малые компьютеры основывались на 8-ми битной архитектуре, память была очень дорога, требовались дополнительные 16-ти битные микросхемы. Использование этого процессора предполагалось в 16-ти битных устройствах, которые не оправдывали свою цену в то время.

  • 152. Обработка последовательных файлов в программе
    Статьи Компьютеры, программирование

    При выполнении операций ввода-вывода данных по умолчанию автоматически производится проверка на возникновение ошибки. При обнаружении ошибки выполнение программы прекращается. Но в программе можно предусмотреть собственную реакцию на ошибочные ситуации. Для этого в начале "опасного" фрагмента отключается автоматическая проверка {$I-}. При возникновении ошибки формируется код, который обрабатывается функцией IOResult. Функция IOResult возвращает в программу код ошибки, обнуляет этот код, поэтому последующие обращения к этой функции будут давать нулевой результат, пока какая-либо операция не закончится аварийно.

  • 153. Обработка строк в РНР
    Статьи Компьютеры, программирование

    В результате, обработанное значение строки $str не будет содержать повторяющихся пробелов. Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim(str); ( $str = trim ($str); ). Когда требуется удалить пробелы только с начала строки, нужно использовать ltrim. И если уж зашла речь о начале строки, давайте убедимся, что первый символ заглавный. Что бы сделать его таковым, примените ucfirst(str); Есть и функция для перевода во всех словах в строке их первых букв в заглавные - ucwords(str);. Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай поиск в строке (о нем несколько позже). Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в соответствии с правилами правописания. Другими словами строка может содержать в середине слова или предложения чередующиеся заглавные и прописные символы. Решение данной проблемы в применении функций strtolower(str); и strtoupper(st);. Эти функции, соответственно, переводят символьные строки в нижний и верхний регистр. Комбинирование данных возможностей языка РНР приводит к корректному построению строки не зависимо от того, как она была введена или получена в начальном виде.

  • 154. Общая схема решения задачи на персональном компьютере
    Статьи Компьютеры, программирование

    и еще множеством различных способов, но в каждой программе обязательно будет слово BEGIN, и в конце программы всегда будет стоять END. - признак конца программы. Перед BEGIN может что-то быть (как правило, это так), или может не быть ничего. То, что находится перед BEGIN, называется разделом описаний, то, что находится между BEGIN и END. , называется разделом операторов. Слова BEGIN, END, а также CONST, VAR, STRING, WRITELN являются ключевыми словами языка Паскаль, а слово Message - это идентификатор пользователя, т.е. имя, данное нами некоторому объекту - константе, переменной, или чему-то еще. Все ключевые слова и идентификаторы пользователя есть последовательности букв и цифр, начинающиеся с буквы. Буквами языка являются все латинские буквы и символ подчеркивания. Компилятор не различает большие и малые латинские буквы, поэтому вы можете записывать идентификаторы как захотите: Begin, BEGIN, begin и т.д. Вы можете выбирать любые идентификаторы пользователя, лишь бы они не совпадали с ключевыми словами; так, в нашем примере вместо Message вы можете написать Q или __t123, или Y56_ert и т.д. Однако все эти идентификаторы не несут в себе никакого смысла, затрудняют чтение и отладку программы и делают ее неряшливой; идентификатор Message имеет то достоинство, что из него уже ясно его назначение - содержать некоторое сообщение. Старайтесь всегда использовать в программе осмысленные идентификаторы! Язык Паскаль допускает идентификаторы длиной до 63 символов (точнее, компилятор различает первые 63 символа имени), поэтому не экономьте на именах переменных и функций, пусть лучше имена будут длинными, но понятными. Кроме ключевых слов и идентификаторов всякая программа содержит также пробелы и (в идеале) комментарии. Комментарии записываются в фигурных скобках и могут стоять в любом месте программы, пробелы являются разделителями, там, где допустим один пробел, можно поставить любое количество пробелов. Комментарии и пробелы следует использовать для аккуратного оформления текста программы. Хорошая программа обязательно должна быть документирована, т.е. содержать комментарии, поясняющие, как она работает.

  • 155. Объект Recordset и текстовые файлы (ASP)
    Статьи Компьютеры, программирование

    В этой статье речь пойдет о построении объекта Recordset на основе информации из текстового файла. Сталкиваясь с задачей представления данных из текстовых файлов (с поддержкой сортировок по нескольким полям, разбиением набора данных по страницам) возникает вопрос: как решить данную задачу наиболее просто? Первый вариант решения - использование массивов. Второй вариант, о котором и пойдет речь, - создание объекта Recordset и дальнейшая работа с ним.

  • 156. Объектно-ориентированое програмирование на С++
    Статьи Компьютеры, программирование

    Порядок выполнения работы

    1. Разработать описание класса, выделить публичные и приватные поля данных. Разработать интерфейс класса прототипы методов.
    2. Написать функцию для создания списка. Функция может создавать пустой список, а затем добавлять в него элементы.
    3. Написать функцию для печати списка. Функция должна предусматривать вывод сообщения, если список пустой.
    4. Написать функции для удаления и добавления элементов списка в соответствии со своим вариантом.
    5. Выполнить изменения в списке и печать списка после каждого изменения.
    6. Написать функцию для записи списка в файл.
    7. Написать функцию для уничтожения списка.
    8. Записать список в файл, уничтожить его и выполнить печать (при печати должно быть выдано сообщение "Список пустой").
    9. Написать функцию для восстановления списка из файла.
    10. Восстановить список и распечатать его.
    11. Уничтожить список.
  • 157. Озвучивание Ваших программ
    Статьи Компьютеры, программирование

    Создайте папку Lesson21. Для удобства в работе поместите в нее файлы 05.bmp, 06.bmp, 01.mid, 01.wav, 02.wav, 03.wav, 04.wav, Mci.vbx. Запустите Visual Basic. Окно формы Form1 «выкрасите» в серый цвет и поместите в него два рисунка в виде объектов Picture (Рисунок) из файлов 05.bmp, 06.bmp. Для обоих рисунков в окне Properties (Свойства) для свойства AutoSize (Авто размер) установите значение True (Истина), а для свойства BorderStyle (Граничный стиль) значение 0-None (Нет). Чтобы озвучить Ваше приложение, необходимо в его проект добавить файл Mci.vbx. Для чего в меню File выберите команду Add File ... (Добавить файл …) и через появившееся окно загрузите файл Mci.vbx. В окне объектов появится значок мультимедийных объектов MMControl (Microsoft Multimedia Control). Файл Mci.vbx необходим в тех случаях, когда вы хотите, чтобы Ваше приложение не было «немым». Это файл поддержки мультимедийных объектов. Кроме того, компьютер должен быть оснащен музыкальной картой. В окне объектов щелкните по кнопке со значком мультимедийных объектов и поместите объект MMControl1 на форму Вашего приложения. Для свойства Visible (Видимость) объекта MMControl1 установите значение False (Ложь), так как в данном приложении лучше этот объект сделать «невидимым». Для свойства FileName (Имя файла) запишите значение 01.wav. Щелкните два раза по изображению телефона для вызова процедуры события Picture1_Click. Процедура события Picture1_Click будет вызываться в работе программы всякий раз, когда пользователь щелкнет мышкой по рисунку Picture1. В данную процедуру впишите программный код:

  • 158. Операторы ввода-вывода
    Статьи Компьютеры, программирование

    При выводе чисел можно их форматировать, т.е. управлять формой их представления. Для этого в списке вывода после выводимого выражения можно указывать модификаторы : “:L:d“ - для вещественных значений и “:L” для вещественных и целых. L и d - целочисленные выражения, первое из них определяет, сколько всего позиций отводится для выводимого числа на экране, а второе - сколько выводится цифр после десятичной точки. Если при выводе вещественного числа задан модификатор “:L:d“, то оно выводится с фиксированной точкой, если же задан модификатор “:L” или он отсутствует - то с плавающей точкой. Пусть значение переменной X равно 123.45678, тогда оператор

  • 159. Определяемое Преобразование Типа
    Статьи Компьютеры, программирование

    Вызов мог бы быть проинтерпретирован или как h(double(1)), или как h(x(1)), и был бы недопустим по правилу единственности. Но первая интерпретация использует только стандартное преобразование и она будет выбрана по правилам. Правила преобразования не являются ни самыми простыми для реализации и документации, ни наиболее общими из тех, которые можно было бы разработать. Возьмем требование единственности преобразования. Более общий подход разрешил бы компилятору применять любое преобразование, которое он сможет найти; таким образом, не нужно было бы рассматривать все возможные преобразования перед тем, как объявить выражение допустимым. К сожалению, это означало бы, что смысл программы зависит от того, какое преобразование было найдено. В результате смысл программы неким образом зависел бы от порядка описания преобразования. Поскольку они часто находятся в разных исходных файлах (написанных разными людьми), смысл программы будет зависеть от порядка компоновки этих частей вместе. Есть другой вариант - запретить все неявные преобразования. Нет ничего проще, но такое правило приведет либо к неэлегантным пользовательским интерфейсам, либо к бурному росту перегруженных функций, как это было в предыдущем разделе с complex.

  • 160. Оптимизация Windows XP
    Статьи Компьютеры, программирование

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