Читайте также:
|
|
Изучите работу четырех программ, makefile, simple.c, simple_processes.c, simple_threads.c, simple_mutex.c, приведенных в Приложении (Тексты программ и makefile содержатся в файле appendix.doc):
(a) Обычная программа simple.c, состоящая из функции main и двух дополнительных функций; не использует многозадачности или многопоточности.
(b) Программа simple_processes.c запускает три процесса - родительский и два дочерних.
(c) Программа simple_threads.c запускает три потока - главный (первичный) и два дочерних.
(d) Программа simple_mutex.c с тремя потоками, как в (с), и использующая мьютекс для синхронизации.
Программы (a), (b) и (c) выполняют одинаковые вычисления.
Задание 4.
4.1. Скопируйте файлы makefile, simple.c, simple_processes.c, simple_threads.c, simple_mutex.c в ваш каталог. Для создания исполняемых файлов всех четырех программ запустите утилиту make без параметров.
4.2. Запустите исполняемые файлы simple, simple_processes и simple_threads. Объясните полученные результаты.
4.3. Попытайтесь оценить время выполнения программ simple, simple_processes и simple_threads. Это можно сделать одним из двух способов:
1) Использовать в функции main всех трех программ функцию gettimeofday (не забудьте включить <sys/time.h>). Эту функцию следует включить в два места программы: до и после вызова двух функций в simple; до и после создания и запуска двух процессов/потоков в simple_processes / simple_threads. Для получения более точного результата исключите printf из функций do_one_thing и do_another_thing.
2) Использовать обычные часы. Для того чтобы программа выполнялась несколько минут, следует включить в main каждой программы цикл, повторяющийся не менее 32000 раз. Для получения более точного результата исключите printf из функций do_one_thing и do_another_thing.
Объясните разницу во времени работы трех программ.
4.4. Выполните программу simple_mutex. Проверьте, что переменная common (изменяемая параллельно двумя потоками), изменяет свою величину от 0 до 100 (т.к. каждый поток изменяет эту переменную ровно 50 раз). Обратите внимание, что в каждый момент времени переменная common читается, увеличивается на 1 и затем записывается без прерывания только одним потоком. Это обеспечивается механизмом мьютексов, который используется обоими потоками (см. функции pthread_mutex_lock и pthread_mutex_unlock).
4.5. Затем удалите механизм мьютексов из программы simple_mutex_c, перекомпилируйте ее и выполните несколько раз. Одинаковы ли значения common в разных запусках? Всегда ли переменная common имеет конечное значение, равное 100? Объясните результаты.
4.6. Между двумя последовательными чтением и записью common, каждый из двух потоков в программе simple_mutex.c выполняет длинный цикл. Каково влияние продолжительности этого цикла на переменную common? Для ответа на этот вопрос выполните еще три эксперимента без механизма мьютексов. В первом эксперименте удалите цикл полностью. Во втором эксперименте уменьшите продолжительность цикла в два раза по сравнению с начальной версией программы. В третьем эксперименте увеличьте продолжительность цикла в два раза по сравнению с начальной версией программы. Запишите и объясните результаты экспериментов.
Дата добавления: 2014-12-18; просмотров: 200 | Поможем написать вашу работу | Нарушение авторских прав |