ЖУРНАЛ СТА 1/2015
● дисциплина планирования: каждый поток в системе выполняется с опре- делённой дисциплиной планирова- ния [1]. Микроядро учитывает дис- циплину планирования при наличии в системе двух и более потоков в со- стоянии Ready, выполняющихся с од- ним приоритетом. Если потоку зада- на дисциплина планирования FIFO (First In, First Out), то он может вы- полняться сколь угодно долго. Управ- ление будет передано другому потоку, только если он будет вытеснен более приоритетным потоком, заблокиру- ется или добровольно отдаст управле- ние. При использовании этой дис- циплины планирования поток, кото- рый выполняет длительные матема- тические вычисления, может пол- ностью захватить процессор (то есть не позволит выполняться потокам с тем же и более низким приоритетом). Дисциплина планирования RR (Round Robin) отличается тем, что поток не выполняется «бесконечно», а работает только на протяжении определённого кванта времени (time slice). По истечении кванта времени микроядро ставит процесс в конец очереди потоков, готовых к выполне- нию, и управление передаётся сле- дующему потоку (на том же уровне приоритета). Если же на этом уровне приоритета нет других потоков в со- стоянии Ready, то потоку выделяется ещё один квант времени. Используемая в блоке регистрации ап- паратная платформа включает 4-ядер- ный микропроцессор Intel Core 2 Quad Q9300, а загрузочный образ системыпод- держивает режим симметричного муль- типроцессирования (SMP), поэтому для программного обеспечения выбрана структура, выделяющая описанные ра- нее задачи в отдельные потоки, каждый со своим приоритетом. По умолчанию каждый поток при за- пуске наследует приоритет и дисциплину планирования от потока-родителя. Из- менить атрибуты потока можно при по- мощи специальных функций. Пример иллюстрирует инициализацию потока math_thread с приоритетом 20, дисципли- ной планирования RR, выполняющего процедуру start_routine. В случае если соз- даётся поток для обработки прерывания, одновременно инициализируется соот- ветствующая структура event (листинг 1). Процесс (1) – поддержка графиче- ского человеко-машинного интерфей- са – не имеет критических требований ко времени реакции на события и яв- ляется фоновым для остальных процес- сов системы, поэтому оставим для него приоритет, определяемый по умолча- нию, – 10. Процесс (2) – обмен с КУ – должен выполняться с более высоким приори- тетом, так как по информации от КУ ак- туализируется текущее состояние сепа- ратора, выберем для него приоритет 15. Процесс (3) – анализ (обработка) дан- ных от АЦП– должен выполняться син- хронно с чтением данных, и ни один па- кет данных не должен быть пропущен, поэтому назначаем ему приоритет 20 (выше, чем у большинства процессов в системе). Процессы (4) и (5) – обработка пре- рываний от АЦП – должны быть с ещё более высоким приоритетом, выбираем 22 и 23. Процесс (6) – обмен с АСУ – также является фоновым в нашей системе, и переназначать ему более высокий прио- ритет не будем. Таким образом, для нашей задачи мы инициализируем пять потоков, поток 1 является родительским. Потоки 2 и 6 осуществляют чтение данных из стан- 40 СТА 1/2015 РАЗ РА БОТ КИ / ДОБЫВ АЮЩА Я П РОМЫШЛ Е ННОС Т Ь www.cta.ru ЛИСТИНГ 1 struct sigevent event; //если создаётся поток для обработки прерывания void init_thread( void ) { event.sigev_notify = SIGEV_INTR;//если создаётся поток для обработки прерывания, тип события - сообщение о прерывании pthread_attr_t attr; //атрибуты потока struct sched_param param_math;//параметры планирования pthread_attr_init( &attr );//инициализация атрибутов потока pthread_attr_setdetachstate( &attr,PTHREAD_CREATE_DETACHED ); // ID и другие ресурсы процесса могут многократно использоваться, //как только он завершится pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); // используются атрибуты, переданные в вызове pthread_create(). pthread_attr_setschedpolicy (&attr, SCHED_RR);//дисциплина планирования param_math.sched_priority=20;// приоритет потока pthread_attr_setschedparam (&attr, ¶m_math);//установка параметров потока if ( pthread_create( &math_thread,&attr,&start_routine,NULL ) == -1) { perror( "pthread_create()" ); } } ЛИСТИНГ 2 void * start_routine(void *arg) //поток для обработки данных { for(;;)//бесконечный цикл { while (int_flag);//для потока 3 read(serfd,…);//для потоков 2,6 //чтение данных //обработка новых данных } Рис. 6. Временна ’ я шкала (Timeline) работы программы
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy