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...