Linux程序pid分配法

2022-08-28 13:03:23 字數 3103 閱讀 9691

copy from : 

android系統建立程序,最終的實現還是呼叫linux fork方法,對於linux系統每個程序都有唯一的 程序id(值大於0),也有pid上限,預設為32768。 pid可重複利用,當程序被殺後會**該pid,以供後續的程序pid分配。

static struct task_struct *copy_process(unsigned long clone_flags, unsigned long stack_start, unsigned long stack_size, int __user *child_tidptr, struct pid *pid, int trace, unsigned long tls) 

p->pid = pid_nr(pid); //設定pid[見小節2.4]

...}

[-> kernel/kernel/pid.c]

struct pid *alloc_pid(struct pid_namespace *ns)

...get_pid_ns(ns);

atomic_set(&pid->count, 1);

for (type = 0; type < pidtype_max; ++type)

init_hlist_head(&pid->tasks[type]); //初始化pid的hlist結構體

upid = pid->numbers + ns->level;

spin_lock_irq(&pidmap_lock);

if (!(ns->nr_hashed & pidns_hash_adding))

goto out_unlock;

for ( ; upid >= pid->numbers; --upid)

spin_unlock_irq(&pidmap_lock);

return pid;

...}

2.2.1 pid結構體

[-> kernel/include/linux/pid.h]

struct pid

;

2.2.2 upid結構體

[-> pid.h]

struct upid 

;

2.2.3 pid_type

[-> pid.h]

enum pid_type

;

2.2.4 pid_namespace結構體

[-> kernel/include/linux/pid_namespace.h]

struct pid_namespace ;

pid命名空間,這是為系統提供虛擬化做支撐的功能。

[-> kernel/kernel/pid.c]

static int alloc_pidmap(struct pid_namespace *pid_ns)

spin_unlock_irq(&pidmap_lock);

kfree(page);

if (unlikely(!map->page))

break;

}//當pidmap還有可用pid時

if (likely(atomic_read(&map->nr_free)))

//否則,查詢下乙個非0的offset值

offset = find_next_offset(map, offset);

根據offset轉換成相應的pid

pid = mk_pid(pid_ns, map, offset);

} while (offset < bits_per_page && pid < pid_max);

}//當上述pid分配失敗,則再次查詢offset

if (map < &pid_ns->pidmap[(pid_max-1)/bits_per_page]) else

pid = mk_pid(pid_ns, map, offset);

} return -1;

}

pid允許分配的最大值為32767,當pid分配輪過一圈之後則允許分配的最小值為300,也就是說前300個pid是不可再分配的。

#define page_shift 12

#define page_size (1ul << page_shift) // 2^12

#define bits_per_page (page_size * 8) // 2^15

#define bits_per_page_mask (bits_per_page-1) //2^15-1

#define page_mask (~(page_size-1))

2.3.1 pidmap結構體

[-> kernel/include/linux/pid_namespace.h]

struct pidmap ;

pidmap->page的大小為4kb,每乙個bit位代表乙個程序pid的分配情況,那麼4kb*8=32768, 這正好是pid可分配的上限,用nr_free代表該namespace下還有多少可用pid。

2.3.2 find_next_offset

[-> pid.c]

#define find_next_offset(map, off) \ find_next_zero_bit((map)->page, bits_per_page, off)

static inline int mk_pid(struct pid_namespace *pid_ns, struct pidmap *map, int off) 

[-> kernel/include/linux/pid.h]

static inline pid_t pid_nr(struct pid *pid)

根據pid結構體找到真正的pid數值。

Linux 下獲取程序PID

linux查詢pid有多種方式,可通過遍歷 proc目錄下程序執行資訊及shell ps命令 1.遍歷 proc目錄 linux下每個執行的程序都會在 proc目錄下建立該程序pid目錄,proc pid 目錄下有 status,cmdline等描述程序執行引數,狀態等資訊.執行可能沒有命令列引數,...

Linux程序PID雜湊表

linux 系統中每個程序由乙個程序id標識,在核心中對應乙個task struct結構的程序描述符,系統中所有程序的task struct通過鍊錶鏈結在一起,在核心中,經常需要通過程序id來獲取程序描述符,最簡單的方法可以通過遍歷task struct鍊錶並對比id的值來獲取,但這樣效率太低,尤其...

Linux 程序名 程序號PID互查

liunx中通過程序名查詢程序pid可以通過 pidof 程序名 來查詢。反過來 相同通過pid查詢程序名則沒有相關命令。在linux根目錄中,有乙個 proc的vfs 虛擬檔案系統 系統當前執行的所有程序都對應於該目錄下的乙個以程序pid命名的資料夾,其中存放程序執行的n多資訊。其中有乙個stat...