[linux]进程(一)--基本概念

1,进程的基本概念
简单来说进程就是执行期的程序,但是同时进程也不至于此,它还包括了其它资源(如打开的文件,挂起的信号等等)
Linux是一个多任务多用户操作系统,一个任务(task)就是一个进程(process),即进程=任务,在linux系统中,进程和线程共享一系列的资源(地址空间,文件,信号,名字空间等)

2,进程的标识;

每个进程都有一个独一无二的结构体即struct task_struct,一个进程相关的所有信息都可以在该结构体里标识,每一个进程的task_struct又组成了一个任务队列,用双向链表表示:另外每一个进程还对应一个独一无二的数字,即PID,PID最大值为32767(32768=8*4096,32位系统一个页是4096字节,每个字节为8bit),后一个进程创建的PID是前一个进程PID加1,当PID到达最大值后又从最小值开始,linux用pidmap_array位图来知道哪些pid被使用,一个进程中所有线程使用的PID是相同的,但是有各自不同的线程ID,线程ID只在该进程环境中有效,进程的PID在整个系统是唯一的,

[cpp] view plaincopy

  1. struct task_struct
  2. {
  3. //......
  4. pid_t pid;
  5. }

task_struct结果体是如何分配的?slab分配器?

3,内核如何访问当前的进程:

[cpp] view plaincopy

  1. #define current get_current()
  2. static inline struct task_struct *get_current(vold)
  3. {
  4. return current_thread_info()->task;
  5. }

关于struct thread_info和内核堆栈可以参考另外一篇文章:

对每个进程来说,linux把两个不同的数据结构放在内核的一个动态存储区,大小为8k,一个是struct thread_info,一个是内核堆栈,在arm处理器上,内核通过sp寄存器指针获得当前cpu正在运行进程的thread_info结构地址,在Thread_info.h文件

4,进程的状态:

就绪态,阻塞态,运行态
 内核将进程的状态保存在struct task_struct的state字段中:

[cpp] view plaincopy

  1. struct task_struct
  2. {
  3. volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
  4. //......
  5. }

进程的僵尸状态:

进程的僵尸状态:表示进程结束但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源(放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度),但尚未释放task_struct(只剩下它了,所以称为僵尸),记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。

子进程在退出的过程中,内核会给其父进程发送一个信号(默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号),通知父进程来"收尸"。父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉 如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,子进程的尸体(task_struct)也就无法释放掉
如何处理僵尸进程:找出父进程号,然后杀死父进程,在Android下,子进程一起被杀死
内核中设置某个进程状态的函数: set_task_sate(task,state);

5,进程的优先级:

在task_struct中有四个变量和进程的优先级相关:

[cpp] view plaincopy

  1. sched.h
  2. struct task_struct
  3. {
  4. //......
  5. int prio, static_prio, normal_prio;
  6. unsigned int rt_priority;
  7. //......
  8. }

① prio指的是任务当前的动态优先级,其值影响任务的调度顺序。
② normal_prio指的是任务的常规优先级,该值基于static_prio和调度策略计算。
③ static_prio指的是任务的静态优先级,在进程创建时分配,该值会影响分配给任务的时间片的长短和非实时任务动态优先级的计算。范围是120+nice值,nice值范围是-20到19
④ rt_priority指的是任务的实时优先级。若为0表示是非实时任务,[1, 99]表示实时任务,值越大,优先级越高。
对于非实时任务,prio = normal_prio = static_prio

实时进程:prio = normal_prio = MAX_RT_PRIO – 1 – rt_priority

子进程的静态优先级继承父进程的静态优先级,子进程的动态优先级继承自父进程的普通优先级~

6,各个进程关系

linux系统进程存在一个继承关系,系统中每个进程都有父进程,init(PID为1,由idle进程(PID为0创建))进程是所有用户进程的祖先,而kthreadd是所有内核进程的祖先进程关系除了父子兄度,可能还存在其它关系,如进程组,登录会话等等。进程如何从PID导出task_struct结构体:内核主要根据pid tgid pgrp session四个不同含义用到了四个hash表。

