Какие типы потоков использует Java/JVM с точки зрения ОС Linux?

Чтобы удалить репозиторий,используйте zypper rr, а затем один из#|URL|alias

Это zypper rrявляется сокращением отzypper removerepo

Используя ваши примеры:

zypper rr http://packages.2ndquadrant.com/postgresql-z-suse/zypper/sles-11sp3-s390x

zypper rr http://packages.2ndquadrant.com/postgresql-z-suse/zypper/sles-11sp3

Ссылка:

  1. шпаргалка на молнии
  2. сообщение на форуме opensuse :удаление репозитория

1
26.10.2019, 07:03
2 ответа

For creating threads on linux, we need to use pthread interface. Pthread is part of POSIX standard which defines C language interface for creating and managing threads. Linux provides implementation of pthreads.

Я нашел это по ссылке "Как... карты". Итак, «Pthreads» — правильный, но также и простой ответ. Это все равно, что сказать :Для сетевых подключений в Linux вам нужен TCP/IP.

Поскольку с точки зрения linux существуетfork(2)(порождение «устаревших» дочерних процессов )и clone(2), что позволяет порождать легкие -процессы веса, такие как pthreads. В Linux потоки реализуются потоками pthreads, которые реализуются клоном ().

Поскольку JVM является «по сути 32-битной -машиной», существует по крайней мере теоретическое пространство для реализации без -Pthreads, что может иметь смысл для других платформ (, например. RISC, с большим количеством ядер и улучшенными кэшами ).


Вот что-то в этом направлении, через "яволюцию":

общедоступный абстрактный класс ConcurrentContext

расширяет AbstractContext

Контекст, способный использовать преимущества параллельных алгоритмов в многопроцессорных -системах .

Когда поток входит в параллельный контекст, он может выполнять параллельные выполнения, вызывая статический метод execute (Runnable ).

-4
28.01.2020, 02:13

TLDR

In Java 1.1, green threads were the only threading model used by the Java virtual machine (JVM),9 at least on Solaris. As green threads have some limitations compared to native threads, subsequent Java versions dropped them in favor of native threads. 10,11.

Источник:Зеленые нитки

Ниже приведена иллюстрация, показывающая, как анализировать потоки Java с точки зрения ОС.


Фон

Исследуя этот вопрос, я наткнулся на вопросы и ответы SO под названием:Использует ли Java JVM pthread? . В этом вопросе была ссылка на исходный код JVM-OpenJDK/jdk8u/jdk8u/hotspot. Конкретно этот раздел:

    // Serialize thread creation if we are running with fixed stack LinuxThreads
    bool lock = os::Linux::is_LinuxThreads() && !os::Linux::is_floating_stack();
    if (lock) {
      os::Linux::createThread_lock()->lock_without_safepoint_check();
    }

    pthread_t tid;
    int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);

    pthread_attr_destroy(&attr);

Здесь мы видим, что JVM использует pthreads, также известные как pthreads. Потоки POSIX . Дополнительные подробности из pthreads (7 )man-страницы:

POSIX.1 specifies a set of interfaces (functions, header files) for threaded programming commonly known as POSIX threads, or Pthreads. A single process can contain multiple threads, all of which are executing the same program. These threads share the same global memory (data and heap segments), but each thread has its own stack (automatic variables).

Учитывая это, потоки, присутствующие в Java, являются просто потоками в Linux.

Пример

Эксперимент

Чтобы дополнительно убедиться в этом, мы можем использовать следующий образец приложения Scala , которое в конце концов является просто приложением Java.

Это приложение работает в контейнере Docker, но мы можем использовать его для изучения работающего Java-приложения, использующего потоки. Чтобы использовать это приложение, мы просто клонируем репозиторий Git, а затем создаем и запускаем контейнер Docker.

