वास्तविक जीवन कार्य: लिनक्स में एक प्रोसेस ट्री को कैसे पुनर्स्थापित करें

हम एक CRIU प्रोजेक्ट (चेकपॉइंट / रिस्टोर इन यूजर्सस्पेस) विकसित कर रहे हैं और हमारे पास मूल प्रक्रिया पेड़ को पुनर्स्थापित करने के तरीके पर एक दिलचस्प काम था। मेरा सुझाव है कि आप इसे हल करने का प्रयास करें।

कार्य


CRIU एक उपयोगिता है जो आपको डिस्क या किसी अन्य मशीन पर बाद में डिस्क को संसाधित करने की स्थिति को बचाने और उन्हें हल करने की अनुमति देती है। रिकवरी सबटेस में से एक प्रक्रिया पेड़ को पुनर्स्थापित करने के लिए कार्यों का एक क्रम खोजना है। इनपुट में प्रत्येक प्रक्रिया के लिए मापदंडों का एक सेट होता है: एक विशिष्ट पहचानकर्ता (पीआईडी), माता-पिता (पीपीआईडी) के लिए एक लिंक, और एक सत्र पहचानकर्ता (एसआईडी)।

छवि


नियम जिसके द्वारा लिनक्स प्रक्रियाएं चलती हैं




टीमें:




नमूना इनपुट


इनपुट डेटा में प्रत्येक प्रक्रिया के लिए एक पंक्ति होती है। प्रत्येक पंक्ति में 3 नंबर होते हैं pid, ppid (पैरेंट का पैर), सिड और ज़ोंबी फ्लैग, जिसका मान 0 होता है - यदि प्रक्रिया मृत है ("ज़ोंबी"), और 1 - यदि प्रक्रिया जीवित है।

1 0 1 1
६ १ ६ १
7 ६ 7 १
१५ ६ १२ १
१० १ १ १ १
११ १० 7 १
१३ १० १२ १

नमूना उत्पादन


1: कांटा (6)
6: कांटा (7)
7: सेटिड ()
7: क्लोन (8, CLONE_PARENT)
7: निकास ()
6: प्रतीक्षा ()
8: कांटा (9)
9: कांटा (10)
10: कांटा (11)
10: कांटा (12)
12: सेटिड ()
12: क्लोन (13, CLONE_PARENT)
12: क्लोन (14, CLONE_PARENT)
12: निकास ()
10: प्रतीक्षा (12)
14: कांटा (15)
6: prctl (PR_SET_CHILD_SUBREAPER, 1)
14: निकास ()
10: प्रतीक्षा (14)
6: prctl (PR_SET_CHILD_SUBREAPER, 0)
9: बाहर निकलें ()
8: प्रतीक्षा (9)
6: सेटिड ()
10: सेटिड ()

Source: https://habr.com/ru/post/In195330/


All Articles