Android进程系列1---进程基础
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应用程序,只不过这个应用程序是系统默认第一个启动的应用程序.
概述:
本文主要讲解进程基础,更深入的认识有血有肉的进程,内容涉及进程控制块,信号,进程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---进程基础相关推荐
- Android系统启动系列----init进程
Android系统启动系列 Android系统启动系列----init进程 Android系统启动系列----Zygote进程 引言 在开发app的过程中,是不是会有疑问: java程序的运行不是从m ...
- linux进程系列(5)进程链与进程扇
在linux编程中我们或许需要创建多个进程才可以完成任务需求,那么我们怎么创建多个进程呢?下面我们介绍一下进程链与进程扇的概念 所谓进程链就是父进程创建一个子进程,创建的子进程再次创建出属于自己的子进 ...
- Android 系统(243)---Android进程系列第一篇---进程基础
Android进程系列第一篇---进程基础 内容预览.png 概述: 本文主要讲解进程基础,更深入的认识有血有肉的进程,内容涉及进程控制块,信号,进程FD泄露等等.仅供参考,欢迎指正. 一.从Linu ...
- Android系统启动系列1 进程基础
一 进程是什么? 1.1 什么是进程? 可以认为进程是一个程序的一次执行过程,或者说一个正在执行的程序.在这个过程中,伴随着资源的分配和释放.进程是资源管理的最小单元. "进程四要素"--<Li ...
- Android系统中的进程管理:进程的优先级
本文是Android进程管理系列文章的第二篇,会讲解进程管理中的优先级管理. 进程管理的第一篇文章:<进程的创建>请跳转至这里. 本文适合Android平台的应用程序开发者,也适合对于An ...
- Android 9 (P) Zygote进程启动源码分析指南二
Android 9 Zygote进程启动源码分析指南二 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...
- [Android]你不知道的Android进程化(3)--进程等级
我们可以看到现在Android的运行内存越来越大,6G.8G的大内存时代,越大运存将允许运行越多的app,而Android系统也组建增大进程可以申请的最大运存量.Android 系统将尽量长时间地保持 ...
- Android系统中的进程管理:进程的创建
对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...
- Android(IPC)进程间通讯1:详解Binder由来?
完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...
- Android组件化跨进程通信框架Andromeda解析
关于组件化 随着项目结构越来越庞大,模块与模块间的边界逐渐变得不清晰,代码维护越来越困难,甚至编译速度都成为影响开发效率的瓶颈. 组件化拆分是比较常见的解决方案,一方面解决模块间的耦合关系.将通用模块 ...
最新文章
- B1059 C语言竞赛
- XML 序列化 【译】
- git显示服务器所有分支,怎么拉取git服务器上面的分支到本机?
- WebStorm 提示快捷键
- EventBus设计与实现分析——特性介绍
- firefox 4b7截图
- python socket 大文件_python:socket传输大文件示例
- 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头
- Mac上最佳的SVN管理工具:Cornerstone
- oracle2db2,从Oracle 到DB2(二)
- [译] 第二天:AngularJS - 认识AngularJS
- Vue webpack打包后,css样式发生改变或不起作用
- 【2019牛客暑期多校训练营(第八场)E】Explorer【线段树分治维护图连通】
- 统赢编程软件_统赢PressCAD线割慢走丝编程软件的线割上下异形编程设定
- k3c官改刷openwrt_斐讯K3刷OpenWrt(Lede)
- 彼得·林奇的 PEG 估值策略
- 小米java模拟器_Android沉浸式简单实现(暂未测试全部机型,根据资料修改,模拟器,小米6,,荣耀做了简单测试)...
- redis统计用户日活量_使用redis统计用户日活、月活(实践版)
- 大数据入门及各类技术介绍
- java元编程_一文读懂元编程