Linux System Programming
Български
Български
  • Въведение
  • Част 1 - Основи на Линукс
    • Какво е системно програмиране?
    • Работна среда
    • Отдалечен достъп
    • Как да получите помощ в Линукс?
    • Файлова система
    • Трансфер на файлове
    • Процеси в Линукс
    • Потребители и групи
    • Файлови разрешения
    • Управление на потребители и групи
    • Стандартни потоци
    • Пренасочване и тръбопроводи
    • Текстовият редактор Nano
    • Упражнение върху основи на Линукс
  • Част 2 – Програмиране
    • Kомпилиране
    • Компилатор
    • Изходен програмен код
    • Компилирайте в асемблер
    • Компилирайте до обектен файл
    • Компилирайте до изпълнима програма
    • Стартирайте изпълнимата програма
    • Библиотеки
    • Архиватор
    • Създаване на обектните файл
    • Създаване на статична и динамична библиотеки
    • Програма за намиране сумата на числа
    • Дебъгване
    • Упражнение върху тема програмиране
  • Част 3 – Файлова система и файлове
    • Файлове
    • Файлови системи и именовани пространства
    • Работа с файлове
    • Буферирани срещу небуферирани потоци
    • Библиотека за работа с файлове
    • Отваряне и затваряне на файл
    • Четене на съдържанието на файл
    • Четене и отпечатване на файл
    • Четене и писане на файл
    • Запис на изречения във файл
    • Търсене в файлове и откъслечни файлове
    • Направете файл с дупка
    • Заключване на файлове
    • Заключи и пиши там
    • Упражнение върху работа с файлове
  • Част 4 – Процеси
    • Процеси
    • Управление на процесите
    • Методи за работа с процеси
    • Изпълнение на команда
    • Показване на изходния код на файла
    • Стартиране на дъщерен процес
    • Отпечатване на идентификаторите на процесите
    • Изчакване и прекратяване на дъщерен процес
    • Изпълнение и отпечатване на състоянието
    • Зомбита и проста обработка на сигнали
    • Игра на зомбита
    • Упражнение върху процеси
  • Част 5 – Комуникация между процеси
    • Методи за комуникация между процеси
    • Сигнали
    • Най-важните сигнали
    • Управление на сигналите
    • Обработка на сигнал
    • Изчакване на сигнали
    • Разглеждане на сигнали
    • Показване на информация за сигналите
    • Reentrancy
    • Анонимни и наименувани тръби
    • Работа с тръби
    • Използване на анонимни тръби
    • Използване на именовани тръби
    • Упражнение върху комуникация между процеси
  • Част 6 - Синхронизация на комуникацията между процесите
    • Опашка за съобщения
    • Библиотеки за работа със съобщения
    • Определяне на общите данни
    • Сървър за съобщения
    • Клиент за съобщения
    • Споделена памет
    • Библиотеки за работа със споделена памет
    • Определяне на общите данни
    • Сървър за памет
    • Клиент за памет
    • Семафори
    • Библиотеки за работа със семафори
    • Определяне на общите данни
    • Семафор Сървър
    • Семафор Клиент
    • Упражнение за синхронизация на комуникация между процеси
  • Част 7 – Сокети
    • Сокетите в Линукс
    • Работа със сокети в C
    • Използване на Unix сокети
    • Файл сокет сървър
    • Файл сокет клиент
    • Двойка сокети
    • Пример за двойка сокети
    • Мрежови сокети
    • Мрежов сокет сървър
    • Мрежов сокет клиент
    • Упражнение върху сокети
  • Част 8 – Нишки
    • Въведение в нишките
    • Библиотека за работа с нишки
    • Функции за управление на нишки
    • Създаване на нишки
    • Финализиране на нишки
    • Съединяване на нишки
    • Пример за съединяване на нишки
    • Функции за прекратяване на нишки
    • Типове при прекратяване на нишки
    • Пример за прекратяване на нишки
    • Упражнение върху нишки
  • Част 9 - Синхронизация на нишки
    • Изход от нишка
    • Управление на изход от нишка
    • Пример за изход от нишкa
    • Защо е необходима синхронизация?
    • Механизми за синхронизация
    • Мютекси
    • Кога е необходимо заключване?
    • Типична употреба на мютекси
    • Проблеми при състезателни условия
    • Безопасен за нишките код
    • Състояние на мъртва хватка
    • Създаване и унищожаване на мютекси
    • Заключване и отключване на мутекси
    • Пример за синхронизиране посредством използване на мютекс
    • Синхронизиране със семафори
    • Пример за синхронизиране посредством използване на семафор
    • Упражнение за синхронизация на нишки
  • Част 10 – Демони
    • Какво са демоните?
    • Скелет на демон
    • Чат демон
