一、proc文件系统

传统意义上的文件系统是用于块设备上信息的存储,/proc这个目录是一个虚拟文件系统,它放置的数据都是在内存当中,所以这个目录本身不占用任何硬盘空间。主要包含如下系统信息:
内存管理
系统进程特征数据
文件系统
设备驱动程序
系统总线
电源管理
终端
系统控制参数

用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。

除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

二、什么是进程

进程通常被定义为一个正在运行的程序实例,它由两个部分组成:一个组成部分是操作系统用来管理程序的内核对象。内核对象是系统用来存放关于进程统计信息的地方。另一个组成部分是地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆栈分配空间。
进程运行过程,其实就是把磁盘的二进制文件加载(映射)到内存空间中,并且指引CPU去内存中寻址,然后计算,并且返回(I/O)的过程。
可以思考这样一个问题,现在我们硬盘上有三个文件xxx.exe,xxx.apk,xxx,操作系统是如何知道哪些文件是可执行文件呢?操作系统识别可执行文件的方式有两种,一种是在系统内核进行识别(比如linux和windows),另一种是在系统内库层使用虚拟机来实现。使用虚拟机就非常方便,我们可以在不修改内核的情况下修改和扩展虚拟机就可以实现跨平台。

三、进程的运行过程

1、将程序装载到内存(程序的实例化)
32位二进制系统最大寻址能力是 2^32 = 2^10 * 2^2 = 1G * 4 = 4G,所以我们的物理内存最大可以使用4G.假如我们现在同时开了100个进程播放电影,照样可以正常播放,这是为什么呢?事实上除了物理内存外,还有一个虚拟内存 
虚拟存储器是一个抽象的概念,它为每一个进程提供了一个假象,每个进程都在独占使用主存(硬盘)
 
虚拟地址空间如下:
(注:图摘自《深入理解计算机系统》)
地址空间最底部存放用户进程定义的代码和数据,对于所有的进程来说,代码是从同一个固定地址开始。接着就是全局变量和对应的数据位置,堆、共享库、栈。最上面是内核虚拟存储器,内核总是驻留在内存中,是操作系统的一部分,地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。
2、读取内存中的程序段内容,给变量分配空间,在调用的时候寻址操作
进程运行过程其实就是把磁盘的二进制文件映射到内存空间中并且指引CPU去内存中寻址,然后计算并且返回(I/O)的过程。
 #include <sys/types.h>
#include <unistd.h>
#include <stdio.h> int main(){
printf("hello PID:%d\n", getpid());
printf("hello ppid:%d\n", getppid());
char *p;
scanf("%s", p); return 0;
}

启动这个程序(进程)

可以看到这个进程的ID是1634,进程的父ID是1617,下面我们使用命令ps -aux来查看一下当前的进程,该进程的父进程是shell进程。
首先二进制程序getpid被linux系统识别,将该二进制文件放到内存中,处理器寻址并给变量分配内存空间(将函数和变量放到不同的区域),最后将结果输出。

四、进程运行过程中的两个特点

1、多任务,多进程“并发
我们的linux是多任务,分时的,一个独立的逻辑控制流,好像我们的程序独占的使用处理器,下面是CPU的进程调度图。
进程1,2,3,4,5,6......在运行过程中由CPU分配时间片段,上图的处理器就像转盘一样,当指向某个进程后就给该进程分配时间片,开始执行该进程,如此反复。
2、彼此独立、所处的内存隔绝
使用虚拟内存,每个进程都有一个私有的地址空间,好像我们的程序独占和使用内存。

五、进程的生命周期

对程序而言,进程有三大状态:运行、挂起、消亡。
 
1、建立任务(创建进程)
2、准备运行(等待CPU分配时间片)
3、正在运行(在实际的运行状态中,如果没有分配到cpu实际片,继续等待)
4、挂起(分为可打扰的和不可打扰的),比如scanf等待用户输入就是可打扰中断。
5、消亡(当任务终止,或者被父进程回收)

Android系统开发(8)——linx进程基本概念的更多相关文章

  1. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  2. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...

  3. Android 系统开发做什么?

    题外话 18 年我从 Android 应用开发转 Framework 层开发了,从此开启了 996 幸福生活,博客技术文更新基本停滞了,被工作占据了过多的精力,实在没时间像以前一样拟稿.写作,实践.反 ...

  4. Android 系统回收资源时进程被杀的优先级

    http://developer.android.com/guide/components/processes-and-threads.html#Processes Android 操作系统的内存回收 ...

  5. Android系统开发--灯光系统之电池灯的流程分析

    Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...

  6. Android系统开发实务实训

    实训项目 :               Android系统开发实务实训                           项目成品名称:         绝地坦克                 ...

  7. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  8. Android 系统开发学习杂记(转)

    http://blog.csdn.net/shagoo/article/details/6709430 > 开发环境1.安装 Eclipse 和 android-sdk 并解压安装2.Eclip ...

  9. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  10. Android系统开发入门

    Android操作系统 Android是一个基于Linux.使用java作为程序接口的操作系统. 他提供了一些工具,比如编译器.调试器.还有他自己的仿真器(DVM — Dalvik Virtual M ...

随机推荐

  1. Standalone 集群部署

    Spark中调度其实是分为两个层级的,即集群层级的资源分配和任务调度,以及任务层级的任务管理.其中集群层级调度是可配置的,Spark目前提供了Local,Standalone,YARN,Mesos.任 ...

  2. 如何优雅的写UI——(3)添加MFC选项卡

    窗体创建完成,接下来我们讲讲控件的使用 首先在CFormView窗体下选项卡的成员变量,这里我选择MFC下的选项卡类库:CMFCTabCtrl class CtabView : public CFor ...

  3. 【hdu 6038】Function

    [Link]:http://codeforces.com/contest/834/problem/C [Description] 给你两个排列a和b; a排列的长度为n,b排列的长度为m; a∈[0. ...

  4. 洛谷——P2695 骑士的工作

    https://www.luogu.org/problem/show?pid=2695 题目背景 你作为一个村的村长,保卫村庄是理所当然的了.今天,村庄里来了一只恶龙,他有n个头,恶龙到处杀人放火.你 ...

  5. Android Cordova 插件开发之编写自己定义插件

    前言 本文适合Android+web的复合型人才,由于cordova本身就是混合开发,所以在Android开发的基础上,还要懂web相关技术(HTML+CSS+JS).可是也有例外,比方我.仅仅需负责 ...

  6. Python - 字典按值(value)排序

    字典安值排序是一个伪命题. 字典本身是不能被排序的, 已经依照关键字(key)排序, 可是列表(list)和元组(tuple)能够排序, 所以字典须要转换列表后排序. 如 import operato ...

  7. 热点共享SS网络

    # 测试系统: Ubuntu 16.04 LTS-lxde-ARM # ***-libev 安装脚本源于 秋水逸冰: https://teddysun.com/358.html # ss-tproxy ...

  8. actionMode - 在屏幕中的显示位置设置

    actionMode 默认的显示位置是在屏幕上方的,如果想要移到下方,可以添加如下属性 在AndroidManifest.xml 的activity中,做如下修改 <activity andro ...

  9. slice深拷贝数组

    var a = [1, 2, 3, 4] var b = a.slice(0) b[0] = 2 // a = [1, 2, 3, 4] // b = [2, 2, 3, 4]

  10. 【2017"百度之星"程序设计大赛 - 初赛(A)】今夕何夕

    [链接]http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=775&pid=1005 [题意] 在这里写题意 [题 ...