Linux内核(深入理解linux内核+linux内核设计与实现)笔记

1.内核中使用双向循环链表来组织进程描述符(task_struct),进程描述符即我们操作系统中学习的进程控制块PCB,进程描述符里面包含进程的基本信息(thread_info),所接收的信号(signal_struct),进程号,父进程指针等。

2.由于在某些情况下,内核必须能从进程的PID到处对应的进程描述符指针,如kill系统调用从P1进程向P2发送信号,需要从P2的进程描述符中取出记录挂起信号的数据结构指针。所以引入了4个散列表,分别是PIDTYPE_PID(进程的PID),PIDTYPE_TGID(线程组领头进程),PIDTYPE_PGID(进程组领头进程的PID),PIDTYPE_SID(会话领头进程的PID),使用双向链表来解决冲突。

3.进程调度:采用CFS:完全公平调度算法。该算法有两个特点:(1)设有最小时间颗粒,即最低的CPU占用时间(如1ms),避免频繁的切换进程造成上下文切换的浪费;(2)按照nice的相对值来分配时间,而不是绝对值,如nice值为20和0的两个进程分配的时间为5ms和15ms,而nice值为1和0的两个进程分配的时间仍为5ms和15ms。

4.信号在内核中是如何发送传递的?

向某个进程a发送信号,会在a的进程描述符中信号相关变量设置,相关的有共享挂起信号队列,有私有挂起信号队列,向某个进程组发送的信号,会挂在共享挂起信号队列中,向单独一个进行发送的信号,会挂在私有挂起信号队列中。相应的进程在从内核态转到用户态时,会先处理可以处理的信号(没有阻塞的信号),然后再回到用户态。

5.init进程的pid号为1,内核中有pid为0的swapper进程,它只有在CPU不能执行其他进程时才执行。

6.Linux下如何进行进程调度?

对于普通进程,采用CFS(完全公平调度)算法,CFS使用红黑树组织可运行进程队列。

对于实时进程,有两种调度方法,分别是SCHED_FIFO和SCHED_RR,FIFO是简单的先入先出调度算法,不适用时间片。而SCHED_RR则是带有时间片的SCHED_FIFO,任务好紧它的时间片时,同一优先级的其他实时进程被轮流调度。

发表评论

电子邮件地址不会被公开。 必填项已用*标注