idle进程 –> init进程 –> Zygote进程 –> SystemServer进程 –> Launcher桌面程序 -> App应用

idle进程:又叫swapper进程,它创建了init进程和ktheadd进程。

init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;

Android进程系列1---进程基础

Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程;

SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等;

Launcher桌面程序:就是我们平时看到的桌面程序,它其实也是一个android应用程序,只不过这个应用程序是系统默认第一个启动的应用程序.

内容预览.png

概述:

本文主要讲解进程基础,更深入的认识有血有肉的进程,内容涉及进程控制块,信号,进程FD泄露等等。仅供参考,欢迎指正。

一、从Linux看进程到底是什么?

“进程四要素” —《Linux 内核源代码情景分析》描述如下:

  • 有一段程序供其执行
  • 拥有专用的系统堆栈空间
  • 在内核存在对应进程控制块
  • 拥有独立的用户存储空间

上面确实有点抽象,进程不仅仅是一段处在执行状态的程序,还包括还文件,信号,内存地址空间,CPU状态等等复杂的信息,更重要的是拥有独立的用户存储空间,这个是与线程的本质区别。在Linux内核中,进程是由一个task_struct 的结构体表示的,task_struct又称进程控制块,task_struct 定义在include/linux/sched.h文件中。
下面的代码给出了task_struct的一小部分,已经在后面写清楚了注释,这个结构体相对较大,在32位的机器上约1.7kb。

struct task_struct {volatile long state;    //进程的允许状态/* -1 unrunnable, 0 runnable, >0 stopped */ void *stack;atomic_t usage;unsigned int flags; /* per process flags, defined below */pid_t pid;   //进程的pidpid_t tgid;//线程组的idstruct task_struct *real_parent; /* real parent process (when being debugged)  ,如果创建它的父进程不再存在,则指向PID为1的init进程*/  struct task_struct *parent; /* parent process “养父进程”通常与real_parent值相同,当它终止时,必须向它的父进程发送信号*/  struct list_head children;  /* list of my children */该进程的孩子进程链表struct list_head sibling;   /* linkage in my parent's children list */ 该进程的兄弟进程链表struct list_head thread_group; //*线程链表 struct task_struct *group_leader;   /* threadgroup leader */该进程的线程组长struct timespec start_time;  //进程创建时间 struct fs_struct *fs;  //文件系统信息 struct files_struct *files;//打开的文件信息struct mm_struct *mm, *active_mm;//描述进程的地址空间,active_mm指向进程运行时所使用的内存描述符, 对于普通进程而言,这两个指针变量的值相同,但是内核线程kernel thread是没有进程地址空间的int prio, static_prio, normal_prio;//static_prio用于保存静态优先级,prio用于保存动态优先级unsigned int rt_priority;//用于保存实时优先级/* signal handlers */struct signal_struct *signal;struct sighand_struct *sighand;
}
state表示进程的状态定义如下,我们了解其中几种。

/*
* Task state bitmask. NOTE! These bits are also
* encoded in fs/proc/array.c: get_task_state().
*
* We have two separate sets of flags: task->state
* is about runnability, while task->exit_state are
* about the task exiting. Confusing, but this way
* modifying one set can't modify the other one by
* mistake.
*/
#define TASK_RUNNING        0
#define TASK_INTERRUPTIBLE  1
#define TASK_UNINTERRUPTIBLE    2
#define __TASK_STOPPED      4
#define __TASK_TRACED       8
/* in tsk->exit_state */
#define EXIT_DEAD       16
#define EXIT_ZOMBIE     32
#define EXIT_TRACE      (EXIT_ZOMBIE | EXIT_DEAD)
/* in tsk->state again */
#define TASK_DEAD       64
#define TASK_WAKEKILL       128
#define TASK_WAKING     256
#define TASK_PARKED     512
#define TASK_STATE_MAX      1024

状态 含义
TASK_RUNNING 0 表示进程要么正在执行,要么正要准备执行(就绪状态),正在等待cpu时间片的调度
TASK_INTERRUPTIBLE 1 进程因为等待一些条件而被挂起(阻塞)而所处的状态。这些条件主要包括:硬中断、资源、一些信号……,一旦等待的条件成立,进程就会从该状态迅速转化成为TASK_RUNNING状态,是一种可中断的等待状态
TASK_UNINTERRUPTIBLE 2 不可中断的等待状态
TASK_STOPPED 4 进程被停止执行,当进程接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU信号之后就会进入该状态
TASK_TRACED 8 表示进程被debugger等进程监视,进程执行被调试程序所停止,当一个进程被另外的进程所监视,每一个信号都会让进城进入该状态
EXIT_ZOMBIE 32 进程被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息,此时进程成为僵尸进程
EXIT_DEAD 16 进程的最终状态

