Анализ разницы между процессом и потоком операционной системы

Java задняя часть Операционная система Linux

Аппаратный состав системы

Чтобы понять, что происходит при запуске программы, нужно понять аппаратную организацию типичной системы.
image
- автобус

Шина (Bus) — общая коммуникационная магистраль для передачи информации между различными функциональными узлами компьютера, представляющая собой жгут передачи, состоящий из проводов.

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

  • Устройства ввода/вывода
    Мониторы, мыши, клавиатуры и т. д., каждое устройство ввода-вывода подключено кшина ввода/выводаподключен для передачи информации.

  • Основная память Временное запоминающее устройство, используемое для хранения программ и логики обработки программ, пока процессор выполняет программу.

  • процессор
    Ядром способности калькулятора выполнять команды является механизм, который интерпретирует (выполняет) инструкции, хранящиеся в основной памяти.С момента включения системы до выключения питания ЦП постоянно выполняет инструкции.

Операционная система

Для аппаратных средств, упомянутых выше, наши программы, как правило, не имеют прямого доступа к этим аппаратным устройствам, а вместо этого управляют ими через операционную систему.
Операционная система имеет 2 основные функции
1) Ограничить доступ обычных программ к оборудованию, чтобы предотвратить злоупотребление оборудованием неконтролируемыми приложениями.
2) Предоставляет приложениям простой и согласованный механизм управления сложными и разрозненными низкоуровневыми аппаратными устройствами.

Операционная система использует несколько основных концепций (процесс,виртуальная память,документ) для достижения этих двух функций

image

Среди них файл — это абстракция устройств ввода-вывода, виртуальная память — это абстрактное представление основной памяти и дисковых устройств ввода-вывода, а процесс — это абстрактное представление процессоров, основной памяти и устройств ввода-вывода.

процесс

концепция процесса

Чтобы достичьмногозадачная система"Современные операционные системы выдвинули концепцию процесса. На заре системы Linux процесс был основной единицей планирования ЦП. Позже, поскольку операционная система обычно вводила концепцию потока,Поток становится основной единицей планирования ЦППроцесс может использоваться только как основная единица владения ресурсами.

В операционной системе процессы предоставляют приложениям две важные абстракции:
1) Он использует процессор независимо (посредством планирования процессов, распределения времени ЦП)
1) Он использует основную память независимо (отображается через виртуальное адресное пространство процесса)

дескриптор процесса

С абстрактной концепцией давайте посмотрим на фактическое представление процесса в Linux, в Linuxtask_structСтруктура дескриптора представляет собой управляющий блок процесса, этоtask_structСтруктура записывает все контексты этого процесса (информация о контексте процесса)

struct task_struct{
    //列出部分字段
    volatitle long state;//表示进程当前的状态 ,-1表示不可运行,0表示可运行,>0表示停止
    void                *stack; //进程内核栈
    unsigned int            ptrace;

    pid_t               pid;//进程号
    pid_t               tgid;//进程组号
    struct              mm_struct *mm,*active_mm //用户空间 内核空间

    struct              list_head thread_group;//该进程的所有线程链表
    struct              list_head thread_node;
    int                 leader;//表示进程是否为会话主管
    struct              thread_struct thread;//该进程在特定CPU下的状态

    //等等字段:包括一些 表示 使用的文件描述符、该进程被CPU调度的次数、时间、父子、兄弟进程等信息
}

виртуальная память (виртуальное адресное пространство)

Виртуальная память — это абстрактное понятие, создающее для каждого процесса иллюзию того, что каждый процесс использует исключительно основную память (всю область памяти).
Виртуальная память соответствует описанной выше структуре mm_struct, и каждый процесс имеет свою собственную независимую память.mm_structСтруктура, каждый процесс активен в своем адресном пространстве и не мешает друг другу.

image

Пространство виртуальной памяти содержит следующие

