内核源码阅读(一)进程

1.进程分为实时进程和非实时进程。

        硬实时进程有严格的时间限制,某些任务必须在指定的时限内完成。软实时进程是硬实时进程的一种弱化形式。大多数进程没有特定时间约束的普通进程。CPU时间分配简图如2.1所示。

2.1 时间片分配CPU时间

抢占式多任务处理:各个进程都分配到一定时间段可以移植,当时间到期后,内核会从进程强制手机控制权,被抢占进程的运行时环境都会被保存起来因此其执行结果不会丢失,恢复时进程环境可完全恢复。

2.进程表示

Linux内核及及进程和顺序的所有算法都围绕一个名为task_struct的数据结构,其位于include/sched.h中。

Linux中task_struct用来控制管理进程,结构如下:
struct task_struct 
{
 volatile long state;   /*说明了该进程是否可以执行,还是可中断等信息。-1表示不可执行,0表示可运行,>0表示禁止*/ 
unsigned long flags;  	/* Flage 是进程号,在调用fork()时给出  */
 int sigpending; 		 /* 进程上是否有待处理的信号 * /
//进程地址空间,区分内核进程与普通进程在内存存放的位置不同
 mm_segment_t addr_limit; /* 0-0xBFFFFFFF for user-thead  
 0-0xFFFFFFFF for kernel-thread */
 volatile long need_resched; /* 调度标志,表示该进程是否需要重新调度,若非0,则当从内核态返回到用户态,会发生调度 */
 int lock_depth;	  	/* 大内核锁深度 */ 
 long nice;    /*进程的基本时间片 */  
 unsigned long policy;	/*进程的调度策略,有三种,实时进程:SCHED_FIFO,SCHED_RR, 分时进程:SCHED_OTHER
*/
 struct mm_struct *mm; 	 /* 进程内存管理信息 */

 
 int processor; /*若进程不在任何CPU上运行, cpus_runnable 的值是0,否则是1 这个值在运行队列被锁时更新*/
 unsigned long cpus_runnable, cpus_allowed;
 struct list_head run_list; /*指向运行队列的指针 */
 unsigned long sleep_time;  /* 进程的睡眠时间 */
 struct task_struct *next_task, *prev_task;	/*用于将系统中所有的进程连成一个双向循环链表, 其根是init_task */
 struct mm_struct *active_mm;
 struct list_head local_pages;       /* 指向本地页面  */    
 unsigned int allocation_order, nr_local_pages;
 struct linux_binfmt *binfmt;  /* 进程所运行的可执行文件的格式 */
 int exit_code, exit_signal;
 int pdeath_signal;     /* 父进程终止是向子进程发送的信号 */
 unsigned long personality;
 /* Linux可以运行由其他UNIX操作系统生成的符合iBCS2标准的程序 */
 int did_exec:1; 
 pid_t pid;    /* 进程标识符,用来代表一个进程 */
 pid_t pgrp;   /*进程组标识,表示进程所属的进程组*/
 pid_t tty_old_pgrp;  /* 进程控制终端所在的组标识 */
 pid_t session;  /*进程的会话标识 */ 
pid_t tgid;     
 int leader;     /*表示进程是否为会话主管*/ 
 struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;
 struct list_head thread_group;   /*线程链表 */ 
struct task_struct *pidhash_next; /* 用于将进程链入HASH表 */
 struct task_struct **pidhash_pprev;
 wait_queue_head_t wait_chldexit;  /* 供wait4()使用 */
 struct completion *vfork_done;  /* 供vfork() 使用 */
 unsigned long rt_priority; /* 实时优先级,用它计算实时进程调度时的weight值 */
 /* it_real_value,it_real_incr用于REAL定时器,单位为jiffies, 系统根据it_real_value设置定时器的第一个终止时间. 在定时器到期时,向进程发送SIGALRM信号,同时根据it_real_incr重置终止时间,it_prof_value,it_prof_incr用于Profile定时器,单位为jiffies。当进程运行时,不管在何种状态下,每个tick都使it_prof_value值减一,当减到0时,向进程发送信号SIGPROF,并根据it_prof_incr重置时间.it_virt_value,it_virt_value用于Virtual定时器,单位为jiffies。当进程运行时,不管在何种状态下,每个tick都使it_virt_value值减一当减到0时,向进程发送信号SIGVTALRM,根据it_virt_incr重置初值。*/
unsigned long it_real_value, it_prof_value, it_virt_value;
unsigned long it_real_incr, it_prof_incr, it_virt_value;
struct timer_list real_timer;   /* 指向实时定时器的指针 */
struct tms times;      /* 记录进程消耗的时间 */
unsigned long start_time;  /* 进程创建的时间 */
 long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];  /*记录进程在每个CPU上所消耗的用户态时间和核心态时间 */ 
 
