Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные / ОС_лабораторная 2.docx
Скачиваний:
8
Добавлен:
12.02.2024
Размер:
3.33 Mб
Скачать
  1. Задание 2. Функции получения системной информации

Цели работы:

изучение системных средств порождения и взаимодействия процессов и потоков в ОС GNU/LINUX.

  1. Задание 2.1. Получение системной информации.

Задание 1

Написать программу, создающую два дочерних процесса с использованием двух вызовов fork (). Родительский и два дочерних процесса должны выводить на экран свой pid и pid родительского процесса и текущее время в формате: часы:минуты:секунды. Используя вызов system (), выполнить команду ps -x в родительском процессе. Найти свои процессы в списке запущенных процессов. Первый дочерний процесс, помимо указанного вывода, также выводит информацию по варианту (табл.3), используя вызов system ().

Второй дочерний процесс после вывода основной информации должен быть замещен задачей, создающей два дочерних потока (п.3 задания).

Задание 2

Написать программу, создающую два дочерних потока. Родительский

процесс и два дочерних потока должны выводить на экран свой id и pid родительского процесса и текущее время в формате: часы:минуты:секунды Код для задания 1

'''Библиотеки/модули для получение системной информации'''

import time

import subprocess

import os

import psutil

# Первый дочерний процесс

# Создаем первый дочерний процесс

child1 = os.fork()

# ждать любого дочернего процесса, чей

# идентификатор группы процессов равен абсолютному значению pid

if child1 == -1:

print("Ошибка при создании первого дочернего процесса")

exit(1)

# ожидать любого дочернего процесса чей идентификатор

группы процессов равен таковому у текущего процесса

if child1 == 0:

print(f"Дочерний процесс 1 (PID {os.getpid()}, PPID {os.getppid()}) время: {time.strftime('%H:%M:%S')}")

# Вывод статистики использования процессора

cpu_percent = psutil.cpu_percent(interval=1)

print(f"Статистика использования процессора: {cpu_percent}%")

exit(0)

# Второй дочерний процесс

child2 = os.fork()

if child2 == -1:

print("Ошибка при создании второго дочернего процесса")

exit(1)

if child2 == 0:

print(f"Дочерний процесс 2 (PID {os.getpid()}, PPID {os.getppid()}) время: {time.strftime('%H:%M:%S')}")

subprocess.call(["python3", "LABA2.py"])

exit(0)

print(f"Родительский процесс (PID {os.getpid()}) время: {time.strftime('%H:%M:%S')}")

# Выполняем команду ps -x и ищем свои процессы

print("Информация о процессах с помощью ps -x:")

subprocess.call("ps -x | grep " + str(os.getpid()), shell=True) # оболочка командной строки

# ожидание завершение доч. процесса

os.wait()

os.wait()

Код для задания 2

import threading # для работы с потоками.

import datetime

import os

# Функция для вывода информации о потоке

def print_thread_info(thread_name, parent_pid):

thread_id = threading.current_thread().ident # получение идентификатора текущего потока

current_time = datetime.datetime.now().strftime("%H:%M:%S")

print(f"{thread_name} ID: {thread_id} PID: {parent_pid} время: {current_time}")

def main():

# Получаем PID родительского процесса

parent_pid = os.getpid()

# Создаем первый дочерний поток

thread1 = threading.Thread(target= print_thread_info, args=("Дочерний поток 1", parent_pid))

# Создаем второй дочерний поток

thread2 = threading.Thread(target=lambda: print_thread_info("Дочерний поток 2", parent_pid))

# Вывод информации о родительском процессе

print_thread_info("Родительский процесс", parent_pid)

# Запускаем дочерние потоки

thread1.start()

thread2.start()

# Ждем завершения обоих дочерних потоков

thread1.join()

thread2.join()

if __name__ == "__main__":

main()

На рисунках 23-24 представлено работа программы, которая была описана выше.

Рисунок 23 – Вывод задания 1

Рисунок 24 – Вывод задания 2

Вывод

Изучил архитектуру и основные компоненты ядра Linux, включая механизм системных вызовов. Изучил возможности утилиты strace для отладки и анализа работы программ на уровне системных вызовов. Приобрел практический навык создания и загрузки модуля в ядро Linux.