Создание приложения
$ git clone https://github.com/slmingol/jvmthreads.git
$ cd jvmthreads
$ docker build -t threading.
$  docker run -it -v ~/.coursier/cache:/root/.cache/coursier -v ~/.ivy2:/root/.ivy2  -v ~/.sbt:/root/.sbt -v ~/.bintray:/root/.bintray -v $(pwd):/threading threading:latest /bin/bash

На данный момент вы должны находиться внутри контейнера Docker в этом типе подсказки:

root@27c0fa503da6:/threading#
Работающее приложение

Отсюда вы можете запустить приложение sbt:

$ sbt compile compileCpp "runMain com.threading.ThreadingApp"

Когда это приложение начнет работать, вы можете использовать Ctrl + Z до SIGSTPприложения, чтобы мы могли его изучить.

root@27c0fa503da6:/threading#  sbt compile compileCpp "runMain com.threading.ThreadingApp"
[info] Loading settings from metaplugins.sbt...
[info] Loading project definition from /threading/project/project
[info] Loading settings from plugins.sbt...
[info] Loading project definition from /threading/project
[info] Loading settings from build.sbt...
[warn] Missing bintray credentials. Either create a credentials file with the bintrayChangeCredentials task, set the BINTRAY_USER and BINTRAY_PASS environment variables or pass bintray.user and bintray.pass properties to sbt.
[warn] Missing bintray credentials. Either create a credentials file with the bintrayChangeCredentials task, set the BINTRAY_USER and BINTRAY_PASS environment variables or pass bintray.user and bintray.pass properties to sbt.
^Z
[1]+  Stopped                 sbt compile compileCpp "runMain com.threading.ThreadingApp"
Анализ приложения

Теперь мы можем использовать типичные инструменты UNIX, такие как ps, чтобы увидеть, как тестируемое приложение ведет себя с точки зрения ОС.

Стандартный pscmd показывает только ваше обычное приложение.

root@27c0fa503da6:/threading# ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 02:14 pts/0    00:00:00 /bin/bash
root      1503     1  0 02:37 pts/0    00:00:00 bash /usr/bin/sbt compile compileCpp runMain com.threading.ThreadingApp
root      1571  1503 98 02:37 pts/0    00:00:35 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar
root      1707  1571  0 02:37 pts/0    00:00:00 git describe --tags --abbrev=8 --match v[0-9]* --always --dirty=+20191026-0237
root      1718     1  0 02:37 pts/0    00:00:00 ps -eaf

Однако просмотр тем с помощью psдает более полную картину:

root@27c0fa503da6:/threading# ps -eLf | head -8
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root         1     0     1  0    1 02:14 pts/0    00:00:00 /bin/bash
root      1943     1  1943  0    1 03:08 pts/0    00:00:00 bash /usr/bin/sbt compile compileCpp runMain com.threading.ThreadingApp
root      2011  1943  2011  0   32 03:08 pts/0    00:00:00 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar compile compileCpp runMain com.threading.ThreadingApp
root      2011  1943  2012  0   32 03:08 pts/0    00:00:05 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar compile compileCpp runMain com.threading.ThreadingApp
root      2011  1943  2013  0   32 03:08 pts/0    00:00:00 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar compile compileCpp runMain com.threading.ThreadingApp
root      2011  1943  2014  0   32 03:08 pts/0    00:00:00 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar compile compileCpp runMain com.threading.ThreadingApp
root      2011  1943  2015  0   32 03:08 pts/0    00:00:00 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar compile compileCpp runMain com.threading.ThreadingApp

ЗАМЕЧАНИЕ:Выше мы видим множество потоков. В этом представлении представляют интерес столбцы LWPи NLWP.

  • LWPозначает легкие технологические резьбы
  • .
  • NLWPозначает количество LWP

Число NLWP важно, потому что оно сообщает вам общее количество потоков, связанных с PID. В нашем случае это число 32. Вы можете подтвердить это так:

root@27c0fa503da6:/threading# ps -eLf|grep -E "[3]2.*java" | wc -l
32

Вы также можете использовать эти psкоманды, чтобы получить альтернативные способы проверки этих потоков:

root@27c0fa503da6:/threading# ps -Lo pid,lwp,pri,nice,start,stat,bsdtime,cmd,comm | head -5
  PID   LWP PRI  NI  STARTED STAT   TIME CMD                         COMMAND
    1     1  19   0 02:14:42 Ss     0:00 /bin/bash                   bash
 1943  1943  19   0 03:08:41 T      0:00 bash /usr/bin/sbt compile c bash
 2011  2011  19   0 03:08:41 Tl     0:00 java -Xms1024m -Xmx1024m -X java
 2011  2012  19   0 03:08:41 Tl     0:05 java -Xms1024m -Xmx1024m -X java

ПРИМЕЧАНИЕ 1.:Эта форма показывает, что это pthreads из-за lв столбце STAT.

  • S-прерываемый сон (ожидание завершения события)
  • T-остановлен по сигналу управления заданием
  • l-многопоточный -(с использованием CLONE _THREAD, как это делают pthreads NPTL)

ПРИМЕЧАНИЕ 2:Sи Tважны здесь, потому что они указывают, что этот процесс был остановлен с помощью Ctrl + Z с использованием управляющего сигнала SIGSTP.

Вы также можете использовать переключатель ps -T, чтобы просмотреть их как потоки:

root@27c0fa503da6:/threading# ps -To pid,tid,tgid,tty,time,comm | head -5
  PID   TID  TGID TT           TIME COMMAND
    1     1     1 pts/0    00:00:00 bash
 1943  1943  1943 pts/0    00:00:00 bash
 2011  2011  2011 pts/0    00:00:00 java
 2011  2012  2011 pts/0    00:00:05 java

Переключатели psнад:

   -L     Show threads, possibly with LWP and NLWP columns.
   -T     Show threads, possibly with SPID column.

Полный запуск приложения

Для справки, если вам интересно, вот полный запуск приложения Scala/Java.

root@27c0fa503da6:/threading# sbt compile compileCpp "runMain com.threading.ThreadingApp"
[info] Loading settings from build.sbt...
[warn] Missing bintray credentials. Either create a credentials file with the bintrayChangeCredentials task, set the BINTRAY_USER and BINTRAY_PASS environment variables or pass bintray.user and bintray.pass properties to sbt.
[warn] Missing bintray credentials. Either create a credentials file with the bintrayChangeCredentials task, set the BINTRAY_USER and BINTRAY_PASS environment variables or pass bintray.user and bintray.pass properties to sbt.
[info] Set current project to threading (in build file:/threading/)
[info] Executing in batch mode. For better performance use sbt's shell
[warn] Credentials file /root/.bintray/.credentials does not exist, ignoring it
[success] Total time: 2 s, completed Oct 26, 2019 4:11:38 AM
[success] Total time: 1 s, completed Oct 26, 2019 4:11:39 AM
[warn] Credentials file /root/.bintray/.credentials does not exist, ignoring it
[info] Running (fork) com.threading.ThreadingApp
[info] Started a linux thread 140709608359680!
[info] Started a linux thread 140709599966976!
[info] Starting  thread_entry_pointStarted a linux thread 140709591574272!
[info] Starting  thread_entry_pointStarting  thread_entry_pointStarted a linux thread 140709583181568!
[info] Running Thread 1
[info] Starting  thread_entry_pointStarted a linux thread 140709369739008!
[info] Running Thread 2
[info] Starting  thread_entry_pointStarted a linux thread 140709608359680!
[info] Running Thread 3
[info] Starting  thread_entry_pointStarted a linux thread 140709599966976!
[info] Running Thread 4
[info] Running Thread 5Starting  thread_entry_pointStarting  thread_entry_pointStarted a linux thread 140709361346304!
[info] Running Thread 6
[info] Starting  thread_entry_pointStarted a linux thread 140709583181568!
[info] Started a linux thread 140709591574272!
[info] Starting  thread_entry_pointStarting  thread_entry_pointStarted a linux thread 140709352953600!
[info] Running Thread 7
[info] Running Thread 9
[info] Started a linux thread 140709369739008!
[info] Starting  thread_entry_pointStarted a linux thread 140709608359680!
[info] Running Thread 8
[info] Starting  thread_entry_pointStarted a linux thread 140709344560896!
[info] Starting  thread_entry_pointStarted a linux thread 140709583181568!
[info] Starting  thread_entry_pointStarted a linux thread 140709599966976!
[info] Starting  thread_entry_pointStarted a linux thread 140709336168192!
[info] Running Thread 10
[info] Running Thread 11
[info] Starting  thread_entry_pointStarted a linux thread 140709327775488!
[info] Running Thread 12Started a linux thread 140709591574272!
[info] Running Thread 13
[info] Running Thread 14
[info] Running Thread 16
[info] Running Thread 15
[info] Running Thread 18
[info] Running Thread 17
[info] Running Thread 19
[info] Starting  thread_entry_pointStarting  thread_entry_point
[success] Total time: 1 s, completed Oct 26, 2019 4:11:40 AM

