Ну, у меня источники только старые, в Сети не встречал. А новые книги -- не знаю, что там написано по этому поводу.
Но, вообще говоря, ИМХО, нужно стараться обойтись минимумом вызовов, сделав их максимально общими, но, есно, не до абсурда. В Линухе, насколько могу судить, концепция противоположная: на каждый "чих" придумать свой вызов -- типа, нехорошо управлять функциями вызова с помощью параметров. В BIOS точно именно так всё и обстоит: у каждого вида устройств свой набор вызовов, причём с кучей разновидностей и т.п.
Например, в моей любимой RSX-11 есть один недостаток: там присутствует несколько вызовов для запуска задач ("процессо-потоков" -- многопоточных приложений в смысле Windows в ней не было). Эти вызовы, хотя делают в целом общее дело (планируют на выполнение задачу), различаются в частностях. Например, есть вызов для запуска в определённое время, а есть вызов для запуска "вообще" (всего их вроде 4, лень смотреть). На мой взгляд, это неудобно: лучше был бы один вызов, где всё необходимое указывается параметрами. В конце концов, многие действия у таких вызовов общие (что и подтверждает изучение исходников RSX-11: там вызываются одни и те же подпрограммы, которые выполняют основную массу работы).
С другой стороны, весь ввод-вывод осуществляется в RSX-11 одним по сути вызовом -- QIO$ (и его разновидностью QIOW$, что тоже излишество -- хватило бы только второго вызова). Конкретная операция ввода-вывода задаётся двумя первыми параметрами, причём собственно ось лишь проверяет корректность этих и других параметров по некоторым шаблонам и "разруливает" запросы по драйверам устройств, которые, собсно, и выполняют ввод-вывод. Можно, конечно, выделить отдельные запросы OPEN, CLOSE, READ, WRITE, IOCTL -- но и только. Дробить на более мелкие смысла лично я не вижу (нет, например. смысла различать открытие файла на чтение и на запись и выделять отдельно создание файла -- а такое встречается временами).
Уменьшение количества вызовов по понятным причинам уменьшает размер таблицы вызовов, что повышает шансы на её "хроническое" нахождение в кэше процессора. Кроме того, реализация общих по сути операций в общем коде также способствует уменьшению размеров системы и повышению её "кэшируемости". Отсюда -- уменьшение накладных расходов.
|