[cpp] view plaincopy

  1. {
  2. PIDTYPE_PID,  // 进程的PID
  3. PIDTYPE_TGID, // 线程组领头进程的PID
  4. PIDTYPE_PGID, // 进程组领头进程的PID
  5. PIDTYPE_SID,  // 会话领头进程的PID
时间: 2024-08-02 10:56:39

[linux]进程(一)--基本概念的相关文章

小何讲进程: Linux进程的基本概念

1.  进程定义 进程是操作系统理论的核心与基础,操作系统中的许多概念都和进程相关. 进程的定义 ,进程有过各种各样的定义,现列举较为著名的几种. 进程是一个独立的可调度的活动: 进程是一个抽象实体,当它执行某个任务时,要分配和释放各种资源: 进程是可以并行执行的计算单位: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动: 进程是一个程序的一次执行过程,同时也是资源分配的最小单元. 进程和程序是有本质区别的: 程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念

Linux 进程的基础概念

什么是进程? 运行中的程序,是将程序脚本放入内核执行. 进程创建 内核会首先创建Init进程,再由Init进程管理其他进程.进程都是由其父进程创建的. 进程优先级 0-139: 1-99 实时优先级 数字越大 优先级越高 100-139 静态优先级 数字越小 优先级越高 nice值:-20~19 算是微调自己的优先级,但是优先级只能调低,不能调高. 虚拟内存 使用Page frame实现,page frame就是分页.将不连续的物理内存(物理地址空间)以虚拟(线性地址)的方式提供给进程使用.每个

[linux]进程(二)--进程地址空间

7,linux进程命名空间的概念 关于命名空间具体可以参考深入linux内核架构2.3.2章节 linux的命名空间属于操作系统级虚拟化,各个命名空间互相隔离,互相不可见,不同命名空间的进程PID可以相同,因此从操作系统层面看可能有相同的uid和pid,父命名空间同时还可以包含子命名空间,子命名空间不知道父命名空间的存在,但是父命名空间知道子命名空间的存在. 命名空间的实现:为了task_struct的精简,内核引入了struct nsproxy来统一管理进程所属的命名空间,在task_stru

Linux进程概念与管理

一.Linux进程概念 1.进程:Process,是运行中的程序的一个副本,有生命周期,都由其父进程创建 Linux内核存储进程信息的固定格式:taskstruct 多个任务的的taskstruct组件的链表:task list 2.进程优先级:0-139 0:一般不使用 1-99:实时优先级:数字越大优先级越高,系统自动安排 100-139:静态优先级:数字越小优先级越高,可手动更改 3.Nice值:-20至19,对应于100到139 普通用户只能将自己的优先级调低,root用户可以随意调制

linux系统-进程管理-基本概念和命令

linux系统-进程管理-基本概念和命令 一 基本概念 1 进程:是程序的执行过程,是动态的,有生命周期,动态产生和消亡,程序和进程不是一一对应的 2 父进程和子进程: 子进程是有一个进程产生的进程,产生这个进程的进程成为该进程的父进程 父进程是由linux系统中调用fork产生,fork复制的内容包括父进程的数据和堆栈段以及父进程的堆栈环境 3 父进程与子进程的关系 父进程终止子进程自然终止,如不终止,则为孤儿进程,父进程自动指向init进程 子进程终止父进程没有终止,这父进程成为僵死进程 4

linux内核之进程的基本概念(进程,进程组,会话关系)

进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树.除此以外,进程还有其他层次关系:进程.进程组和会话. 进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合. 这样说来,一个进程会有如下ID: ·PID:进程的唯一标识.对于多线程的进程而言,所有线程调用getpid函数会返回相同的值. ·PGID:进

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS 日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gatieme

Linux进程的实际用户ID和有效用户ID

在Unix进程中涉及多个用户ID和用户组ID,包括如下: 1.实际用户ID和实际用户组ID:标识我是谁.也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看). 2.有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限.一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID.当设置-用户-ID(SUID)位设置,则有效用户ID等于

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872659 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 前景回顾 1 Linux的调度器组成 2 调度工作 进程上下文 1 进程上下文的概念 2 上下文切换 context_switch进程上下文切换 1 context_switch完全注释 2 prepare_arch_switch切换前的准备工作