ЛабЭксперт – ИФА наборы, антитела и белки Cloud-Clone Corp – Expert Lab

java Новости

Описание

clone

создаёт новый процесс как и

fork
(2).

clone

является библиотечной функцией верхнего уровня над системным вызовом

clone
,

который далее будет называться

sys_clone
.

Описание

sys_clone

даётся далее в конце данной страницы руководства.

В отличие от
fork(2),

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

Вызов
clone

в основном используется для реализации тредов (нитей): несколько тредов
управления в какой-либо программе, которые запущены конкурентно в
разделяемом пространстве памяти.

Когда процесс-потомок создаётся с помощью
clone,

он запускает функциональное приложение
fn(arg).

(Это отличается от
fork(2),

где выполнение продолжается в потомке от точки вызова
fork(2)).

Когда происходит возврат из функционального приложения
fn(arg),

процесс-потомок завершается. Целое значение, возвращаемое
fn,

является кодом выхода процесса-потомка. Процесс-потомок может также
быть завершён явным образом, с помощью вызова
exit(2)

или после получения фатального сигнала.

Аргумент
child_stack

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

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

Стеки растут вниз для всех процессоров, на которых работает Linux
(за исключением HP PA процессоров), так что
child_stack

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

Младший байт
flags

содержит номер сигнала, который посылается родителю, когда потомок
умирает. Если этот сигнала задаётся как нечто отличное от
SIGCHLD,

то родительский процесс должен задать опцию
__WALL

или
__WCLONE

при ожидании завершения работы потомка с помощью вызова
wait(2).

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

CLONE_PARENT
(ветка Linux 2.4 и выше) Если установлен флаг
CLONE_PARENT,

то родитель нового потомка (как возращает вызов
getppid(2))

будет таким же как и у вызывающего процесса.

Если флаг
CLONE_PARENT

не установлен, то (как и в
fork(2))

родителем будет вызывающий процесс.

Заметим, что это тот родительский процесс, который возращается
вызовом
getppid(2),

и которому приходит сигнал, когда потомок завершается, так что
если
CLONE_PARENT

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

CLONE_FS
Если флаг
CLONE_FS

установлен, вызывающий процесс и процесс-потомок разделяют одну
и ту же информацию о фаловой системе. Она включает корневой каталог
файловой системы, текущий рабочий каталог и значение umask. Любые
вызовы
chroot(2),

chdir(2),

или
umask(2)

выполняемые вызывающим процессом или процессом-потомком также
дают взаимный эффект.

Если флаг
CLONE_FS

не установлен, процесс-потомок работает с копией информации по
файловой системе от вызывающего процесса, снятой на момент вызова
clone.

Вызовы
chroot(2),

chdir(2),

umask(2)

выполняемые позже одним из процессов не оказывают эффект на другой
процесс.

CLONE_FILES
Если флаг
CLONE_FILES

установлен, то вызывающий процесс и процесс-потомок разделяют одну и
ту же таблицу файловых дескрипторов. Файловые дескрипторы всегда указывают
на те же файлы в вызывающем процессе и процессе-потомке. Любые файловые
дескрипторы, создаваемые вызывающим процессом или процессом-потомком
также работают в другом процессе. Также, если один из процессов закрывает
файловый дескриптор или изменяет ассоциированные с ним флаги, то
это оказывает влияние и на другой процесс.

Если флаг
CLONE_FILES

не установлен, процесс-потомок наследует копии всех файловых дескрипторов,
открытых в вызывающем процессе на время вызова
clone.

Операции над файловыми дескрипторами, выполняемые позже вызывающим процессом
или процессом-потомком, не оказывают эффекта на другой процесс.

CLONE_NEWNS
(Начиная с Linux 2.4.19)
Запускает потомок в новом пространстве имён.

Каждый процесс живёт в некотором пространстве имён.
Пространство имён

процесса – это данные (список смонтированных файловых систем), описывающие
файловую иерархию, видимую этим процессом. После вызова
fork(2)

или
clone(2)

где не установлен флаг
CLONE_NEWNS,

