Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 84

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

int thread_pool_limits(thread_pool_t* pool,

Β int lowater, int hiwater, int maximum, int increment, unsigned flags);

ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ рСсурсов

QNX Π²Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ программирования, которая Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ сквозь всю систСму. [41]ИдСя Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ проста, сколь ΠΈ остроумна:

‒ Вся систСма построСна Π½Π° Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ (ΠΈ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΡ€ΠΈ построСнии Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ОБ) ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ - ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ сообщСний. Π―Π΄Ρ€ΠΎ (Ρ‚ΠΎΡ‡Π½Π΅Π΅ «микроядро») ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ выступаСт Π² качСствС ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€Π° сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. ΠŸΡ€ΠΈ этом Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² качСствС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ услугу (рСсурс), ΠΈ сСрвСра, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ эту услугу (ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ рСсурс).

β€’Β Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² API (Π² Ρ‚ΠΎΠΌ числС всС Β«ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Π΅Β» POSIX-Π²Ρ‹Π·ΠΎΠ²Ρ‹:

open()
,
read()
,
write()
,
seek()
,
close()
…) Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ рСсурс сСрвису (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму Ρ‚ΠΈΠΏΠ° FAT32 β€”
fs-dos
) Π² Π²ΠΈΠ΄Π΅ сообщСний уровня микроядра. Код сообщСния ΠΏΡ€ΠΈ этом опрСдСляСт Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,
open()
), Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Ρ‚Π΅Π»ΠΎ сообщСния β€” ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса, зависящиС ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса ΠΏΠ°ΠΊΡƒΡŽΡ‚ΡΡ Π² Ρ‚Π΅Π»ΠΎ сообщСния).

β€’Β Π Π°Π· эта схСма ΡΡ‚ΠΎΠ»ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°, Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½Π° ΠΈ Π½Π΅ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ рСсурса, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ обСспСчиваСтся обслуТиваниС, Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ QNX ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ шаблон сСрвСра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° мСстС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² стандартных POSIX-запросов находятся пустыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ. Π­Ρ‚ΠΎΡ‚ шаблон ΠΈ слуТит Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ элСмСнтом построСния Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… сСрвСров услуг, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π² Ρ‚Π°ΠΊΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ Β«ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ рСсурса».

β€’Β ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса рСгистрируСт своС имя (Ρ‚ΠΎΡ‡Π½Π΅Π΅ имя управляСмого Сю рСсурса) Π² пространствС ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы QNX (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅

/dev
, Π½ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любоС мСсто Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с запросами ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС.

β€’Β ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρƒ, ΠΏΠΈΡˆΡƒΡ‰Π΅ΠΌΡƒ свой Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ услуги, рСсурса, устройства ΠΈΠ»ΠΈ псСвдоустройства, остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ отвСтствСнны Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

open()
,
read()
,
close()
), Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ затрагивая Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π½Π΅ обСспСчиваСмыС этим рСсурсом (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,
write()
,
seek()
ΠΈ Π΄Ρ€.).

Π’ наши Ρ†Π΅Π»ΠΈ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ обсуТдСниС Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ написания ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов (этому посвящСно ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ руководство Π² составС тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ QNX объСмом Π±ΠΎΠ»Π΅Π΅ 80 страниц [42]). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½Π΅Π΅ с динамичСским ΠΏΡƒΠ»ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовался Π½Π°ΠΌΠΈ для тСстирования наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² Π² QNX ( Ρ„Π°ΠΉΠ» prior.cc):

ΠžΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурса

#include <errno.h>

#include <stdio.h>

#include <stddef.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <pthread.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ запроса ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° read(),

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ обслуТивания

static int prior_read(resmgr_context_t *ctp, io_read_t *msg,

Β RESMGR_OCB_T *ocb) {

Β static bool odd = true;

Β int status = iofunc_read_verify(ctp, msg, ocb, NULL);

Β if (status != EOK) return status;

Β if (msg->i.xtype & _IO_XTYPE_MASK != _ID_XTYPE_NONE)

Β  return ENOSYS;

Β if (odd) {

Β  struct sched_param param;

Β  sched_getparam(0, &param);

Β  static char rbuf[4];

Β  sprintf(rbuf, "%d\n", param.sched_curpriority);

Β  MsgReply(ctp->rcvid, strlen(rbuf) + 1, rbuf, strlen(rbuf) + 1);

Β } else MsgReply(ctp->rcvid, EOK, NULL, 0);

Β odd = !odd;

Β return _RESMGR_NOREPLY;

}

// главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запуска ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°

main(int argc, char **argv) {

Β resmgr_attr_t resmgr_attr;

Β dispatch_t *dpp;

Β dispatch_context_t *ctp;

Β int id;

Β // инициализация интСрфСйса диспСтчСризации

Β if ((dpp = dispatch_create()) == NULL)

Β  perror("allocate dispatch"), exit(EXIT_FAILURE);

Β // инициализация Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°

Β memset(&resmgr_attr, 0, sizeof resmgr_attr);

Β resmgr_attr.nparts_max = 1;

Β resmgr_attr.msg_max_size = 2048;

Β // инициализация Ρ‚Π°Π±Π»ΠΈΡ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

Β static resmgr_connect_funcs_t connect_funcs;

Β static resmgr_io_funcs_t io_funcs;

Β iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,

Β  _RESMGR_IO_NFUNCS, &io_funcs);

Β // здСсь Π½Π°ΠΌΠΈ дописан всСго ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ - ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ read,

Β // всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ дСлаСтся ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ!

Β io_funcs.read = prior_read;

Β // инициализация Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ структуры, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