Überlegungen zu Multitasking
Die empfohlene Richtlinie besteht darin, so wenige Threads wie möglich zu verwenden, wodurch die Nutzung von Systemressourcen minimiert wird. Dadurch wird die Leistung verbessert. Multitasking hat Ressourcenanforderungen und potenzielle Konflikte, die beim Entwerfen Ihrer Anwendung berücksichtigt werden müssen. Die Ressourcenanforderungen sehen wie folgt aus:
- Das System verbraucht Arbeitsspeicher für die Kontextinformationen, die sowohl für Prozesse als auch für Threads erforderlich sind. Daher ist die Anzahl der Prozesse und Threads, die erstellt werden können, durch den verfügbaren Arbeitsspeicher begrenzt.
- Die Verfolgung einer großen Anzahl von Threads verbraucht erhebliche Prozessorzeit. Wenn zu viele Threads vorhanden sind, können die meisten von ihnen keine signifikanten Fortschritte machen. Befinden sich die meisten der aktuellen Threads in nur einem Prozess, werden Threads in anderen Prozessen seltener eingeplant.
Die Bereitstellung eines gemeinsamen Zugriffs auf Ressourcen kann zu Konflikten führen. Um sie zu vermeiden, müssen Sie den Zugriff auf freigegebene Ressourcen synchronisieren. Dies gilt für Systemressourcen (z. B. Kommunikationsports), ressourcen, die von mehreren Prozessen (z. B. Dateihandles) gemeinsam genutzt werden, oder die Ressourcen eines einzelnen Prozesses (z. B. globale Variablen), auf die von mehreren Threads zugegriffen wird. Wenn der Zugriff nicht ordnungsgemäß synchronisiert wird (in demselben oder in verschiedenen Prozessen), kann dies zu Problemen wie Deadlocks und Racebedingungen führen. Die Synchronisierungsobjekte und Funktionen, die Sie verwenden können, um die Ressourcenfreigabe zwischen mehreren Threads zu koordinieren. Weitere Informationen zur Synchronisierung finden Sie unter Synchronisieren der Ausführung mehrerer Threads. Wenn Sie die Anzahl der Threads verringern, können Ressourcen einfacher und effektiver synchronisiert werden.
Ein guter Entwurf für eine Multithreadanwendung ist der Pipelineserver. In diesem Entwurf erstellen Sie einen Thread pro Prozessor und erstellen Warteschlangen mit Anforderungen, für die die Anwendung die Kontextinformationen verwaltet. Ein Thread würde alle Anforderungen in einer Warteschlange verarbeiten, bevor Anforderungen in der nächsten Warteschlange verarbeitet werden.