потомок живёт в том же пространстве имён, что и родитель.
Системные вызовы
mount(2)

и
umount(2)

изменяют пространство имён вызывающего процесса и, с этого момента,
оказывают эффект на все процессы, которые живут в этом же пространстве
имён, но не оказывают эффект на процессы в других пространствах имён.

После вызова
clone(2)

где флаг
CLONE_NEWNS

установлен, потомок запускается в новом пространстве имён,
инициализированном копией пространства имён родителя.

Только привелегированный процесс может устанавливать флаг
CLONE_NEWNS.

Не допускается совместное использование флагов
CLONE_NEWNS

и
CLONE_FS

в одном вызове
clone.

CLONE_SIGHAND
Если флаг
CLONE_SIGHAND

установлен, вызывающий процесс и процесс-потомок разделяют одну и ту же
таблицу обработчиков сигналов. Если вызывающий процесс или процесс-потомок
вызывают
sigaction(2)

для изменения поведения при получении сигнала, то это поведение изменяется
также и в другом процессе. Однако, вызывающий процесс и процесс-потомок
имеют различные маски сигналов и списки ожидающих обработки сигналов. Так,
один из них может блокировать или деблокировать некоторые сигналы, используя
sigprocmask(2)

и это не будет оказывать эффект на другой процесс.

Если флаг
CLONE_SIGHAND

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

Вызовы
sigaction(2)

выполняемые после одним из процессов, не оказывают эффект на другой процесс.

CLONE_PTRACE
Если флаг
CLONE_PTRACE

установлен и вызывающий процесс находится в режиме трассировки, то процесс-потомок
таже будет работать в режиме трассировки (см.
ptrace(2)).

CLONE_VFORK
Если флаг
CLONE_VFORK

установлен, то выполнение вызывающего процесса приостанавливается
пока потомок не освободит свои ресурсы виртуальной памяти через вызов
execve(2)

или
_exit(2)

(как в
vfork(2)).

Если флаг
CLONE_VFORK

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

CLONE_VM
Если флаг
CLONE_VM

установлен, вызывающий процесс и процесс-потомок запускаются в том же
пространстве памяти. В частности, записи в память, выполненные вызывающим
процессом или процессом-потомком также видны из другого процесса.
Кроме того, любые отражения памяти (mapping) или их завершение (unmapping)
выполняемые через
mmap(2)

или
munmap(2)

потомком или вызывающим процессом, также оказывают эффект на другой процесс.

Если флаг
CLONE_VM

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

Записи в память или отражения выполняемые одним процессом не дают эффекта
в другом процессе как и в
fork(2).

CLONE_PID
Если флаг
CLONE_PID

установлен, процесс-потомок создаётся с таким же идентификатором процесса (ID)
как и вызывающий процесс.

Если
CLONE_PID

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

Данный флаг может быть установлен только процессом загрузки системы (с PID 0).

CLONE_THREAD
(Начиная с Linux 2.4)
Если флаг
CLONE_THREAD

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

Если флаг
CLONE_THREAD

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

(Группы тредов являются особенностью, добавленной в Linux 2.4 для поддержки
класса тредов POSIX, списка тредов, разделяющих один и тот же PID. В Linux
2.4, вызов
getpid(2)

возвращает идентификатор группы тредов, вызывающего процесса.)

About us cloud-clone corp.(ccc)

CLOUD-CLONE CORP. (CCC, USA), a research and experimental development in molecular biology and immunology oriented company headquartered in Houston, is the owner of the trade mark “Cloud-Clone”. Its main business includes production of assay reagent, manufacture of analysis equipment and service for animal experiment.

