რა ხდება პროცესის მეხსიერებასთან, როდესაც ჩვენ ვქმნით მის ნუსხას სისტემური ზარის fork გამოყენებით Linux ოპერაციული სისტემაში?
sobes.tech AI
პასუხი AI-სგან
როდესაც იძახით fork(), ოპერაციული სისტემის ბირთვი ქმნის ახალ პროცესს, რომელიც არის — შვილი პროცესი, რომელიც თითქმის ზუსტად ასახავს მშობელ პროცესს:
მეხსიერების თვალსაზრისით ხდება შემდეგი:
-
ვირტუალური მისამართის სივრცე: შვილი პროცესი იღებს თავის საკუთრ, ცალკე ვირტუალურ მისამართის სივრცეს, რომელიც იდენტურია მშობელთან
fork()-ის დროს. ეს ნიშნავს, რომ შვილი პროცესი "ხედავს" იმავე მისამართების დიაპაზონებს და აქვს იგივე სეგმენტების სტრუქტურა (კოდი, მონაცემები, სტეკი, ჰოლოუ), რაც მშობელს. -
ფიზიკური მეხსიერება და Copy-on-Write (CoW): თავდაპირველად, შვილი და მშობელი პროცესები ერთობლივად იყენებენ ერთსა და იმავე ფიზიკურ გვერდებს. ეს ოპტიმიზაცია ცნობილია როგორც "Copy-on-Write" (CoW). ფიზიკური მეხსიერება კოპირდება მხოლოდ მაშინ, როდესაც ერთ-ერთი პროცესი ცდილობს შეცვალოს გვერდის შინაარსი:
- თუ მშობელი ან შვილი წერს მონაცემებს იმ გვერდზე, რომელიც ადრე საერთო იყო, ბირთვი ქმნის ახალ კოპიას ამ ფიზიკურ გვერდზე.
- თუ პროცესები მხოლოდ კითხულობენ მონაცემებს, ისინი აგრძელებენ გამოყენებას საერთო ფიზიკურ გვერდს.
-
ფაილური დესკრიპტორები: გახსნილი ფაილური დესკრიპტორები მემკვიდრეობით გადაეცემა შვილი პროცესს. ორივე პროცესი ერთობლივად იყენებს ფაილის გადაადგილების მაჩვენებლებს.
-
სხვა რესურსები: სხვა რესურსები, როგორიცაა სიგნალების დამუშავება, მიმდინარე სამუშაო დირექტორია და ა.შ., ასევე კოპირებულია ან მემკვიდრეობით გადაეცემა.
აქ არის გამარტივებული სურათი:
fork()-ის წინ:
+-------------------+
| მშობელი პროცესი |
| +-----------------+ |
| | ვირტუალური მეხსიერება |
| | (კოდი, მონაცემები, ...) |
| +-----------------+ |
| | |
| V |
| +-----------------+ |
| | ფიზიკური მეხსიერება |
| +-----------------+ |
+-------------------+
fork()-ის შემდეგ (CoW):
+-----------------------+ +-----------------------+
| მშობელი პროცესი | | შვილი პროცესი |
| +-------------------+ | | +-------------------+ |
| | ვირტუალური მეხსიერება | | | | ვირტუალური მეხსიერება | |
| | (სწორად იგივე) | | | | (სწორად იგივე) | |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | ფიზიკური მეხსიერება | | | ფიზიკური მეხსიერება | |
| | (ზოგიერთი გვერდი საერთო) | | | (ზოგიერთი გვერდი საერთო) | |
| +-----------------------+ | +-----------------------+
+-----------------------+ +-----------------------+
| |
+----------------------------+
საწყისი გვერდები საერთო
მნიშვნელოვანია აღინიშნოს, რომ მიუხედავად ერთნაირი ვირტუალური მისამართის სივრცის, fork()-ის შემდეგ, ნებისმიერი ცვლილება მეხსიერებაში ერთ პროცესში (მონაცემების შეცვლა, მეხსიერების განაწილება/თავისუფლება) არ ახდენს გავლენას მეორე პროცესზე, CoW მექანიზმის გამო. ეს არის სრულიად დამოუკიდებელი პროცესები.