Текстовый сегмент, сегмент данных, BBS

TextSegmentСегмент кода, представляющий программу

DataSegmentПредставляет глобальные переменные и статические локальные переменные, которые были инициализированы и чье начальное значение не равно 0.
BBSПредставляет глобальные переменные и статические локальные переменные, которые не инициализированы или имеют начальное значение 0.

Операционная система отвечает за загрузку этих сегментов и выделение памяти.время компиляцииСегментация завершена.

Куча

стек: используется для хранениялокальная переменная,параметр функции,адрес возврата функции

куча

Динамически выделяемая память управляется и освобождается пользователем.Размер кучи может динамически увеличиваться и уменьшаться во время выполнения (вызовы функций C), так как свободное адресное пространство является прерывистым, а куча хранится в связанном списке в операционной системе. система. .

Пространство ядра

Пространство ядра является частью операционной системы и находится в памяти. Операционная система не позволяет обычным пользовательским приложениям читать и записывать содержимое этой области или напрямую вызывать функции, определенные в пространстве ядра.

Структурная схема виртуальной памяти в ядре

Поле в task_struct указывает на mm_struct, описывающее текущее состояние виртуальной памяти, гдеpdg
указывает на базовый адрес таблицы страниц первого уровня, иmmapуказать наvm_area_structsсвязанный список структур региона, каждыйvm_area_structsОба описывают область текущего виртуального адресного пространства.

Как виртуальная память использует основную память в качестве кеша

И физическая память, и виртуальная память используют страницы в качестве единиц хранения для диска и памяти.
Из-за существования таблицы страниц нет необходимости кэшировать все страницы виртуальной памяти (на диске) в памяти, даже когда ЦП обращается к страницам виртуальной памяти, которые не существуют в памяти, система просматривает таблицу и сохраняет нужные страницы Копировать с диска в память (с использованием алгоритма подкачки).
image

контекст процесса

Контекст процесса: когда процесс выполняется, значения во всех регистрах ЦП, состояние процесса и содержимое стека. Когда ядро ​​переключает процессы, ему необходимо сохранить все состояния текущего процесса, то есть сохранить контекст текущего процесса, чтобы при повторном выполнении процесса можно было восстановить состояние на момент переключения и выполнение может продолжаться.

нить

Поток иногда называют облегченным процессом (LWP) в Linux, и это наименьшая единица потока выполнения программы. Стандартный поток состоит из идентификатора потока, указателя текущей инструкции (PC), набора регистров и стека. Кроме того, поток является сущностью в процессе, и это базовая единица, независимо планируемая и диспетчеризируемая системой.Сам поток не владеет системными ресурсами, а лишь несколькими ресурсами, необходимыми для работы.Потоки совместно используют все ресурсы. принадлежит процессу (разделяют все виртуальное адресное пространство).

реализация потока

В Linux потоки и процессы фактически используют одну и ту же структуру.task_struct,существуетlinuxНа глаз он не различает процессы и потоки.Когда ядро ​​планирует процессные задачи, оно выбирает только одно в соответствии с алгоритмом планирования.task_struct, что касается этогоtask_struct, в конце концов это процесс или поток Ядру все равно.
Принадлежность к одному и тому же процессу имеет понятие группы потоков, когда поток создается,task_structструктура, но этоtask_structОбщая виртуальная память процесса (т.task_structв структуреmm_sruct mmполе). Это из-за многопоточного обменаmm_struct mm.

Диаграмма модели данных многопоточности в ядре

image
В linux C используйте функцию fork() для создания процесса, используйте pthread_create для создания потока,
На приведенном выше рисунке структура task_struct справа создается структурой task_struct слева с помощью pthread_create(). Эти 2 task_struct Поделиться mm_struct по указателю.

переключатель контекста