Powered by GitBook
On this page

Was this helpful?

  1. Част 4 – Процеси

Процеси

PreviousЧаст 4 – ПроцесиNextУправление на процесите

Last updated 3 years ago

Was this helpful?

  • Процесите са обектен код в изпълнение: активни, живи, изпълняващи се програми.

  • Процесите се състоят от данни (data), ресурси (resources), състояние (state) и виртуализиран компютър (virtualized computer).

  • Всеки процес е представен от уникален идентификатор на процеса (pid).

  • Процесът който ядрото стартира, когато няма други изпълними процеси е процесът на празен ход (idle process), неговия идентификатор pid = 0.

  • Процесът, който създава нов процес, е известен като родителски (parent), а новият процес е известен като дъщерен (child).

  • Всеки процес е собственост на потребител (user) и група (group).

Възможните състояния не един процес са представени на фигурата по-долу:

Note:

If files are the most fundamental abstraction in a Unix system, processes are the second most fundamental. Processes are object code in execution: active, alive, running programs. But they're more than just object code—processes consist of data, resources, state, and a virtualized computer.

Processes begin life as executable object code, which is machine-runnable code in an executable format that the kernel understands (the format most common in Linux is ELF). The executable format contains metadata, and multiple sections of code and data. Sections are linear chunks of the object code that load into linear chunks of memory. All bytes in a section are treated the same, given the same permissions, and generally used for similar purposes.

The most important and common sections are the text section, the data section, and the bss section. The text section contains executable code and read-only data, such as constant variables, and is typically marked read-only and executable. The data section contains initialized data, such as C variables with defined values, and is typically marked readable and writable. The bss section contains uninitialized global data. Because the C standard dictates default values for C variables that are essentially all zeros, there is no need to store the zeros in the object code on disk. Instead, the object code can simply list the uninitialized variables in the bss section, and the kernel can map the zero page (a page of all zeros) over the section when it is loaded into memory. The bss section was conceived solely as an optimization for this purpose. The name is a historic relic; it stands for block started by symbol, or block storage segment. Other common sections in ELF executables are the absolute section (which contains nonrelocatable symbols) and the undefined section (a catchall).

A process is also associated with various system resources, which are arbitrated and managed by the kernel. Processes typically request and manipulate resources only through system calls.

Resources include timers, pending signals, open files, network connections, hardware, and IPC mechanisms. A process' resources, along with data and statistics related to the process, are stored inside the kernel in the process' process descriptor.

A process is a virtualization abstraction. The Linux kernel, supporting both preemptive multitasking and virtual memory, provides a process both a virtualized processor, and a virtualized view of memory. From the process' perspective, the view of the system is as though it alone were in control. That is, even though a given process may be scheduled alongside many other processes, it runs as though it has sole control of the system. The kernel seamlessly and transparently preempts and reschedules processes, sharing the system's processors among all running processes. Processes never know the difference.

Similarly, each process is afforded a single linear address space, as if it alone were in control of all of the memory in the system. Through virtual memory and paging, the kernel allows many processes to coexist on the system, each operating in a different address space. The kernel manages this virtualization through hardware support provided by modern processors, allowing the operating system to concurrently manage the state of multiple independent processes.

01_processes.png