POSIX(Portable Operating System Interface for Computing System,准确地说是针对类Unix操作系统的标准化协议)规定一个进程内部的多个thread要共享一个PID,在很多情况下,进程都是动态分配一个 task_struct 表示,其实线程也是由一个task_struct 来表示的,所以task_struct具有双重身份,既可以作为进程对象,也可以作线程对象。这样,为了满足POSIX的线程规定,linux引入了线程组的概念,一个进程中的所有线程所共享的那个PID被称为线程组ID,也就是task struct中的tgid成员,因此,在linux kernel中,线程组ID(tgid,thread group id)就是传统意义的进程ID。对于getpid系统调用,linux内核返回了tgid。对于gettid系统调用,本意是要求返回线程ID,在linux内核中,返回了task struct的pid成员。简单来一句总结:POSIX的进程ID就是linux中的线程组ID。POSIX的线程ID也就是linux中的pid

小结:
1、进程控制块的数据结构,主要包含下列信息

a、进程的标志符,如pid,uid等
b、进程的状态,如state, exit_state, prio等
c、进程间的关系,如parent, children,sibling等
d、进程拥有的资源,如mm,fs,files,mm等
e、信号处理函数,如signal, sighand等

2、task_struct具有双重身份,线程和进程都是用task_struct表示,区别在于进程拥有独立的用户空间,而线程和其它线程是共享存储空间的。

二、进程进阶

2.1、 pid ,ppid ,tgid ,pgid ,sid 的理解

上面了解了进程的数据结构,我们可以通过下面两条命令来查看进程的信息,进一步加强进程相关标识的理解(pid ,ppid ,tgid ,pgid ,sid )

cat /proc/self/status
cat /proc/self/stat

拿头条App举例

jason:/ $ ps -ef |grep com.ss.android.article.news
u0_a159      10276  1112 87 15:19:50 ?    00:00:32 com.ss.android.article.news
u0_a159      10731  1112 1 15:19:56 ?     00:00:00 com.ss.android.article.news:pushservice
u0_a159      10794  1112 9 15:19:57 ?     00:00:02 com.ss.android.article.news:push
u0_a159      10953  1112 2 15:19:58 ?     00:00:00 com.ss.android.article.news:ad
shell        11198 11193 6 15:20:27 pts/0 00:00:00 grep com.ss.android.article.news
jason:/ $ cat /proc/10276/stat
10276 (id.article.news) S 1112 1111 0 0 -1 1077936448 365859 144549 137 0 3783 3165 1004 406 16 -4 144 0 31842 2094268416 53986 18446744073709551615 1 1 0 0 0 0 4612 1 1073779960 0 0 0 17 2 0 0 0 0 0 0 0 0 0 0 0 0 0


http://www.taodudu.cc/news/show-2577583.html

相关文章:

  • mysql定义过程_mysql定义和调用存储过程
  • php mongodb方法,PHP 操作mongodb api大部分方法
  • linux下的网络管理命令,【linux】常见的网络管理命令
  • 计算机中丢失glut.dll,OpenGl的源程序,运行就提示,计算机丢失 glut32.dll文件
  • linux怎么踢普通用户,Linux系统管理员踢用户的方法
  • 写了一个内核模块实现简单的类似ps命令.
  • mysql 闰年,[MySQL]--gt;查询5天之内过生日的同事中的闰年2月
  • c语言在内存存储结构,C语言中float,double类型,在内存中的结构(存储方式)
  • 面试官:内存耗尽后Redis会发生什么 ?
  • 小程序云开发点赞案例实现及环境vant插件配置等问题
  • 基于医疗知识图谱的项目构建学习总结(一)—项目构建环境搭建及爬取数据部分
  • html总结
  • Windows域内密码凭证获取 (゚益゚メ) 渗透测试
  • Android SDK ADB命令行总结
  • 知识图谱基础代码构建(医疗向)
  • (转发)贼牛逼的双数据源切换 赞一个 PS:关于最后事物无法切换的问题 也有解决方案 后续补上
  • 跟同事聊工作,不要用哦,可以用收到、明白、好、知道等词代替
  • 终于有人把联邦学习讲明白了
  • 终于有人把p值讲明白了
  • 终于有人把数据安全讲明白了
  • 测试小故事61:真的明白了吗?
  • 经典括号匹配问题——你真的明白了吗?
  • 这下爽了,居然有人通过这个把Linux的命令提示符给整明白了
  • 大数据:一张图让你明白什么是大数据
  • 一步一图一代码,一定要让你真正彻底明白红黑树
  • 一篇文章看明白 Android 从点击应用图标到界面显示的过程
  • (MATLAB)把视频读得明明白白
  • 高兴就好,简单就好,明白就好
  • 一篇文章看明白 Android 系统启动时都干了什么
  • 一篇文章看明白 Activity 与 Window 与 View 之间的关系

