12.1.Windows (укр)

12. ВІДКРИТІ ТЕХНОЛОГІЇ ПРОГРАМНОЇ ІНТЕГРАЦІЇ В СЕРЕДОВИЩІ  WINDOWS  

12.1. Проблеми програмної інтеграції в інтегрованих автоматизованих системах

В першому розділі показана необхідність інтеграції між різними програмними засобами рівнів АСУТП та АСУП. Враховуючи визначені стандарти промислових мереж та незалежність сучасних програмних продуктів від апаратної платформи комп’ютерів, проблема апаратної сумісності між рівнями АСУТП та АСУП як правило не розглядається.

Однак зовсім інша ситуація склалася на ринку програмних засобів. Нагадаємо, програмне забезпечення інтегрованих автоматизованих систем управління на рівні АСУП можна умовно віднести до однієї з наступних груп:

-         універсальні та спеціалізовані СУБД;

-         системи рівня MES

-         системи рівня ERP;

-         офісне програмне забезпечення.

До програмних засобів на рівні АСУТП, що потребують інтеграції з іншими ПЗ можна віднести SCADA/HMI та спеціалізовані СУБД реального часу. Задача програмної інтеграції зводиться до забезпечення взаємозв’язку між програмами для їх узгодженої роботи, що приводить до необхідності створення інформаційного каналу між даними в цих програмах.

На ринку програмних продуктів для автоматизованих систем не має єдиного стандарту для вирішення даної задачі. Великі компанії-розробники спеціалізованого ПЗ для промислової автоматизації впроваджують програмні пакети для різного рівня автоматизації, які порівняно легко інтегруються між собою. Крім високої вартості даних рішень, вони теж не вирішують всі необхідні задачі. Все це приводить до необхідності інтеграції різних програмних продуктів, розробники яких можуть навіть не знати про існування один одного. Таким чином крім проблем інформаційної та функціональної інтеграції виникає проблема програмної сумісності        

В розділах 12-14 розглядаються сучасні відкриті технології інтеграції між програмними засобами, які забезпечують вирішення задач доступу до даних іншої програми.

12.2. Функціонування ОС Windows

12.2.1. Основи функціонування.

12.2.1.1. Багатозадачний режим. Для розуміння технологій взаємодії між прикладними програмами, необхідні базові поняття про їх функціонування в контексті конкретної операційної системи. На сьогоднішній день найбільш популярними є операційні системи Windows, тому коротко розглянемо принципи роботи програм на цих платформах.

Операційні системи Windows функціонують в багатозадачному режимі, тобто в їх середовищі одночасно виконуються декілька прикладних програм. Однак це не значить, що на одному процесорі паралельно виконуються машинні команди цих програм. Операційна система створює такі умови для кожної програми, щоб надати їй всі ресурси  комп’ютера в виділений момент часу.

12.2.1.2. Потоки. Програмний код, якому необхідно "виділити процесор" в операційній системі Windows називається Потоком (Thread). Щоб одночасно функціонувало декілька Потоків, операційна система виділяє кожному із них певну частину часу, яка називається квантом. Тривалість кванту залежить від конкретної реалізації. Таким чином, вся система працює по принципу каруселі: операційна система почергово, на один квант часу відправляє процесору кожний Потік для його виконання. Після обробки останнього Потоку система знову запускає перший (рис.12.1).

Перед передачею процесору іншого Потоку, система зберігає для попереднього Потоку стан всіх регістрів процесора. Ця інформація називається контекстом Потоку. Повертаючись до цього Потоку знову, система завантажує його контекст в процесор, для того щоб той продовжив виконувати перерваний минулого разу потік.
Описана вище схема функціонування працює для Потоків з однаковими пріоритетами. Кожний Потік має свій пріоритет, який надається йому системою. Чим він вище - тим важливіший Потік, тому операційна система буде обробляти всі Потоки з самим високим пріоритетом до тих пір, поки всі вони не зупиняться (перейдуть в режим очікування). Коли не буде жодного робочого Потоку з найвищим пріоритетом – система перейде на Потоки з нижчим пріоритетом і так далі. Цей принцип розподілу часу між різнопріоритетними Потоками називається багатозадачністю з витісненням.

Прикладна програма часто складається з одного Потоку, однак деякі з них запускають декілька Потоків. З сказаного вище може скластися враження, що у випадку існування в системі Потоку з найвищим пріоритетом, він не дасть жодного шансу для інших Потоків. Але це не так. Як правило всі Потоки простоюють, тобто перебувають в режимі очікування якоїсь події (переривання), яка буде їм адресована. Подією може бути клік або рух миші, сигнал від системного таймеру і інше.

