Потоки и Процессы По сравнению с MultiThreading и Многоядерный/Многопроцессорный: Как они отображаются?

  • vtable может быть изменено или даже непосредственно получено доступ во времени выполнения?
  • Не портативно, но если Вы не возражаете против злых шуток, уверенных!

    ПРЕДУПРЕЖДЕНИЕ : Эта техника не рекомендуется для использования детьми, взрослыми моложе 969 , или маленькие пушистые создания от Alpha Centauri. Побочные эффекты могут включать демоны, которые летят из Вашего носа , резкое появление Yog-Sothoth, поскольку необходимое утверждающее лицо на всем последующем коде рассматривает, или добавление обратной силы IHuman::PlayPiano() ко всем существующим экземплярам]

    В большинстве компиляторов, я видел, vtbl * составляет первые 4 байта объекта, и vtbl содержание является просто массивом членских указателей там (обычно в порядке, которым они были объявлены с первым базовым классом). Существуют, конечно, другие возможные разметки, но это - то, что я обычно наблюдал.

    class A {
      public:
      virtual int f1() = 0;
    };
    class B : public A {
      public:
      virtual int f1() { return 1; }
      virtual int f2() { return 2; }
    };
    class C : public A {
      public:
      virtual int f1() { return -1; }
      virtual int f2() { return -2; }
    };
    
    A *x = new B;
    A *y = new C;
    A *z = new C;
    

    Теперь для получения по запросу некоторых интриг...

    Изменяющийся класс во времени выполнения:

    std::swap(*(void **)x, *(void **)y);
    // Now x is a C, and y is a B! Hope they used the same layout of members!
    

    Замена метода для всех экземпляров (monkeypatching класс)

    Это немного более хитрое, так как сам vtbl находится, вероятно, в постоянной памяти.

    int f3(A*) { return 0; }
    
    mprotect(*(void **)x,8,PROT_READ|PROT_WRITE|PROT_EXEC);
    // Or VirtualProtect on win32; this part's very OS-specific
    (*(int (***)(A *)x)[0] = f3;
    // Now C::f1() returns 0 (remember we made x into a C above)
    // so x->f1() and z->f1() both return 0
    

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

43
задан Community 23 May 2017 в 12:34
поделиться

5 ответов

Во-первых, попытайтесь понять концепцию «процесса» и «потока». Поток - это базовая единица для выполнения: поток планируется операционной системой и выполняется процессором. Процесс - это своего рода контейнер, который содержит несколько потоков.

  1. Да, многопоточность или многопоточность предназначены для параллельной обработки. Точнее, для использования параллелизма на уровне потоков.

  2. Хорошо, многопоточность может означать аппаратную многопоточность (одним из примеров является HyperThreading). Но я предполагаю, что вы просто говорите о многопоточности в программном обеспечении. В этом смысле ЦП должен поддерживать переключение контекста.

  3. Переключение контекста необходимо для реализации многозадачности даже в физически одноядерном режиме с разделением времени.

  4. Скажем, есть два физических ядра и четыре очень занятые темы. В этом случае, два потока просто ждут, пока у них появится возможность использовать ЦП. Прочтите некоторые статьи, связанные с приоритетным планированием ОС.

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

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

Прочтите некоторые статьи, связанные с приоритетным планированием ОС.

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

  • Я настоятельно предлагаю вам сначала изучить основы операционной системы. Затем переходите к вопросам многопоточности. Похоже, вам все еще неясны ключевые концепции, такие как переключение контекста и планирование. Это займет пару месяцев, но если вы действительно хотите стать экспертом в области компьютерного программного обеспечения, вам следует знать такие самые базовые концепции. Пожалуйста, возьмите любые книги по ОС и слайды с лекциями.

    Прочтите некоторые статьи, связанные с приоритетным планированием ОС.

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

  • Я настоятельно предлагаю вам сначала изучить основы операционной системы. Затем переходите к вопросам многопоточности. Похоже, вам все еще неясны ключевые концепции, такие как переключение контекста и планирование. Это займет пару месяцев, но если вы действительно хотите стать экспертом в области компьютерного программного обеспечения, вам следует знать такие самые базовые концепции. Пожалуйста, возьмите любые книги по ОС и слайды с лекциями.

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

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

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

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

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

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

    45
    ответ дан 26 November 2019 в 23:00
    поделиться

    Потоки, работающие на одном ядре, технически не параллельны. Они только кажутся выполняемыми параллельно, поскольку ЦП переключается между ними очень быстро (для нас, людей). Этот переключатель называется переключением контекста. Теперь потоки, выполняющиеся на разных ядрах, выполняются параллельно. Большинство современных процессоров имеют несколько ядер, однако большинство современных операционных систем (Windows, Linux и другие) обычно выполняют гораздо большее количество потоков, что по-прежнему вызывает переключение контекста. Даже если никакая пользовательская программа не выполняется, операционная система сама по себе выполняет переключение контекста для работы по обслуживанию.
    Это должно ответить на 1-3.

    Примерно 4: в принципе, каждый процессор может работать с потоками. это в большей степени характеристика операционной системы. Поток в основном: память (необязательно), стек и регистры, после их замены вы находитесь в другом потоке.

    5: количество потоков довольно велико и ограничено ОС. Обычно это выше, чем может успешно справиться обычный программист :) Количество потоков определяется вашей программой:

    связано ли это с вводом-выводом?

    • можно ли разделить задачу на ряд более мелких задач?
    • насколько мала задача? задача может быть слишком маленькой, чтобы вообще иметь смысл порождать потоки.
    • синхронизация: если требуется обширная синхронизация, штраф может быть слишком большим, и вам следует уменьшить количество потоков.
    13
    ответ дан 26 November 2019 в 23:00
    поделиться
    1. В общих чертах, да, но «параллельный» может означать разные вещи.

    2. Это зависит от того, какие задачи вы хотите запускать параллельно.

    3. Не обязательно. Некоторые (на самом деле большинство) потоков тратят много времени, ничего не делая. С таким же успехом можно переключиться с них на поток, который хочет что-то сделать.

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

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

    1
    ответ дан 26 November 2019 в 23:00
    поделиться

    Несколько потоков представляют собой отдельные «цепочки» команд внутри одного процесса. С точки зрения ЦП потоки более или менее похожи на процессы. Каждый поток имеет свой набор регистров и свой стек.

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

    В вашем примере каждая вкладка Firefox, вероятно, может даже иметь несколько потоков. Или они могут поделиться некоторыми темами. Вам понадобится один для загрузки, один для рендеринга, один для цикла сообщений (пользовательский ввод) и, возможно, один для запуска Javascript. Вы не можете легко объединить их, потому что при загрузке вам все равно нужно реагировать на ввод пользователя. Однако поток загрузки большую часть времени находится в спящем режиме, и даже когда он загружается, ему лишь время от времени требуется ЦП, а поток цикла сообщений просыпается только при нажатии кнопки.

    Если вы перейдете в диспетчер задач, вы увидите это, несмотря на все эти потоки ваш процессор все еще использует довольно мало.

    Конечно, если все ваши потоки выполняют некоторые вычислительные задачи, вам не следует создавать их слишком много, так как вы не получите выигрыша в производительности (хотя могут быть архитектурные преимущества!).

    Однако, если они в основном связаны с вводом-выводом, создайте столько потоков, сколько диктует ваша архитектура. Трудно дать совет, не зная своей конкретной задачи.

    Если вы перейдете в диспетчер задач, вы увидите, что, несмотря на все эти потоки, ваш процессор все еще довольно низок.

    Конечно, если все ваши потоки выполняют какие-то вычислительные задачи, вам не следует создавать их слишком много, поскольку вы не получите выигрыша в производительности (хотя могут быть архитектурные преимущества!).

    Однако, если они в основном связаны с вводом-выводом, создайте столько потоков, сколько диктует ваша архитектура. Трудно дать совет, не зная своей конкретной задачи.

    Если вы перейдете в диспетчер задач, вы увидите, что, несмотря на все эти потоки, ваш процессор все еще довольно низок.

    Конечно, если все ваши потоки выполняют какие-то вычислительные задачи, вам не следует создавать их слишком много, поскольку вы не получите выигрыша в производительности (хотя могут быть архитектурные преимущества!).

    Однако, если они в основном связаны с вводом-выводом, создайте столько потоков, сколько диктует ваша архитектура. Трудно дать совет, не зная своей конкретной задачи.

    если они в основном связаны с вводом-выводом, создайте столько потоков, сколько диктует ваша архитектура. Трудно дать совет, не зная своей конкретной задачи.

    если они в основном связаны с вводом-выводом, создайте столько потоков, сколько диктует ваша архитектура. Трудно дать совет, не зная своей конкретной задачи.

    3
    ответ дан 26 November 2019 в 23:00
    поделиться

    Главное, что нужно помнить, - это разделение между логическим / виртуальным параллелизмом и реальным / аппаратным параллелизмом. В вашей средней ОС выполняется системный вызов для создания нового потока. Что на самом деле происходит (сопоставлено ли оно с другим ядром, другим аппаратным потоком на том же ядре или помещено в очередь в пул программных потоков), зависит от ОС.

    1. Параллельная обработка использует все методы, а не только несколько. потоки.
    2. Вообще говоря, если вы хотите иметь настоящую параллельную обработку, вам нужно выполнять ее аппаратно. Возьмем, к примеру, Niagara , он имеет до 8 ядер, каждое из которых может выполнять 4 потока аппаратно.
    3. Переключение контекста необходимо, когда количество потоков превышает допустимое для параллельного выполнения. в оборудовании. Даже тогда, когда они выполняются последовательно (переключение от одного потока к другому), они считаются параллельными, потому что нет гарантии для порядка переключения. Итак, это может быть T0, T1, T2, T1, T3, T0, T2 и так далее. Во всех смыслах потоки параллельны.
    4. Разрез времени.
    5. Это зависит от ОС.
    1
    ответ дан 26 November 2019 в 23:00
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: