LINUX.ORG.RU

Java 7 сможет распараллеливать сортировку и поиск на имеющиеся процессоры

 


0

0

Разработчики пакета java.util.concurrent предусматривают встроенный механизм разложения работы с классом ParallelArray на несколько потоков, чтобы использовать все имеющиеся в системе процессоры для ускорения операций сортировок и поиска.

>>> Подробности

anonymous

Проверено: Shaman007 ()

Ответ на: комментарий от tailgunner

Может быть, но у нас до сих пор стандарт RedHat 7.3 :-( поэтому проблема с потоками имеет место быть.

anonymous
()
Ответ на: комментарий от insa

5000 потоков на жабе:

public class Main
{
protected static class MyThread extends Thread
{
@Override
public void run()
{
while (true)
{
try
{
sleep(2000L);
}
catch (InterruptedException e) {}
}
}
}

public static void main(String[] args)
{
try
{
for (Integer i=0; i<5000; i++)
{
System.out.println(i);
MyThread t = new MyThread();
t.setPriority(Thread.MIN_PRIORITY);
t.start();
Thread.sleep(15L);
}
System.out.println("ЙА ЕЩЕ ЖИВ");
Thread.sleep(1000L);
System.exit(0);
}
catch (Throwable _t)
{
_t.printStackTrace();
}
}
}

Вывод:
.....
4998
4999
ЙА ЕЩЕ ЖИВ

Параметры запуска: -Xss48k -Xmx2650m
Замечание: сделать размер стека меньше 48 не дает JVM, до 100 тысяч потоков довести не реально, причем всплывате очень интересное исключение

5405
5406
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at testthreads.Main.main(Main.java:34)

Кто-то тут писал что уже 5 тысяч потоков под линухом проблема.
Машинка: Athlon X2 3600, 2Gb, Ubuntu 7.10, JDK1.6u2

P.S. В целом разумный вариант состоит в том чтобы не порождать такое количество потоков, а использовать меньшее количество потоков, агрегирую данные в списках/очередях. Например, один поток висит на accept, и помещает клиентов в очередь, которую потом дербанят несколько потоков (но не 5000!). Фишка в том чтобы достичь приемлемого баланса.

anonymous
()
Ответ на: комментарий от anonymous

Проблема в своё время возникла при переносе программы а SunOS/Sparc на PC/Linux. Потоки создавались но не завершались (ошибка в программе). Это все отлично работало на Sparc с частотой 350МГц, и подвешивало Pentium4 с частотой 2ГГц.

anonymous
()
Ответ на: комментарий от anonymous

>5000 потоков на жабе:

Добавлю: JVM работает в 32 битном режиме

anonymous
()
Ответ на: комментарий от anonymous

> Кто-то тут писал что уже 5 тысяч потоков под линухом проблема.

Не проблема. Но 1) не из джавы и 2) с NPTL.

Тут кто-то говорил, что на 2.4 5k потоков проблема - ну да, это скорее всего старый линукс без NPTL.
Вот в редхате третьем 2.4 с NPTL, там, думаю, не проблема тоже, надо бы проверить.

Тем не менее, какие-то ограничения есть. Вот накатал код.
Знаю, что так передавать параметр в функцию треда нельзя, но нормально писать в лом.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void* task(void *x)
{
usleep(500000);
printf("Thread %d started\n", (int)x);
sleep(500); // basically, live till program exit
return NULL;
}

int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: %s <threads_num>\n", argv[0]);
return 1;
}

int threads_max = atoi(argv[1]);
printf("Trying to start %d threads. Press Ctrl-C for exit\n", threads_max);

int i, failed = 0;
for (i = 0; i < threads_max; i++)
{
pthread_t thr;
if (pthread_create(&thr, NULL, task, (void *)i))
failed++;
}

sleep(1);
printf("Finished! %d threads failed to start\n", failed);
pause();
}


Результат такой - при компиляции в 32-х битном режиме с -m32 создаются 406 тредов.
Т.е. при запуске ./thread_create 1000 выдается "594 threads failed to start".
Отладочную печать я убрал, но падают они по причине ENOMEM.

В 64-х битном режиме от обычного пользователя у меня запустилось 16264 тредов,
при попытке запуска с 20k тредами пишет "3736 threads failed to start".
Оставшиеся треды не стартуют из-за нехватки прав. Под рутом стартуют около 32200 тредов!
Сжирают около 260 мегов памяти. В тот момент, когда запущено 32k тредов, запускать новые приложения не получается -
баш ругается на ошибку fork(). После убивания данного процесса через несколько секунд система приходит в норму.
Я повторил это несколько раз, это неопасно. Если запустить несколько приложений до данной проги,
то максимальное запущенное число тредов уменьшается уменьшается примерно на число запущенных процессов.

Вот такая вот зависимость, блин. Тем не менее, 30k тредов с моделью 1:1 - не проблема.

PS fedora 8, glibc 2.7, gcc 4.1.2.

anonymous
()
Ответ на: комментарий от anonymous

Текст:
package javathreadtest;
/**
 * @author anonymous (*) (27.03.2008 22:05:47)
 */
public class Main {

    protected static class MyThread extends Thread {

        @Override
        public void run() {
            while (true)
                try {
                    sleep(2000L);
                } catch (InterruptedException e) {
                }
        }

    }
    public static void main(String[] args) {
        try {
            for (Integer i = 0; i < 5000; i++) {
                System.out.println(i);
                MyThread t = new MyThread();
                t.setPriority(Thread.MIN_PRIORITY);
                t.start(); /** at javathreadtest.Main.main(Main.java:25) */
                Thread.sleep(15L);
            }
            System.out.println("ЙА ЕЩЕ ЖИВ");
            Thread.sleep(1000L);
            System.exit(0);
        } catch (Throwable _t) {
            _t.printStackTrace();
        }
    }

}


У меня вывод:
...
1486
1487
1488
1489
1490
java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:597)
        at javathreadtest.Main.main(Main.java:25)

Ключи запуска:
-Xss48k -Xmx1650m
(ключ "-Xmx2650m" выставить нельзя — не запуститься)

Среда исполнения:
> uname -rsm
FreeBSD 7.0-RELEASE i386
> java -version
java version "1.6.0_03-p4"
Java(TM) SE Runtime Environment (build 1.6.0_03-p4-igor_17_feb_2008_23_42-b00)
Java HotSpot(TM) Server VM (build 1.6.0_03-p4-igor_17_feb_2008_23_42-b00, mixed mode)

Машина:
Athlon64 X2 3800+, 2GB.

iZEN ★★★★★
()
Ответ на: комментарий от anonymous

У меня FC4, Celeron, так что только 32-бит режим: 32327 нитей от рута и от пользователя (после ulimit -a 100000). Правда, стек нитей уменьшен до минимума.

#include <assert.h>
#include <pthread.h>
#include <stdio.h>

static void *f(void *a)
{
        for (;;)
                sleep(1);
        return NULL;
}

int main()
{
        int i;
        pthread_attr_t atts;
        pthread_t tid;

        pthread_attr_init(&atts);
        pthread_attr_setstacksize(&atts, 16384);
        for (i = 0; i < 100000; i++) {
                if (pthread_create(&tid, &atts, f, NULL) != 0) {
                        perror("pthread_create");
                        fprintf(stderr, "%d started\n", i);
                        assert(0);
                }
//              printf("%d\n", i+1);
        }
}

tailgunner ★★★★★
()

Вообще-то, звучит заманчиво, посмотрим во что это обернётся в действительности..

MiracleMan ★★★★★
()
Ответ на: комментарий от tailgunner


> У меня FC4, Celeron, так что только 32-бит режим: 32327 нитей от рута и от пользователя (после ulimit -a 100000). Правда, стек нитей уменьшен до минимума.

> #include <assert.h>
...
> tailgunner (*) (28.03.2008 0:24:37)


На mac os x медленно, скрипя мозгами и отожрав 500 мег памяти оно запустилось и даже досчитало до 100к - 1. На линуксе очень быстро добегает до 32к+ и так же быстро падает с ошибкой...

sysctl kernel.threads-max не помогает

Еще мысли будут?

insa
()
Ответ на: комментарий от anonymous

это как это. на 1000 потоках будем вычислять произведение матриц размером 1000х1000.

anonymous
()
Ответ на: комментарий от iZEN

Ахтунг !!! у меня на жабе зопустилось 24713 средов !!!

Текст:
package p1.zzz;

/**
 * User: admin
 */
public class MMM {


	public static void main(String[] args) {
		int i = 0;
		try {
			for (i = 0; i < 50000; i++) {
				if (i % 100 == 0) {
					System.out.println(i);
				}
				Thread t = new Thread(new Runnable() {
					public void run() {
						while (true) {
							try {
								Thread.sleep(2000L);
							}
							catch (InterruptedException e) {
							}
						}
					}
				});
				t.setPriority(Thread.MIN_PRIORITY);
				t.setDaemon(true);
				t.start();
//				Thread.sleep(1L);
			}
			System.out.println(i);
			System.out.println("still alive");
			Thread.sleep(1000L);
			System.in.read();
			System.exit(0);
		}
		catch (Throwable _t) {
			System.out.println(i);
			_t.printStackTrace();
		}
	}
}

вывод:
24400
24500
24600
24700
24713
java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Unknown Source)
        at p1.zzz.MMM.main(MMM.java:29)

Ключи запуска:
-Xss48k
(ключ -Xmx не ставим !!!)

Среда исполнения:
оффтопег

> java -version
java version "1.6.0_10-ea"
Java(TM) SE Runtime Environment (build 1.6.0_10-ea-b12)
Java HotSpot(TM) Client VM (build 11.0-b11, mixed mode, sharing)

Машина:
хз, жужит патихоньку

anonymous
()
Ответ на: комментарий от tailgunner

IRIX64 6.5 10070055 IP35, gcc 3.3.2

pthread_create: Error 0

1023 started

SunOS 5.8 Generic_108528-07 sun4u sparc SUNW,Ultra-5_10, gcc 3.2.3

pthread_create: Not enough space

65184 started

anonymous
()
Ответ на: комментарий от insa

> sysctl kernel.threads-max не помогает

Конечно. Нужно попробовать задрать значение /proc/sys/kernel/pid_max - но, похоже, для этого нужно пересобрать ядро (или перейти на 64-бит архитектуру) - у меня значение выше 32768 игнорируется.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

В Windows XP SP2 CE:

...
4992
4993
4994
4995
4996
4997
4998
4999
ЙА ЕЩЕ ЖИВ
BUILD SUCCESSFUL (total time: 1 minute 21 seconds)

>ver
Microsoft Windows XP [Версия 5.1.2600]
>java -version
java version "1.6.0_10-ea"
Java(TM) SE Runtime Environment (build 1.6.0_10-ea-b12)
Java HotSpot(TM) Client VM (build 11.0-b11, mixed mode, sharing)

Машинка:
Pentium4 Prescott 3ГГц, 1GB

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

>(ключ "-Xmx2650m" выставить нельзя — не запуститься)

А у меня запустилось.

anonymous
()
Ответ на: комментарий от r

> Серезно? Ты простеньким макросом проанализируешь контекст и выявишь _возможные_ (а не все символы!) варианты для подстановки? То есть по факту проведешь синтаксический разбор и типовый анализ?

Фичу, которую ты назвал, придумали и реализовали впервые в текстмейте, называется она snippets и синтаксический анализ для нее не нужен. Она реализуется на уровне разворотки макроса и расстановки "точек остановки".

> Не обычно. Значе чем я сейчас занимаюсь? Вот такой штукой и страдаю в немальеьком проекте - привожу его в приличный вид.

На этом можем и остановиться. Если ты поддерживаешь чужой код тут и песня другая.

anonymous
()
Ответ на: комментарий от anonymous

> На этом можем и остановиться. Если ты поддерживаешь чужой код тут и песня другая.

Т.е. для написания кода IDE не нужна, а для поддержки нужна?

Rikz ★★★
()
Ответ на: комментарий от Rikz

>> На этом можем и остановиться. Если ты поддерживаешь чужой код тут и песня другая.

> Т.е. для написания кода IDE не нужна, а для поддержки нужна?

Для поддержки _чужого_кривого_ кода. Речь шла о рефакторинге. Для себя довольно редко вижу потребность в паттернах рефакторинга, для которых требуется IDE. Но если человеку приходится переделывать _плохой_чужой_ код, потребность в рефакторинге регулярна.

Опять же, если бы у меня возникла такая задача, я бы сделал себе соответствующий функционал для vim-a.

anonymous
()
Ответ на: комментарий от anonymous

