مبعثر/تجميع مأخذ الإدخال/الإخراج غير المتزامن في .NET
-
02-07-2019 - |
سؤال
أحاول استخدام Stream.BeginWrite Async I/O API في .NET لموقف عالي الإنتاجية مع العديد من الرسائل القصيرة.على هذا النحو، ستؤدي واجهة برمجة التطبيقات المبعثرة/المجمعة إلى تقليل عدد محولات السياق (واستخدام وحدة المعالجة المركزية) بشكل كبير.هل تستخدم واجهة برمجة التطبيقات هذه واجهة برمجة التطبيقات LPBUFFERS Win32 على الإطلاق؟هل هناك واجهة برمجة تطبيقات بديلة لـ Scatter/Gather I/O؟
المحلول 4
لا توجد طريقة للقيام بتبعثر/تجميع الإدخال/الإخراج في مأخذ التوصيل في .NET.وفقًا لمنشور مدونة MSFT، قد تكون هناك واجهة برمجة تطبيقات مشابهة في .NET 4.5 (مهما كان...)
نصائح أخرى
وبالنظر إلى مصادر .net، يبدو أن الإجابة المقبولة خاطئة.
SocketAsyncEventArgs
لديه BufferList
يصف.عندما يتم استخدام ذلك، بدلا من Buffer
السمة التي يمكنها الاحتفاظ فقط بكتلة واحدة متجاورة من الذاكرة، يمكن للعمليات الاستفادة من DMA المبعثر/المجمع، كما Socket.SendAsync(SocketAsyncEventArgs)
الاستخدامات WSASend
داخليا ذلك
يسمح بتحديد مخازن مؤقتة متعددة للإرسال مما يجعله قابلاً للتطبيق على نوع التشتت/التجميع للإدخال/الإخراج
و Socket.SendAsync(SocketAsyncEventArgs)
الاستخدامات WSARecv
, ، الذي - التي
يسمح بتحديد مخازن مؤقتة متعددة للاستقبال مما يجعله قابلاً للتطبيق على نوع التشتت/التجميع للإدخال/الإخراج
ليس لدي مصادر .net 3.5 في متناول يدي، ولكن BufferList
موجود منذ .net 3.5، لذلك ربما تم دعم المبعثر/التجميع منذ .net 3.5.تم توثيق الحد الأدنى من متطلبات نظام التشغيل لـ WSASend وWSARecv على أنه Windows Vista / Server 2003.
ملحوظة:لا أعرف ما الدفق الذي تستخدمه، ولكن NetworkStream.BeginWrite
يرسل مخزنًا مؤقتًا واحدًا إلى WSASend، لذا لا يمكنك استخدامه للتشتت/التجميع.
سأكون مندهشًا إذا تمكنت من الوصول إلى واجهة برمجة التطبيقات المبعثرة/المجمعة من BCL (إنها مخصصة لـ l33t w1n32 haxx0rz، هل تعلم؟)، ولكن هناك دائمًا P/Invoc (وهو أمر سهل الاستخدام بشكل مدهش، لقد وجدت).
إذا كنت ترغب في التعمق في أعماق إطار العمل، فهناك عدة طرق للقيام بذلك:
1) العاكس
2) قام MS مؤخرًا بفتح المصدر لأغراض تصحيح الأخطاء، ويمكنك الدخول إليه باستخدام VS2008 إذا قمت بتمكين الخيار ضمن التصحيح/الخيارات/العامة
3) يبدو أن موقع Koders.com يستضيف مصدر إطار العمل أيضًا:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109