11.6 УПРАЖНЕНИЯ 
 
1. Что произойдет в том случае,
если в программе debug будет
отсутствовать вызов функции wait (Рисунок 11.3)? (Намек:
возможны два исхода.)  
2. С помощью функции ptrace отладчик
считывает данные из пространства
трассируемого процесса по одному
слову за одну операцию. Какие
изменения следует произвести в
ядре операционной системы для того,
чтобы увеличить количество
считываемых слов? Какие изменения
при этом необходимо сделать в самой
функции ptrace?  
3. Расширьте область действия
функции ptrace так, чтобы в качестве
параметра pid можно было указывать
идентификатор процесса, не
являющегося потомком текущего
процесса. Подумайте над вопросами,
связанными с защитой информации:
При каких обстоятельствах процессу
может быть позволено читать данные
из адресного пространства другого,
произвольного процесса? При каких
обстоятельствах разрешается вести
запись в адресное пространство
другого процесса?  
4. Организуйте из функций работы с
сообщениями библиотеку
пользовательского уровня с
использованием обычных файлов,
поименованных каналов и элементов
блокировки. Создавая очередь
сообщений, откройте управляющий
файл для записи в него информации о
состоянии очереди; защитите файл с
помощью средств захвата файлов и
других удобных для вас механизмов.
Посылая сообщение данного типа,
создавайте поименованный канал для
всех сообщений этого типа, если
такого канала еще не было, и
передавайте сообщение через него (с
подсчетом переданных байт).
Управляющий файл должен соотносить
тип сообщения с именем
поименованного канала. При чтении
сообщений управляющий файл
направляет процесс к
соответствующему поименованному
каналу. Сравните эту схему с
механизмом, описанным в настоящей
главе, по эффективности, сложности
реализации и функциональным
возможностям.  
5. Какие действия пытается
выполнить программа,
представленная на Рисунке
11.22?  
*6. Напишите программу, которая
подключала бы область разделяемой
памяти слишком близко к вершине
стека задачи и позволяла бы стеку
при увеличении пересекать границу
разделяемой области. В какой момент
произойдет фатальная ошибка
памяти?  
7. Используйте в программе,
представленной на Рисунке
11.14, флаг IPC_NOWAIT, реализуя условный
тип семафора. Продемонстрируйте,
как за счет этого можно избежать
возникновения взаимных блокировок.
 
8. Покажите, как операции над
семафорами типа P и V реализуются
при работе с поименованными
каналами. Как бы вы реализовали
операцию P условного типа?  
9. Составьте программы захвата
ресурсов, использующие (а)
поименованные каналы, (б) системные
функции creat и unlink, (в) функции обмена
сообщениями. Проведите
сравнительный анализ их
эффективности.  
10. На практических примерах
работы с поименованными каналами
сравните эффективность
использования функций обмена
сообщениями, с одной стороны, с
функциями read и write, с другой.  
11. Сравните на конкретных
программах скорость передачи
данных при работе с разделяемой
памятью и при использовании
механизма обмена сообщениями.
Программы, использующие
разделяемую память, для
синхронизации завершения операций
чтения-записи должны опираться на
семафоры.  
    
           
     #include <sys/types.h>                                     
     #include <sys/ipc.h>                                       
     #include <sys/msg.h>                                       
     #define ALLTYPES 0                                         
                                                                
     main()                                                     
     {                                                          
        struct msgform                                          
        {                                                       
            long mtype;                                         
            char mtext[1024];                                   
        } msg;                                                  
        register unsigned int id;                               
                                                                
        for (id = 0; ; id++)                                    
            while (msgrcv(id,&msg,1024,ALLTYPES,IPC_NOWAIT) > 0)
                  ;                                             
     }                                                          
         | 
     
 
 
Рисунок 11.22  
Предыдущая
глава || Оглавление
|| Следующая глава 
  
 
 |