Cloud-Clone Corp. (CCC, Wuhan) is located in Export Processing Zone. Its quality management system is certified with ISO 9001:2021 and ISO 13485:2021. The featured products are reagents for life science research. 75% of the customers come from USA and Europe. Based on profound accumulation of technology and huge resource of primers, cDNAs, plasmids, hybridoma cells, as well as semi-products of detection reagent, CCC can provide 11,000 proteins, 19,000 antibodies and 7,000 immunoassay kits with short lead time. The Protein Center has four production platforms, including polypeptide synthesis platform, small-molecule modification platform, natural protein extraction platform, recombinant protein expression and purification platform using prokaryotic (E.coli) and eukaryotic (yeast, baculovirus or mammalian cells) expression systems. The Antibody Center has established a high-throughput technology platform for monoclonal, polyclonal and cloudclonal antibody production. The Preparation Center focuses on assay kit development and production. At present, its main products include ELISA kits and CLIA kits. The Detection Center is responsible for quality control of all the products, including proteins, antibodies and assay kits. All Cloud-Clone products are inspected by a three-level quality control system, including raw-material QC, semi-finished product QC, and end-product QC.

USCN life science KIT INC. (USCNK) is located at No.33 ZhenHua Road. Its main business is design of intelligent equipment, software application development and data storage service. The products include Smart Microplate Reader, Smart Microplate Washer, Smart Chemiluminescence Immunoassay Analyzer, Smart Electric Heated CO2 Constant Temperature Incubator and Smart Gradient PCR System, etc. Most products have CE certificate, patent certificate and software registration certificate. Besides R&D and mass production, USCNK also offers hardware modification and software update of standard equipment. Moreover, USCNK provides customized non-standard equipment, which could be designed exactly according to the specific demand of the customer. These equipment are mainly whole set of small animal experiment equipment, including ethology instruments, imaging instruments, and so on.

Cloud-Clone Animal INC. (CCA) owes government certified feeding facility with total area of 1200 sq.m., including 507 sq.m. of SPF area that consists of 220 sq.m. for breeding, 287 sq.m. for feeding. The animal house at Zhenhua Road can feed captive animals, like goats, horses, cows, pigs, chickens, dogs and other big experimental animals. All the animals are raised by professional staff and mainly used in antibody preparation. On account of the animal resource, CCA can provide thousands of animal models, involved in human disease animal models, knockout animal models and transgenic animal models. CCA also provides serums, blood cells, tissues and organs of animals in healthy or disease status, these products can be used as quality control of assay reagent. Meanwhile, hundreds of primary cells can be separated using these materials. CCA can offer several animal experiment services, including animal feeding, conservation of strains, animal ethology, animal imaging and other animal experiment. CCA also offers cell-based experiment such as cell culture, transfection, proliferation, infection and apoptosis. Furthermore, CRO service for drug discovery including drug screening, pharmacokinetics, toxicology and pharmacology are provided.

Cloud-Clone Diagnostic Reagents Institute (CCD), located in Zhenhua Road, is the research and pilot production base for IVD reagents. CCD is also the original manufacturer of core biological reagent raw materials. CCD is committed to provide high-quality IVD reagent raw materials, pathological antibodies and food safety testing reagents.

Index

ИМЯ
ОБЗОР
ОПИСАНИЕ
sys_clone
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
БАГИ
ЗАМЕЧАНИЯ
СООТВЕТСТВИЕ СТАНДАРТАМ
СМОТРИ ТАКЖЕ
ПЕРЕВОД

Sys_clone

Системный вызов

sys_clone

соответствует более закрытому

fork
(2)

в том плане, что выполнение в потомке продолжается от места данного вызова.
Таким образом

sys_clone

требует только аргументы

flagschild_stack
,

которые имеют тот же смысл, что и для вызова

clone
.

