Среда: macOS Mojave, 6-ядерный I7 Mac mini.
Я написал сервер ModBus, использующий LibModbus для обеспечения Modbus-логики, и GCD-файл-дескриптор-источник отправки для реализации логики сервера,
При запуске внутри простой цели командной строки, используя dispatch_main()
в main.c, как рекомендовано, сервер работает отлично - легко обрабатывает непрерывные тысячи запросов ModBus в секунду.Внутреннее использование неблокирующих сокетов и SO_REUSEADDR позволяет серверу успешно перерабатывать один и тот же сокет бесконечно.Он практически не использует процессор и незначительную оперативную память.
Если я возьму точно того же исходного кода и вызову его в оболочке приложения NSApplication
, он станет бесполезным pig , неспособным надежно обрабатывать десяткизапросов в секунду без удушья после 256 запросов (интересное число, но что это означает ?).В оболочке приложения больше ничего не происходит - его единственная задача - разместить сервер.
Я пытался оснастить версию приложения инструментами, но ни один из инструментов не предоставил мне никакой полезной информации, кроме того, что казалось, что версия приложения порождает множество потоков.
Чтобы подчеркнуть элементарную природу версии приложения, вот все содержимое файла AppDelegate.m:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self performSelectorOnMainThread: @selector(applicationDidBeginRunLoop:)
withObject: nil
waitUntilDone: NO
];
}
- (void) applicationDidBeginRunLoop: (id) ignored
{
self.server = [GCDModbusSlave modbusSlave];
[self.server run];
}
- а вот main () из версии инструмента:
int main(void)
{
modbusSlave = [GCDModbusSlave modbusSlave];
[modbusSlave run];
dispatch_main();
}
Я надеюсь, что только что забыл что-то глупое, и я ищу хорошие вопросы.