### Namespace vs CGroups
Namespace - механизм изоляции и группировки структур данных ядра.
Control groups - механизм изоляции ресурсов ядра.
### Представление процесса в Linux
include/linux/sched.h
```
struct task_struct {
void *stack;
refcount_t usage;
/* Per task flags (PF_*), defined further below: */
unsigned int flags;
unsigned int ptrace;
```
include/linux/nsproxy.h
```
/*
* A structure to contain pointers to all per-process
* namespaces - fs (mount), uts, network, sysvipc, etc.
*
* The pid namespace is an exception -- it's accessed using
* task_active_pid_ns. The pid namespace here is the
* namespace that children will use.
*
* 'count' is the number of tasks holding a reference.
* The count for each namespace, then, will be the number
* of nsproxies pointing to it, not the number of tasks.
*
* The nsproxy is shared by tasks which share all namespaces.
* As soon as a single namespace is cloned or unshared, the
* nsproxy is copied.
*/
struct nsproxy {
atomic_t count;
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace *pid_ns_for_children;
struct net *net_ns;
struct time_namespace *time_ns;
struct time_namespace *time_ns_for_children;
struct cgroup_namespace *cgroup_ns;
};
```
### Namespace API
- clone(). низкоуровневый программный интерфейс для создания потоков выполнения в Linux. От fork() и vfork() он отличается тем, что позволяет более точно контролировать этапы создания процесса. Как и в случае с fork(), новый процесс, создаваемый вызовом clone(), является почти полной копией своего родителя. Отличие от fork() состоит в том, что клонированный потомок не продолжает работу с момента вызова, а сначала вызывает функцию, указанную в аргументе func
```
int clone(int (*func) (void *), void *child_stack, int flags,
void *func_arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
```
- unshare(). позволяет процессу (или потоку) отделить части своего контекста выполнения, которые используются совместно с другими процессами (или потоками). Часть контекста выполнения, например пространство имён монтирования, неявно делается общей при создании нового процесса с помощью fork() или vfork(), в то время как другие части, такие как виртуальная память, могут стать общими по явному запросу при создании процесса или потока с помощью clone(). Основное предназначение unshare() - позволить процессу контролировать свой общий контекст выполнения без создания нового процесса.
- setns(). С его помощью можно поместить вызывающий процесс или тред в нужное пространство имён. Для этого требуется файловый дескриптор, который на это пространство имён ссылается.
### Namespaces
* Mount. Копия дерева файловой системы, ассоциированная с процессом. Создание `clone(,,,,CLONE_NEWNS)`
* UTS. Изоляция имени хоста и доменного имени. Создание `clone(,,,,CLONE_NEWUTS)`
* IPC
* PID. Изоляция индентификаторов процессов.
* user