Sobes.tech
Middle

რა ხდება პროცესის მეხსიერებასთან, როდესაც ჩვენ ვქმნით მის ნუსხას სისტემური ზარის fork გამოყენებით Linux ოპერაციული სისტემაში?

sobes.tech AI

პასუხი AI-სგან

როდესაც იძახით fork(), ოპერაციული სისტემის ბირთვი ქმნის ახალ პროცესს, რომელიც არის — შვილი პროცესი, რომელიც თითქმის ზუსტად ასახავს მშობელ პროცესს:

მეხსიერების თვალსაზრისით ხდება შემდეგი:

  1. ვირტუალური მისამართის სივრცე: შვილი პროცესი იღებს თავის საკუთრ, ცალკე ვირტუალურ მისამართის სივრცეს, რომელიც იდენტურია მშობელთან fork()-ის დროს. ეს ნიშნავს, რომ შვილი პროცესი "ხედავს" იმავე მისამართების დიაპაზონებს და აქვს იგივე სეგმენტების სტრუქტურა (კოდი, მონაცემები, სტეკი, ჰოლოუ), რაც მშობელს.

  2. ფიზიკური მეხსიერება და Copy-on-Write (CoW): თავდაპირველად, შვილი და მშობელი პროცესები ერთობლივად იყენებენ ერთსა და იმავე ფიზიკურ გვერდებს. ეს ოპტიმიზაცია ცნობილია როგორც "Copy-on-Write" (CoW). ფიზიკური მეხსიერება კოპირდება მხოლოდ მაშინ, როდესაც ერთ-ერთი პროცესი ცდილობს შეცვალოს გვერდის შინაარსი:

    • თუ მშობელი ან შვილი წერს მონაცემებს იმ გვერდზე, რომელიც ადრე საერთო იყო, ბირთვი ქმნის ახალ კოპიას ამ ფიზიკურ გვერდზე.
    • თუ პროცესები მხოლოდ კითხულობენ მონაცემებს, ისინი აგრძელებენ გამოყენებას საერთო ფიზიკურ გვერდს.
  3. ფაილური დესკრიპტორები: გახსნილი ფაილური დესკრიპტორები მემკვიდრეობით გადაეცემა შვილი პროცესს. ორივე პროცესი ერთობლივად იყენებს ფაილის გადაადგილების მაჩვენებლებს.

  4. სხვა რესურსები: სხვა რესურსები, როგორიცაა სიგნალების დამუშავება, მიმდინარე სამუშაო დირექტორია და ა.შ., ასევე კოპირებულია ან მემკვიდრეობით გადაეცემა.

აქ არის გამარტივებული სურათი:

fork()-ის წინ:

+-------------------+
| მშობელი პროცესი |
| +-----------------+ |
| | ვირტუალური მეხსიერება |
| | (კოდი, მონაცემები, ...) |
| +-----------------+ |
|      |              |
|      V              |
| +-----------------+ |
| | ფიზიკური მეხსიერება |
| +-----------------+ |
+-------------------+

fork()-ის შემდეგ (CoW):

+-----------------------+   +-----------------------+
| მშობელი პროცესი     |   |  შვილი პროცესი       |
| +-------------------+ |   | +-------------------+ |
| | ვირტუალური მეხსიერება  | |   | | ვირტუალური მეხსიერება  | |
| | (სწორად იგივე) | |   | | (სწორად იგივე) | |
| +-------------------+ |   | +-------------------+ |
|        |                |   |        |                |
|        V                |   |        V                |
| +-----------------------+   | +-----------------------+
| |    ფიზიკური მეხსიერება  | | |    ფიზიკური მეხსიერება  | |
| | (ზოგიერთი გვერდი საერთო) | | | (ზოგიერთი გვერდი საერთო) | |
| +-----------------------+   | +-----------------------+
+-----------------------+   +-----------------------+
          |                            |
          +----------------------------+
                საწყისი გვერდები საერთო

მნიშვნელოვანია აღინიშნოს, რომ მიუხედავად ერთნაირი ვირტუალური მისამართის სივრცის, fork()-ის შემდეგ, ნებისმიერი ცვლილება მეხსიერებაში ერთ პროცესში (მონაცემების შეცვლა, მეხსიერების განაწილება/თავისუფლება) არ ახდენს გავლენას მეორე პროცესზე, CoW მექანიზმის გამო. ეს არის სრულიად დამოუკიდებელი პროცესები.