Дамп потока?

Некоторые спрашивали, как мы можем связать воедино то, что поток Java эквивалентен LWP Linux. Для этого мы можем использовать дамп потока Java для сравнения 2.

Снова мы используем то же приложение Scala, что и выше, и собираемся Ctrl + Z .

root@52a4b6e78711:/threading# sbt compile compileCpp "runMain com.threading.ThreadingApp"
[info] Loading settings from metaplugins.sbt...
[info] Loading project definition from /threading/project/project
^Z
[1]+  Stopped                 sbt compile compileCpp "runMain com.threading.ThreadingApp"

После этого нам потребуется отправить сигнал SIGQUIT в JVM. Для этого вы обычно можете использоватьkill -3 <PID of JVM>:

root@52a4b6e78711:/threading# ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 12:36 pts/0    00:00:00 /bin/bash
root         7     1  0 12:37 pts/0    00:00:00 bash /usr/bin/sbt compile compileCpp runMain com.threading.ThreadingApp
root        75     7 99 12:37 pts/0    00:00:17 java -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m -jar /usr/share/sbt/bin/sbt-launch.jar
root       130     1  0 12:37 pts/0    00:00:00 ps -eaf

root@52a4b6e78711:/threading# kill -3 75

Затем нам нужно разрешить возобновление работы программы,fg:

root@52a4b6e78711:/threading# fg
sbt compile compileCpp "runMain com.threading.ThreadingApp"
2019-10-26 12:38:00
Full thread dump OpenJDK 64-Bit Server VM (25.181-b13 mixed mode):

"scala-execution-context-global-32" #32 daemon prio=5 os_prio=0 tid=0x00007f87d8002800 nid=0x80 runnable [0x00007f880973d000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000c1b08a68> (a scala.concurrent.impl.ExecutionContextImpl$$anon$3)
    at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:1824)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1693)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

"scala-execution-context-global-33" #33 daemon prio=5 os_prio=0 tid=0x00007f87dc001000 nid=0x7f runnable [0x00007f880983e000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000c1b08a68> (a scala.concurrent.impl.ExecutionContextImpl$$anon$3)
    at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:1824)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1693)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

"scala-execution-context-global-31" #31 daemon prio=5 os_prio=0 tid=0x00007f87d8001000 nid=0x7e waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"scala-execution-context-global-30" #30 daemon prio=5 os_prio=0 tid=0x00007f87e4003800 nid=0x7d waiting on condition [0x00007f8809a40000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000c1b08a68> (a scala.concurrent.impl.ExecutionContextImpl$$anon$3)
    at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:1824)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1693)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

ПРИМЕЧАНИЕ.:В приведенном выше частичном выводе команды kill -3видно, что потоки в JVM выстраиваются в линию без анализа. Их 32, что показывает, что Java-потоков на самом деле 1 :1 с Linux LWP.

Ссылки

-1
28.01.2020, 02:13

Теги

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