linux 2.6源代码情景分析笔记之进程3
为内核寻找新进程在cpu上运行时,必须只考虑可运行进程(TASK_RUNNING)。
提高调度程序运行速度的诀窍是建立多个可运行进程链表,每种进程优先权对应一个不同的链表。每个task_struct描述符包含一个list_head类型的字段run_list。如果进程的优先权等于k(0-139),run_list字段把该进程链入优先权为k的可运行进程的链表中。
内核必须为系统中每个运行队列保存大量的数据,不过运行队列的主要结构还是组成运行队列的进程描述符表,所有这些链表都由一个单独的prio_array_t数据结构来实现。
185 struct prio_array {
186 unsigned int nr_active; 链表中进程描述符的数量
187 unsigned long bitmap[BITMAP_SIZE]; 优先权位图:当且仅当某个优先权的进程链表不为空时设置相应的位标志
188 struct list_head queue[MAX_PRIO]; 140个优先权队列的头结点
189 };
static void enqueue_task(struct task_struct *p, prio_array_t *array)
{
sched_info_queued(p);
list_add_tail(&p->run_list, array->queue + p->prio);
__set_bit(p->prio, array->bitmap);
array->nr_active++;
p->array = array;
}
此函数将进程描述符插入某个运行队列链表。于此函数对应的是dequeue_task(p,array)
进程描述符的prio字段存放进程的动态优先权,而array字段则是一个指针,指向当前运行队列的prio_array_t数据结构。
程序创建的进程具有父/子关系。如果一个进程创建多个子进程时,则子进程之间具有兄弟关系。进程0和进程1是由内核创建的。进程1(init)是所有进程的祖先。
real_parent:指向创建了p进程的描述符,如果p的父进程不再存在,就指向进程1(init)的描述符(如果用户运行一个后台进程而且退出了shell,后台进程就会成为init的子进程)
parent:指向p的当前父进程(这种进程的子进程终止时,必须向父进程发信号)。它的值通常与real_par
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
ACE库中专门对线程同步提供了两个类,一个是ACE_Thread_Mutex另一个是ACE_REcursive_Thread_Mutex。 在我看 来,在linux下进行线程同步,不要使用ACE_Thread_Mutex,用ACE_REcursive_Thread_Mutex就可以了。原因很 简单,因为ACE_Thread_Mutex不支持线程重入。一旦重入(同一个线程调用两次ACE_Thread_Mutex: ......
#apt-get install gcc (编译器)
#apt-get install gdb (调试)
#apt-get install libc6-dev (开发库)
如果没有开发库,gcc的时候就会错误
gcc h.c
h.c: In function ‘main’:
h.c:1: warning: incompatible implicit declaration of built-in function ‘prin ......