(Заметим, что порядок этих аргументов отличается от

clone

Другое отличие
sys_clone

состоит в том, что аргумент
child_stack

может быть нулём, в этом случае семантика copy-on-write обеспечивает
получение потомком отдельных копий страниц стека, когда один из процессов
изменяет стек. В этом случае, для правильной работы, не должен быть задан
флаг
CLONE_VM.

Архитектура аппаратного комплекса cloud one

В процессе переговоров с клиентами нам часто приходится подробно рассказывать об архитектуре и отдельных элементах нашего аппаратного комплекса, о том, на каком железе и с какими программными средствами работают наши сервисы. Чаще всего это происходит при обсуждении цены или параметров размещаемого проекта, особенно если наши потенциальные клиенты проводят мониторинг рынка и сравнивают предложения. Теперь в нашем блоге будет этот пост, способный расставить все точки на «и». Ну и, конечно же, мы надеемся, что он будет интересен всем Хабралюдям, связанным с технологиями хранения данных, серверными технологиями и облачными сервисами.

image

В качестве основы комплекса нами были выбраны блейд-серверные корзины HP BladeSystem c3000, как обеспечивающие оптимальное соотношение цена-качество и имеющие хорошие возможности по расширению. В корзины устанавливаются серверы HP BL460c G6 на процессорах Xeon 5650. Максимальный объем памяти у виртуальной машины может достигать 95 Гбайт, а блейд-сервера – 192 Гбайт, что тоже очень важно в свете предоставления в аренду виртуальных машин.

image

Каждый из серверов имеет «на борту» два встроенных Ethernet-порта и по два дополнительных, реализованных с помощью mezzanine-карты Intel NC360m Dual Port в качестве портов SAN (iSCSI) для процедур резервного копирования.

image

Сама же сеть хранения построена на системах хранения данных Netapp FAS3240. Интерфейсом скоростной передачи данных служит 8-гигабитный FibreChannel. В каждый из блейд-серверов установлены FC-карты Brocade 804, за коммутацию отвечают FC-коммутаторы Brocade Blade Switch 8/12, и все вместе это образует отказоустойчивый HA-кластер.

image

image

image

image

IP-сеть организована с помощью стека из коммутаторов Juniper EX4200. Для повышения отказоустойчивости коммутаторы дублируются.

Одна из особенностей именно наших виртуальных машин – среда виртуализации VMware vSphere 4.1 с гипервизором ESXi. Это накладывает свой серьезный отпечаток на параметры работы и себестоимость ресурсов. Из хостов гипервизора (BL460c G6) собран HA/DRS кластер, что позволяет радикально сократить время восстановления при аварии физической инфраструктуры. Для распределения нагрузки на хосты используется система DRS. Благодаря vSphere виртуальные машины поддерживают практически любую операционную систему, за исключением «настольной» Mac OS X и совсем уж экзотичных вариантов.
С клиентской стороны тоже много интересного. Прежде всего, это круглосуточный доступ в консоль управления виртуальными машинами, где можно выполнить базовые функции управления. Возможности самостоятельно регулировать объем выделенных ресурсов клиентам мы не предоставляем, но изменение мощности виртуальной машины производится оперативно, по запросу в службу круглосуточной технической поддержки. В подавляющем большинстве операционных систем изменение объема доступной процессорной мощности, оперативной памяти и дискового пространства производится без перезагрузки. Из доступных опций можно отметить резервное копирование (Backup) виртуальных машин, снятие мгновенных снимков (snapshot) файловой системы, организацию NFS-томов непосредственно на системе хранения (NetApp FAS3240 может выступать в качестве мультипротокольного хранилища SAN/NAS).

image

Надеемся, приведенные в этом посте данные смогут отчасти послужить обоснованием нашей тарифной политики и послужат отправной точкой для последующих материалов. А пока, пользуясь случаем, сообщаем об очередном снижении наших тарифов на виртуальные машины. Теперь все они включают лицензию VMware Standard. Ознакомиться с тарифами можно здесь: www.cloudone.ru/direction/virtual-server

Возвращаемое значение

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

errno

устанавливается соответствующим образом.

Замечания

Для ядер версий 2.4.7-2.4.18 флаг CLONE_THREAD неявно подразумевает
флаг CLONE_PARENT.

Как правильно клонировать объект?

Для клонирования объекта в Java можно пользоваться тремя способами:

  1. Переопределение метода clone() и реализация интерфейса Cloneable();
  2. Использование конструктора копирования;
  3. Использовать для клонирования механизм сериализации

Теперь по порядку. Первый способ подразумевает, что вы будете использовать механизм так называемого «поверхностного клонирования» и сами позаботитесь о клонировании полей-объектов. Метод

clone()

в родительском классе Object является protected, поэтому требуется переопределение его с объявлением как public. Он возвращает экземпляр объекта с копированными полями-примитивами и ссылками. И получается что у оригинала и его клона поля-ссылки указывают на одни и те же объекты. Пример далее показывает, как одновременно меняется поле у оригинального объекта и клона.

public class CloneTest{
    static class Person implements Cloneable{
        String name;
        int age;
        Car car;
        Person(Car car,int age,String name) {
            this.car = car;
            this.age = age;
            this.name = name;
        }

        @Override
        public String toString() {
            return this.name " {"  
                    "age="   age  
                    ", car="   car  
                    '}';
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    static class Car{
        public String color;

        Car(String color) {
            this.color = color;
        }

        @Override
        public String toString() {
            return "{"  
                    "color car='"   color   '''  
                    '}';
        }
    }


    public static void main(String[] args) throws CloneNotSupportedException {
        Car car = new Car("Green");
        Person person=new Person(car,25,"Mike");

        Person clone = (Person) person.clone();
        System.out.println(person);
        System.out.println(clone);
        clone.name=new String("Ivan");
        clone.car.color="red";
        System.out.println(person);
        System.out.println(clone);
    }
}
	Вывод:
    	Mike {age=25, car={color car='Green'}}
	Mike {age=25, car={color car='Green'}}
	Mike {age=25, car={color car='red'}}
	Ivan {age=25, car={color car='red'}}

Из примера выше видно, что у клона и оригинала состояние одного из полей изменяется одновременно. Следующий способ заключается в использовании конструктора копирования:

public class Person {
        private int age;
        private String name;
        public Person(int age, String name){
            this.age=age;
            this.name=name;
        }
        // конструктор копии
        public Person(Person other) {
            this(other.getAge(), other.getName());
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Person{"  
                    "age="   age  
                    ", name='"   name   '''  
                    '}';
        }

        public static void main(String[] args) {
            Person original = new Person(18, "Grishka");
            Person clone = new Person(original);
            System.out.println(original);
            System.out.println(clone);
        }
}
	Вывод:
	Person{age=18, name='Grishka'}
	Person{age=18, name='Grishka'}

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

Но оба вышеуказанных способа полны потенциальных ошибок и по сути создают копию объекта. Наиболее удобным и гибким способом клонирования является механизм сериализации. Он заключается в сохранении объекта в поток байтов с последующей эксгумацией его от туда. Для примера пригласим кота Ваську, его ждёт пара опытов:

import java.io.*;

class Cat implements Serializable{
    private String name;
    private String color;
    private int age;

    public Cat(String name, String color, int age) {
        this.name = name;
        this.color = color;
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Cat{"  
                "name='"   name   '''  
                ", color='"   color   '''  
                ", age="   age  
                '}';
    }
}
public class BasketCats{
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Cat vaska = new Cat("Vaska","Gray",4);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream ous = new ObjectOutputStream(baos);
        //сохраняем состояние кота Васьки в поток и закрываем его(поток)
        ous.writeObject(vaska);
        ous.close();
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        //создаём кота для опытов и инициализируем его состояние Васькиным
        Cat cloneVaska = (Cat)ois.readObject();
        System.out.println(vaska);
        System.out.println(cloneVaska);
        System.out.println("*********************************************");
        cloneVaska.setColor("Black");
        //Убеждаемся что у кота Васьки теперь есть клон, над которым можно ставить опыты без ущерба Василию
        System.out.println(vaska);
        System.out.println(cloneVaska);

    }
}
	Вывод:
    	Cat{name='Vaska', color='Gray', age=4}
	Cat{name='Vaska', color='Gray', age=4}
	*********************************************
	Cat{name='Vaska', color='Gray', age=4}
	Cat{name='Vaska', color='Black', age=4}

Ни один кот не пострадал в результате тестов, мы видим что Васька был сохранён в поток, из которого затем восстановили независимый клон. Если нет особой необходимости обработки полей во время клонирования объектов, то сериализация является наиболее предпочтительным вариантом для этих целей.

Клонирование на xiaomi

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

Чтобы сделать клонирование, необходимо:

  1. Зайти в общие настройки телефона и открыть «Приложения».
  2. Далее обратиться к разделу «Клонирование приложений».
  3. Выбрать из имеющегося списка (он разделен на те, что поддерживают операцию клонирования, и те, что нет) нужное андроид приложение.
  4. Подтвердить уведомление о создании клона и дополнительной копии сервисов от Google (возникает при первом клонировании).
  5. Подождать, пока система создаст копию – на экране высветится соответствующее уведомление «Клонирование завершено».
  6. Открыть рабочий стол и найти андроид приложение, помеченное значком желтого маркера.

Также в настройках клонирования можно в любое время удалять созданные аккаунты.

Лабэксперт – ифа наборы, антитела и белки cloud-clone corp – expert lab

Обзор

#include <sched.h>

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

_syscall2(int, clone, int, flags, void *, child_stack)

Общий контракт для метода clone

Метод clone создает и возвращает копию этого объекта. Точное значение слова “копия” может зависеть от класса объекта. Общее намерение состоит в том, чтобы для любого объекта x выражение

x.clone() != x

будет true, и выражение

x.clone().getClass() == x.getClass()

будет true, но это не абсолютные требования. Хотя обычно

x.clone().equals(x)

будет true, это не абсолютное требование. Копирование объекта обычно влечет за собой создание нового экземпляра его класса, но также может потребоваться копирование внутренних структур данных. Никакие конструкторы не вызываются.

Ошибки

EAGAIN
Уже запущено слишком много процессов.
ENOMEM
Не могу выделить требуемую память для структуры, описывающей процесс-потомок
или для копирования тех частей контекста вызывающего процесса, которые необходимо
скопировать.
EINVAL
Возвращается
clone

когда для
child_stack

было задано нулевое значение.

EINVAL
Оба флага
CLONE_FS

и
CLONE_NEWNS

были заданы в аргументе
flags.

EINVAL
CLONE_THREAD

был задан, но
CLONE_SIGHAND

нет. (Начиная с Linux 2.5.35.)

EPERM
CLONE_PID

был задан процессом с ненулевым значением PID.

Перевод

Перевёл с английского Виктор Вислобоков <

Примеры реализации метода clone()

public class Stack {
private Object[] elements;
private int size = 0;

@Override public Stack clone() {
try {
Stack result = (Stack) super.clone();
result.elements = elements.clone();
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

public class HashTable implements Cloneable {
private Entry[] buckets = …;
private static class Entry {
final Object key;
Object value;
Entry next;

Entry(Object key, Object value, Entry next) {
this.key = key;
this.value = value;
this.next = next;
}

// Рекурсивно копировать связанный список,
// возглавляемый этой Entry
Entry deepCopy() {
return new Entry(key, value, next == null ? null : next.deepCopy());
}

// Итеративное копирование связанного списка,
// возглавляемого этой Entry
Entry deepCopy() {
Entry result = new Entry(key, value, next);
for (Entry p = result; p.next != null; p = p.next) {
p.

next = new Entry(p.next.key, p.next.value, p.next.next);
}
return result;
}
}
@Override public HashTable clone() {
try {
HashTable result = (HashTable) super.clone();
result.

buckets = new Entry[buckets.length];
for (int i = 0; i < buckets.length; i ) {
if (buckets[i] != null) {
result.buckets[i] = buckets[i].deepCopy();
}
}
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

Заключения:

Альтернативы использования clone():

Смотри также

fork
(2),

wait
(2),

pthread_create
(3)

Соответствие стандартам

Вызовы

clonesys_clone

являются специфичными для Linux и не должны использоваться в программах,
которые задуманы как переносимые на другие платформы. Для программирования
приложений, использующих треды (несколько тредов управления в одной и
той же области памяти) лучше использовать библиотечную реализацию
POSIX 1003.1c thread API, такую как библиотека LinuxThreads (включённая
в glibc2). См.

pthread_create
(3).

Данная страница руководства соответствует ядрам 2.0.x, 2.1.x, 2.2.x, 2.4.x,
а также glibc 2.0.x и 2.1.x.

Оцените статью
Huawei Devices
Добавить комментарий