> Ядро работае в 64-х разрядном режиме

Это неспортивно %)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

>Ахтунг !!! у меня на жабе зопустилось 24713 средов !!!

>Среда исполнения:
оффтопег

Не верю.

java -Xss48k p1.zzz.MMM

5441
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at p1.zzz.MMM.main(MMM.java:29)

java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)


50000
still alive

java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 10.0-b19, mixed mode)

Karapuz ★★★★★
()
Ответ на: комментарий от jtootf

>противоречие получается, не находишь ?

Не нахожу. Для того чтобы написать IDE а тем более с нулья нужны нехилые инвестиции.

>чем java так отличается от tcl и erlang, что - при наличии немаленького рынка ПО для всех трёх языков - такой ажиотаж вокруг IDE есть только у java ?

Количеством пользователей === клиентов корпорации разрабатывающей IDE.

>почему именно для java так актуально создание этого самого IDE

Для любого языка актуально создание IDE.

r ★★★★★
()
Ответ на: комментарий от anonymous

> А у меня... а у меня... 30см.

Мозгов? O_O

> P.S. а зачем столько тредов?

Выяснить, у кого длиннее :D А за 100тысяч нитей insa обещал ящик неспецифицированного пива. Я думаю, мы с анонимным братом его заслужили, но вряд ли получим %)

tailgunner ★★★★★
()
Ответ на: say hello to side-effects от insa

>Конечно COW но футпринт + сайд эффекты замучают

Блин, че с русским языкой делают...

AVL2 ★★★★★
()
Ответ на: комментарий от tailgunner

> Выяснить, у кого длиннее :D А за 100тысяч нитей insa обещал ящик неспецифицированного пива. Я думаю, мы с анонимным братом его заслужили, но вряд ли получим %)

Не заслужили - 100к тредов на линуксе я так и не увидел.

insa
()
Ответ на: комментарий от insa

> Не заслужили

Не катит за отмазку :D треть ящика вполне подойдет :D

> 100к тредов на линуксе я так и не увидел.

для этого нужна 64-бит система или патченое ядро, так что воспроизвести будет проблема.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> для этого нужна 64-бит система или патченое ядро, так что воспроизвести будет проблема.

Убогая поделка джобса и ко. на 32 битах может, а великий линукс, установленный на миллионах северов нет?

insa
()
Ответ на: комментарий от insa

> Убогая поделка джобса и ко. на 32 битах может

Вопрос, какой ценой им это достается. Кстати, сколько памяти на тачке, которая смогла?

> а великий линукс, установленный на миллионах северов нет?

Зачем серверу даже успешно созданные 32000 нитей? O_o Если давать каждой нити по 1мс на исполнение, очередь до каждой будет доходить раз в 30 секунд. Типичная фаллометрия, короче говоря.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Часть потоков может временно не использоваться, тогда и время выполнения будет приемлемо. Хотя практической пользы от использования 100т потоков я тоже не вижу :-)

anonymous
()
Ответ на: комментарий от Joe_Bishop

Кто и тупица, так это ты сам. "Я дома использую". Обалдеть можно, супер светоч! У самой грамотной софтверной компании (IBM) все серверная линейка продуктов построена на Java. Если своих мозгов нет написать что нибудь серьезнее вороха скриптиков на страничку, зачем далеко не самых глупых людей обсирать? Комплекс величия покоя не дает? Наряду с аффектом неадекватности.

anonymous
()
Ответ на: комментарий от Karapuz

>>Среда исполнения:
>>оффтопег

>Не верю.

а чё ?? оффтопег это тоже какая-никакая среда, и даже какого-никакого ... исполнения.

anonymous
()
Ответ на: комментарий от anonymous


>У самой грамотной софтверной компании (IBM) ...

Взрыв истерического хохота в зале :) Хорошие клоуны нынче отжигают!

anonymous
()
Ответ на: комментарий от anonymous

> Взрыв истерического хохота в зале :) Хорошие клоуны нынче отжигают!

Это ты значит хороший клоун?

kda ★★★★★
()
Ответ на: комментарий от kda

А - ну да - ты спой о великой и ужасной аих или мертвомухе или дыбыдва :) Всё как образец грамотности голубых - только учти спорить о вкусе устриц с теми кто их ел - дело достаточно глупое :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.