Android进程系列1---进程基础相关推荐

  1. Android系统启动系列----init进程

    Android系统启动系列 Android系统启动系列----init进程 Android系统启动系列----Zygote进程 引言 在开发app的过程中,是不是会有疑问: java程序的运行不是从m ...

  2. linux进程系列(5)进程链与进程扇

    在linux编程中我们或许需要创建多个进程才可以完成任务需求,那么我们怎么创建多个进程呢?下面我们介绍一下进程链与进程扇的概念 所谓进程链就是父进程创建一个子进程,创建的子进程再次创建出属于自己的子进 ...

  3. Android 系统(243)---Android进程系列第一篇---进程基础

    Android进程系列第一篇---进程基础 内容预览.png 概述: 本文主要讲解进程基础,更深入的认识有血有肉的进程,内容涉及进程控制块,信号,进程FD泄露等等.仅供参考,欢迎指正. 一.从Linu ...

  4. Android系统启动系列1 进程基础

    一 进程是什么? 1.1 什么是进程? 可以认为进程是一个程序的一次执行过程,或者说一个正在执行的程序.在这个过程中,伴随着资源的分配和释放.进程是资源管理的最小单元. "进程四要素"--<Li ...

  5. Android系统中的进程管理:进程的优先级

    本文是Android进程管理系列文章的第二篇,会讲解进程管理中的优先级管理. 进程管理的第一篇文章:<进程的创建>请跳转至这里. 本文适合Android平台的应用程序开发者,也适合对于An ...

  6. Android 9 (P) Zygote进程启动源码分析指南二

         Android 9 Zygote进程启动源码分析指南二 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  7. [Android]你不知道的Android进程化(3)--进程等级

    我们可以看到现在Android的运行内存越来越大,6G.8G的大内存时代,越大运存将允许运行越多的app,而Android系统也组建增大进程可以申请的最大运存量.Android 系统将尽量长时间地保持 ...

  8. Android系统中的进程管理:进程的创建

    对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...

  9. Android(IPC)进程间通讯1:详解Binder由来?

    完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...

  10. Android组件化跨进程通信框架Andromeda解析

    关于组件化 随着项目结构越来越庞大,模块与模块间的边界逐渐变得不清晰,代码维护越来越困难,甚至编译速度都成为影响开发效率的瓶颈. 组件化拆分是比较常见的解决方案,一方面解决模块间的耦合关系.将通用模块 ...

最新文章

  1. B1059 C语言竞赛
  2. XML 序列化 【译】
  3. git显示服务器所有分支,怎么拉取git服务器上面的分支到本机?
  4. WebStorm 提示快捷键
  5. EventBus设计与实现分析——特性介绍
  6. firefox 4b7截图
  7. python socket 大文件_python:socket传输大文件示例
  8. 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头
  9. Mac上最佳的SVN管理工具:Cornerstone
  10. oracle2db2,从Oracle 到DB2(二)
  11. [译] 第二天:AngularJS - 认识AngularJS
  12. Vue webpack打包后,css样式发生改变或不起作用
  13. 【2019牛客暑期多校训练营(第八场)E】Explorer【线段树分治维护图连通】
  14. 统赢编程软件_统赢PressCAD线割慢走丝编程软件的线割上下异形编程设定
  15. k3c官改刷openwrt_斐讯K3刷OpenWrt(Lede)
  16. 彼得·林奇的 PEG 估值策略
  17. 小米java模拟器_Android沉浸式简单实现(暂未测试全部机型,根据资料修改,模拟器,小米6,,荣耀做了简单测试)...
  18. redis统计用户日活量_使用redis统计用户日活、月活(实践版)
  19. 大数据入门及各类技术介绍
  20. java元编程_一文读懂元编程

热门文章

  1. 我,程序员,32岁失业后干啥都赔钱,过去月薪2万的岁月不再重来 你呢?
  2. win10把用户中文名改为英文名
  3. 方正飞鸿智能信息平台(Fix ES2007)
  4. 方正平台(企业级应用的开发平台)
  5. 基金指数温度怎么算_指数温度计算方法
  6. 深入理解设计模式-设计模式七大原则
  7. 每天定时检测404链接
  8. 【工作方法系列】:STEP1 - 5分钟方法
  9. python实现ks算法_Python计算KS值并绘制KS曲线
  10. 系统重装之后如何恢复mysql数据