12.2.1.3. Віртуальна та фізична пам’ять. Кожний Потік потребує ресурсів пам’яті. Для того, щоб прикладні програми (їх Потоки) не ділили єдину оперативну пам’ять між собою, кожному Потоку виділяється спеціально реалізований операційною системою ресурс, який називається віртуальною пам’яттю. Віртуальна пам’ять розміщує дані не тільки в оперативній пам’яті, а і на жорсткому диску. Коли необхідно скористатися ресурсами пам’яті – диспетчер пам’яті системи виділяє частину оперативної пам’яті. Якщо потрібна частина пам’яті була виділена під інший Потік (вірніше Процес), її попередньо вивантажують та зберігають на диску, щоб при активації останнього відновити його на тому ж місці.

12.2.1.4. Процеси Windows. Всі потоки та їх дані розміщуються в конкретному Процесі (Process). З точки зору прикладної програми Процес – це адресний простір, в якому розміщуються код та дані всіх EXE та DLL модулів. Саме в ньому знаходяться області пам’яті, які динамічно розподіляються для стеків потоку та інших потреб. При запуску на виконання EXE-програми система створює для неї Процес, в контексті якого запускає первинний Потік. Цей Потік може запустити на виконання ще дочірні Потоки, які будуть виконуватися паралельно. Коли всі Потоки знищуються, Процес теж знищується. Процес може запустити на виконання ще одну програму, тобто створити ще один Процес (до речі, так робить Провідник Windows).

12.2.1.5. Об’єкти ядра Windows. Процеси та Потоки є ресурсами операційної системи, які також являються її об’єктами ядра, якими можна оперувати. Кожний об’єкт ядра має свій унікальний ідентифікатор в системі. Так об’єкти ядра Процес мають ProcessID (PID), який можна побачити під час виклику "Диспетчера задач" (Ctrl+Alt+Del). Однак в контексті кожного Процесу об’єктами ядра користуються через дескриптори (handle). Таким чином в кожному Процесі один і той самий об’єкт ядра буде мати однаковий ідентифікатор але різні дескриптори.

12.2.1.6. Служби Windows. Є спеціальний вид Процесів, які створюють допоміжну функціональність в системі і не залежить від інтерактивних дій користувача. Тобто є прикладні програми, які запускаються до того, як користувач реєструється в системі. Такі програми називаються сервісами або Службами (Services). Для користувача Windows настройку Служб можна провести за допомогою програми "services", яку необхідно попередньо завантажити з консолі управління Microsoft (mmc.exe), або з панелі управління адміністратора ("Администрирование->Службы"). 

12.2.1.7. Вікна та повідомлення Windows. Операційна система Windows реалізує інтерфейс з користувачем через вікна. Прикладна програма може створити для себе вікна відповідно до їх класу. Для ідентифікації вікон, при їх створенні система повертає Потоку дескриптор вікна (handle window або hwnd). Вона слідкує за подіями, які пов’язані з клавіатурою, мишею, сенсорною панеллю і відправляє повідомлення (message) конкретному вікну. Кожне вікно виконується в контексті того Потоку, який його створив. Для того, щоб прийняти повідомлення, які направлені вікнам Потоку, у нього є черга повідомлень. Потік витягує повідомлення з черги і направляє його певній віконній процедурі, яка пов’язана з цим вікном. Наприклад, при натисканні кнопки миші система відправить повідомлення "лівий клік миші" Потоку, який створив це вікно (кнопка – це теж вікно). Система, знайшовши повідомлення в черзі повідомлень, викликає відповідну віконну процедуру.

12.2.2. Архітектура Windows

12.2.2.1. Рівні привілеїв процесора. Розглянемо з яких складових складається операційні системи на базі Windows NT (рис.12.2) з одноядерним мікропроцесором.  Мікропроцесори типу Pentium мають чотири рівня привілеїв (privilege levels), відомих також як кільця. Ці привілеї визначають, наприклад, можливість доступу до пам’яті, використання деяких критичних команд процесора (такі команди пов’язані із захистом і ін.).Кожний потік виконується на одному з цих рівнів привілеїв. Кільце 0 – найбільш привілейований рівень, з повним доступом до всіх команд процесора та всієї його пам’яті. Кільце 3 – найменш привілейований рівень. Для забезпечення сумісності з системами на базі процесорів, відмінних від тих, що випускає Intel, Windows підтримує тільки два рівня привілеїв – кільця 0 та 3. Якщо потік виконується в кільці 0, кажуть, що він виконується в режимі ядра (kernel mode), якщо в 3-му кільці – то в режимі користувача (user mode).
 
 

