Чтобы удалить репозиторий,используйте 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
Ссылка:
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 ).
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
, чтобы увидеть, как тестируемое приложение ведет себя с точки зрения ОС.
Стандартный ps
cmd показывает только ваше обычное приложение.
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.