هل من الممكن معرفة ما إذا كان عملية ينتظر في دولة محظور على تلقي) دعوة (على لينكس؟

StackOverflow https://stackoverflow.com/questions/1017427

سؤال

وهدفي الرئيسي هو تنفيذ عمليات واحدا تلو الآخر بطريقة ذهاب وإياب حتى تحصل على واحد المكالمات () والمحظورة، بحيث يتحول تنفيذ لعملية المقبل في قائمة الانتظار. هناك تطبيق وحدة التحكم التي يتم ترميز في جاوة وينفذ هذه العمليات (التي هي أيضا تطبيقات جافا) باستخدام Runtime.getRuntime (). إكسيك () ويحافظ على القيم التي هي عودة الأجسام عملية.

لتحقيق هذا الغرض، ولست بحاجة لالتقاط التلقي () يدعو (أو الدول، والتي يتم حظرها) ونقول لهم لتطبيق جهاز التحكم (الماجستير).

ويمكنني أن أذهب كما على مستوى منخفض كما تريد إذا كان ذلك ممكنا .. وكان فكرتي الأولى إلى الحصول على هذه المعلومات من السائق ومن ثم أقول ذلك لطلبي تحكم جافا. كنت قد كتبت وحدة شبكة نواة لينكس الذي يجسد إرسال واستقبال العمليات، ولكن AFAIK وظيفة socket.receive () لا يقول أي شيء لبرنامج تشغيل شبكة الاتصال.

وهكذا، أعتقد أن الخيارات للحصول على هذه المعلومات سواء من JVM، على نحو ما تحصل عليه من أمر لينكس أو نحو ذلك، أو ربما من خلال وحدة نواة لينكس؟

ما هي اقتراحاتكم؟

هل كانت مفيدة؟

المحلول

إذا كنت تريد أن تعرف إذا يتم حظر المواضيع الخاصة بك، أو بالضبط ما يتم حظر هم على ذلك، يمكنك إما أن تتخذ تفريغ موضوع أو استخدام أداة مثل <وأ href = "http://java.sun.com/javase /6/docs/technotes/tools/share/jvisualvm.html "يختلط =" نوفولو noreferrer "> jvisualvm لنعلق على هذه العملية، ونلقي نظرة (في jvisualvm كنت إرفاق العملية، واتخاذ تفريغ موضوع وبعد ذلك ننظر في نشاط كل موضوع).

نصائح أخرى

هل نظرت في systemtap ؟ يجب أن تكون متاحة بسهولة على أنظمة فيدورا الأخيرة.

وأفضل أندرس

وأنا لا أعرف إذا كان هذا سوف تساعدك، ولكن هل يمكن الحصول على معلومات حول حالة خيط جافا على الجهاز الخاص بك باستخدام إرفاق المحلية.

1) إضافة tools.jar إلى CLASSPATH الخاص بك واستخدام VirtualMachine.list () للحصول على قائمة JVM تشغيل عليك الجهاز.

2) إرفاق JVM معالجتها باستخدام VirtualMachine.attach (virtualMachineDescriptor)

و3) الحصول على عنوان الرابط المحلي، vm.getAgentProperties () الحصول على ( "com.sun.management.jmxremote.localConnectorAddress")؛.

و4) استخدام JMXConnectorFactory.newJMXConnector (...) للاتصال JVM

و5) من الاتصال JMX متابعة البحث ThreadMXBean

و6) من ThreadMXBean تحصل على مجموعة من ThreadInfos التي تصف كل المواضيع في JVM.

و7) من TheadInfo # getThreadState () يمكنك التحقق إذا كانت الدولة هي ThreadState.BLOCKED

ويجب عليك استخدام الأوليات اتصال interprocess في العمليات المنفذة لإعلام التطبيق تحكم أنهم مستعدون لاستقبال البيانات.

وأنت لا يمكن وضع افتراضات حول كيفية تنفيذ العمليات الطفل مأخذ على قراءة. أنها يمكن أن تستخدم ريكف، أو تحديد، أو الاستقصاء، وما إلى ذلك، لانتظار بيانات الشبكة.

وهناك بالفعل عدد قليل من النقاط هنا. جدولة لينكس ذكية بما فيه الكفاية لاستباق مهمة المحظورة. وهذا يعني، إذا كنت استدعاء التلقي () وليس هناك شيء في انتظار تلقي، من المحتمل أن يكون وضع مهمتك أن ينام إلى أن يحين الوقت أن الدعوة سيعود. لا تحتاج لمعالجة الجدولة. ونواة لينكس قيام بذلك نيابة عنك.

ومع ذلك، إذا كنت بحاجة إلى معرفة ما إذا كان يتم حظر مهمتك من بعض التطبيقات الشيطان، إذا كنت على استعداد لكتابة LKM، لماذا لا مجرد الحصول على هذه المهمة في قائمة المهام التي كنت مهتما، والاختيار حالته؟

وبطبيعة الحال، مجرد التحقق من حالة المهمة قد لا اقول لكم بالضبط ما تريد. إذا الدولة مهمتك هي TASK_INTERRUPTIBLE، فإنه يقول لكم بأن مهمتك ينتظر على <القوي> شيء ، لكن قد لا يكون مسألة تافهة لمعرفة ما هو هذا شيء. وبالمثل، يمكن مهمتك أن يكون في حالة TASK_RUNNING وليس في الواقع أن تعمل على وحدة المعالجة المركزية في اللحظة الراهنة (ولكن، على الأقل، في ولاية TASK_RUNNING تعلمون لا يتم حظر مهمتك).

ويمكنك إرسال مجرد إشارة QUIT (Ctrl- \ على وحدة التحكم) للحصول على تفريغ الموضوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top