12.2.2.2. Обмеження доступу програми користувача до ресурсів. Код операційної системи на низькому рівні працює в режимі ядра, а програми користувача – як правило в режимі користувача. Для виконання деяких задач необхідно перемикання програми користувача в режим ядра. В цьому випадку вона викликає системну функцію (system function) використовуючи інтерфейс Windows API (розглянутий нижче). Таким чином код програми користувача безпосередньо не може працювати в режимі ядра, що захищає систему від збоїв. В режимі ядра також працюють драйвери пристроїв.

12.2.2.3. Системні процеси. Процеси, які обслуговують операційну систему називаються системними Процесами (system process):

-       процес idle: складається з одного потоку, який управляє часом простою процесора;

-       процес system: спеціальний процес, який виконується в режимі ядра (всі перераховані інші виконуються в режимі користувача); його потоки звуться системними потоками (system threads);

-       процес Session Manager (SMSS.EXE) – диспетчер сеансів;

-       підсистема Win32 ( CSRSS.EXE);

-       процес реєстрації в системі Win Logon (WINLOGON.EXE).

12.3. Інтерфейс програми користувача до ОС Windows

12.3.1. Win32 API

Для того, щоб програми користувача могли використовувати ресурси операційної системи, вона надає їм певний інтерфейс. Інтерфейс доступу прикладних програм до об’єктів якої-небудь програмної системи називають АРІ (Application Programming Interface). Інтерфейси прикладних програм  представляють собою набір функцій, які забезпечують сервіси даної програми. У 32-х розрядних операційних системах Windows (х86), програмний інтерфейс має назву Win32 API. Хоча функції для всіх Win32-систем в основній масі перекриваються (однакові), реалізація їх різна, оскільки ядра в операційних системах відрізняються. Тому деякі прикладні програми добре функціонують у Windows системах, а деякі ведуть себе специфічно або взагалі не працюють на одній із них.

АРІ-функції Windows входять в складу бібліотек з динамічним підключенням типу DLL (Dynamic Link Library), які являються підсистемою середовища Win32 . Бібліотеки DLL – це виконавчий файл, який вміщує декілька експортних функцій (exportable functions), тобто функцій, до яких можуть звертатися інші виконавчі прикладні програми (EXE або DLL). Такі бібліотеки можуть викликатися за необхідністю, тобто при виконанні експортованих функцій, які там знаходяться. В цьому випадку бібліотека проектується на адресний простір Процесу того Потоку, який викликав її функцію. Будь яка прикладна програма може скористатися експортними функціями dll-бібліотеки, якщо в ній правильно об’явлений виклик і вірно передані всі фактичні параметри. Це значить, що при описі функцій бібліотеки, він може ними скористатися просто викликавши їх.

  АРІ функції імпортуються прикладною програмою з декількох бібліотек DLL:

-       KERNEL32.DLL – вміщує біля 700 функцій, які призначені для управління пам’яттю, процесами та потоками;

-       USER32.DLL – надає біля 600 функцій для управління інтерфейсом користувача, наприклад створенням вікон та передачею повідомлень;

-       GDI.DLL – експортує біля 400 функцій для малювання графічних образів, відображення тексту та роботи зі шрифтами;

-       COMDLG32.DLL – відкриває доступ до майже 20 функцій управління стандартними діалоговими вікнами Windows;

-       LZ32.DLL – зберігає біля 10 функцій архівування і розархівування файлів;

-       ADVAPI32.DLL – експортує біля 400 функцій, пов’язаних з захистом об’єктів та роботи з реєстром;

-       WINM.DLL – вміщує біля 200 функцій, які відносяться до мультимедіа.

Приклад 12.1. Технології програмної інтеграції. Функція для створення процесу з відповідним об’єктом ядра "процес".  

Завдання. Створити функцію для створення процесу з використанням VB/VBA.  

Рішення. Використаємо API-функцію CreateProcess, більшу частину аргументів яких треба просто проініціалізувати по замовченню.

Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _

  (ByVal         lpApplicationName     As String, _

  ByVal           lpCommandLine          As String, _

  lpProcessAttributes              As SECURITY_ATTRIBUTES, _

  lpThreadAttributes                           As SECURITY_ATTRIBUTES, _

  ByVal           bInheritHandles           As Long, _

  ByVal           dwCreationFlags         As Long, _

  lpEnvironment                                  As Any, _

  ByVal           lpCurrentDriectory      As String, _

  lpStartupInfo                                    As STARTUPINFO, _

  lpProcessInformation                       As PROCESS_INFORMATION) _

                                                         As Long