//内存缺页和交换信息:
/* min_flt, maj_flt累计进程的次缺页数(Copy on Write页和匿名页)和主缺页数(从映射文件或交换设备读入的页面数); 
nswap记录进程累计换出的页面数,即写到交换设备上的页面数。
cmin_flt, cmaj_flt, cnswap记录本进程为祖先的所有子孙进程的累计次缺页数,主缺页数和换出页面数。
在父进程回收终止的子进程时,父进程会将子进程的这些信息累计到自己结构的这些域中 */
 unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
 int swappable:1;  /*表示进程的虚拟地址空间是否允许换出*/ 

 //进程认证信息
uid,gid为运行该进程的用户的用户标识符和组标识符,通常是进程创建者的uid,gid
euid,egid为有效uid,gid
fsuid,fsgid为文件系统uid,gid,这两个ID号通常与有效uid,gid相等,在检查对于文件*/
 //suid,sgid为备份uid,gid
 uid_t uid,euid,suid,fsuid;
 gid_t gid,egid,sgid,fsgid;
 int ngroups; //记录进程在多少个用户组中
 gid_t groups[NGROUPS]; //记录进程所在的组
 //进程的权能,分别是有效位集合,继承位集合,允许位集合
 kernel_cap_t cap_effective, cap_inheritable, cap_permitted;
 int keep_capabilities:1;
 struct user_struct *user;
 struct rlimit rlim[RLIM_NLIMITS];  //与进程相关的资源限制信息
 unsigned short used_math;   //是否使用FPU
 char comm[16];   //进程正在运行的可执行文件名

 //文件系统信息
 int link_count, total_link_count;		/* 连接数目*/
 struct tty_struct *tty;   /* NULL if no tty 进程所在的控制终端,如果不需要控制终端,则该指针为空 */
 unsigned int locks;

 //进程间通信信息
 struct sem_undo *semundo;  /* 进程在信号灯上的所有undo操作 */
 struct sem_queue *semsleeping; /* 当进程因为信号灯操作而挂起时,他在该队列中记录等待的操作 */
 struct thread_struct thread;		/*进程的CPU状态,切换时,要保存到停止进程的task_struct中 */
 struct fs_struct *fs;			/*文件系统信息*/
 struct files_struct *files;		/*打开文件信息*/
 spinlock_t sigmask_lock;    /* 信号处理函数 */
 struct signal_struct *sig; //信号处理函数
 sigset_t blocked;  //进程当前要阻塞的信号,每个信号对应一位
 struct sigpending pending;  /* 进程上是否有待处理的信号 */
 unsigned long sas_ss_sp;
 size_t sas_ss_size;Linux提供资源限制机制,其使用了task_struc t的rlim数组,数组项类型为struct rlimit。
 int (*notifier)(void *priv);
 void *notifier_data;
 sigset_t *notifier_mask;

//线程组跟踪
u32 parent_exec_id;
 u32 self_exec_id;
spinlock_t alloc_lock;
 void *journal_info;	/* 虚拟内存状态*/
 };
  3.Linux的资源限制机制
   Linux提供资源限制机制,其使用了task_struct的rlim数组,数组项类型为struct rlimit。

          

rlim_cur:进程当前的资源限制,即软限制。

rlim_max:该限制的最大容许值,即硬限制。

setrlimit和getrlimits用于增减和检查当前限制。表2.3列出了可能的常数及其含义

表2.3


    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值