Когда ЦП переходит от одного потока (процесса) к другому потоку (процессу), ему необходимо сохранить контекстную информацию текущего рабочего потока, чтобы его можно было повторно запустить, когда он вернется в следующий раз. Эта информация включает,
Как и многопроцессорность, многопоточность потребляет переключение контекста, но переключение контекста потока намного меньше, чем переключение процесса.\
image

простое логическое описание

  1. Процесс А запущен
  2. Происходит тактовое прерывание, ring1->ring0, запускается обработчик тактового прерывания
  3. Планирование процесса, указан следующий процесс B для запуска
  4. Процесс B возобновляется, ring0->ring1
  5. Процесс Б запущен

Ring — уровень привилегий процессора, ring0 — уровень ядра.

Многопоточность против многопроцессорности

  • Память кучи совместно используется несколькими потоками, в то время как процессы независимы друг от друга, а взаимодействие между потоками может быть реализовано непосредственно на основе общей памяти, что легче, чем методы многопроцессного взаимодействия, обычно используемые процессами.
  • С точки зрения переключения контекста, как многопоточность, так и все процессы предполагают сохранение регистров и стеков, но потокам не нужно переключать карты страниц (пространство виртуальной памяти), файловые дескрипторы и т. д., поэтому переключение контекста потоков также легче, чем у многопроцессорного количества
  • Многопроцессность безопаснее, чем многопоточность, один процесс практически не влияет на другой процесс
    В реальной разработке обычно требуется связь между различными задачами (поток или процесс можно назвать задачей), и существует больше сценариев, использующих многопоточность, чем многопроцессорность. Однако многопроцессность имеет более высокую отказоустойчивость, сбой одного процесса не приведет к сбою всей системы, в случае высокой безопасности задач используется многопроцессность.

Корутины, корутины, корутины

Понять напрямую через характеристики сопрограмм
- Корутины - это легковесные потоки в пользовательском режиме, ядро ​​операционной системы ничего не знает о сопрограммах.
- Планирование сопрограммы полностью контролируется приложением, и операционная система не заботится об этой части планирования.
- Поток может содержать одну или несколько сопрограмм.
- Сопрограмма имеет свой собственный регистровый контекст и стек.Когда сопрограмма запланирована на переключение, верхние и нижние регистры и стеки сохраняются, а при обратном переключении восстанавливаются ранее защищенный регистровый контекст и стек.
— Сопрограмма может сохранять состояние последнего вызова, и здесь появилось понятие различных генераторов (генераторы — это кастрированные сопрограммы). .
Реализация под Windows называется волокном

переполнение стека

public class Stack {
    static  int time = 0;
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        time++;
        System.out.println("time ="+time);
        test();
    }
}
//time =6957Exception in thread "main" java.lang.StackOverflowError

Java устанавливает размер стека при создании потока

    /**
    *     * <p>The virtual machine is free to treat the {@code stackSize}
     * parameter as a suggestion.  If the specified value is unreasonably low
     * for the platform, the virtual machine may instead use some
     * platform-specific minimum value; if the specified value is unreasonably
     * high, the virtual machine may instead use some platform-specific
     * maximum.  Likewise, the virtual machine is free to round the specified
     * value up or down as it sees fit (or to ignore it completely).
    */
    public Thread(ThreadGroup group, Runnable target, String name,
                  long stackSize) {
        init(group, target, name, stackSize);
    }

переполнение кучи

public class Heap {
    public static void main(String[] args)
    {
        ArrayList v=new ArrayList();
        for(int i=0;i<25;i++)
            v.add(new byte[1*1024*1024*1024]);
    }
}
//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//  at Heap.main(Heap.java:13)

Виртуальная машина Java указывает размер кучи (куча — это область совместного использования потоков).

Java虚拟机的堆大小如何设置:命令行
 java –Xms128m   //JVM占用最小内存
     –Xmx512m   //JVM占用最大内存
     –XX:PermSize=64m   //最小堆大小
     –XX:MaxPermSize=128m //最大堆大小