Де: lpApplicationName – ім’я файла. Якщо файл знаходиться в плинній директорії  краще задавати ім’я в наступному полі, а в цьому вказувати vbNullString; lpCommandLine – ім’я файла в форматі повного командного рядку. Якщо рядок не вказаний, то він шукає в локальному, системному, основному каталозі Windows. Використовується якщо lpApplicationName= vbNullString; lpProcessAttributes – атрибути захисту для дочірнього процесу. Як правило треба вказати змінну, яку попередньо об’явити з типом  SECURITY_ATTRIBUTES; lpThreadAttributes – атрибути захисту для дочірнього потоку. Як правило треба вказати змінну, яку попередньо об’явити з типом  SECURITY_ATTRIBUTES; bInheritHandles – наслідувати чи ні дескриптори. Вказуйте FALSE; dwCreationFlags – визначає прапорці, які впливають на те, як саме створюється новий процес. lpEnvironment – область пам’яті з окружними змінними (Передавайте 0); lpCurrentDriectory – поточний диск і каталог створюваному процесу. Як правило передається 0; lpStartupInfo – параметри, які передаються створюваному процесу. Навіть якщо треба створити процес з параметрами по замовченню, необхідно проініціалізувати цю структуру і в ній вказати розмір (cb); lpProcessInformation – через цю структурну змінну функція повертає значення дескрипторів і ідентифікаторів процесу, що створюється, та його первинного потоку.

Декілька прапорців об’єднуються через OR. Серед корисних можна виділити ті, які задають базовий пріоритет процесу: IDLE_PRIORITY_CLASS (&H40); NORMAL_PRIORITY_CLASS (&H20); HIGH_PRIORITY_CLASS (&H80); REALTIME_PRORITY_CLASS (&H100).

Таким чином приклад на VB буде мати наступний вигляд.

Деклараційна частина:

Public Type SECURITY_ATTRIBUTES ' атрибути захисту об’єктів ядра

        nLength As Long

        lpSecurityDescriptor As Long

        bInheritHandle As Long

End Type

Public Type PROCESS_INFORMATION

        hProcess As Long           'дескриптор процесу

        hThread As Long             'дескриптор первинного потоку

        dwProcessId As Long 'ідентифікатор процесу

        dwThreadId As Long      'ідентифікатор потоку

End Type

Public Type STARTUPINFO '

        cb As Long          'розмір даної структури (для контролю версій)

        lpReserved As String

        lpDesktop As String

        lpTitle As String

        dwX As Long

        dwY As Long

        dwXSize As Long

        dwYSize As Long

        dwXCountChars As Long

        dwYCountChars As Long

        dwFillAttribute As Long

        dwFlags As Long

        wShowWindow As Integer

        cbReserved2 As Integer

        lpReserved2 As Long

        hStdInput As Long

        hStdOutput As Long

        hStdError As Long

End Type

Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _

                        (ByVal lpApplicationName As String, _

                        ByVal lpCommandLine As String, _

                        lpProcessAttributes As SECURITY_ATTRIBUTES, _

                        lpThreadAttributes As SECURITY_ATTRIBUTES, _

                        ByVal bInheritHandles As Long, _

                        ByVal dwCreationFlags As Long, _

                        lpEnvironment As Any, _

                        ByVal lpCurrentDriectory As String, _

                        lpStartupInfo As STARTUPINFO, _

                        lpProcessInformation As PROCESS_INFORMATION) _

                        As Long

Виконавча частина:

Sub CreateProc(ByVal file1 As String)

            Dim StartInfo As STARTUPINFO, Pi As PROCESS_INFORMATION

            Dim thrSA As SECURITY_ATTRIBUTES

             Dim procSA As SECURITY_ATTRIBUTES

            With StartInfo

                        .cb = LenB(StartInfo)

            End With

                        CreateProcess (vbNullString, file1, procSA, thrSA, False, _

                                        0, 0, vbNullString, StartInfo, Pi)

End Sub

 

12.3.2. Проблеми доступу до даних іншого Процесу.

 

Кожний із Процесів в операційній системі має свій адресний простір, тому передача даних між двома різними Процесами – задача не тривіальна і вирішується декількома шляхами. Спеціалістам з автоматизації більш цікаві стандартні підходи, які не потребують написання  програм (принаймні складних), а тільки конфігурування для кожного з процесів. Наприклад, для зв’язку таблиці Excel з потрібними даними в базі даних Access, з подальшим автоматичним відновленням інформації, можна скористатися ресурсами самого Excel. Для того, щоб гнучко використовувати такі вбудовані в програмні засоби  можливості, необхідне розуміння внутрішньої сутності функціонування. В зв’язку з цим коротко розглянемо базові поняття функціонування відкритих технологій міжпрограмної (міжпроцесної) взаємодії, а саме DDE/NetDDE, COM/DCOM та WEB технології.

 
 Оставить комментарии Вы можете здесь http://pupena-san.blogspot.com
 
 
 
 
 
Comments