天天看点

Linux进程相关概念

1.进程调用 

2.CPU分配

3.进程创建 

4.进程调度

5.内存分配与回收

6.进程类型 

7.进程状态 

8.IO过程

9.IPC

一、Linux进程及作业管理

1.进程调用:

    call:调用别人实现编写好的功能模块

    可以基于{system call/lib调用}或者混合调用

    系统调用:通常在内核发生

    库调用:有的可能是一个独立的模块,有的可能是对系统调用的二次封装

进程调用意味着什么?

    CPU指令:普通指令:ring3 //任何应用程序都可以执行

        特权指令:ring0//不允许程序随意调用,由内核调用,来实现硬件平台的管理

    任何程序需要运行特权指令,OS把其封装成调用,必须要向内核发起调用,由内核执行

        system call在ring3,发起在ring0运行,然后调用完成后返回ring3

    该进程需要运行ring0的指令的时候:发起软中断,目的在于发起system call

        //内核把该代码载入cpu,把执行结果返回给调用者,调用后继续运行后续代码

        //程序需要暂停运行:system call之后继续运行,这叫软中断

    CPU指令分为:

        特权指令:ring 0 //root环,内存寻址,内存控制,设置内存的访问权限为w/r

                //普通用户的特权指令是不允许运行特权指令的

                //内核级别和OS级别代码,才会去运行特权指令

        ring1,ring2,//历史原因,没有使用

        用户指令:ring3

    运行用户代码的时候:用户模式/用户空间

    进程发起system call,需要软中断:内核模式/内核空间

    例如mkdir /tmp/a :这就需要一次中断,因为要对硬件进行操作

    内核的作用:进程管理,fs,network functions

    cpu会在用户指令和内核指令之间来回切换:模式切换

    一般:70%代码在用户进程,其他的内核进程最好

2.CPU如何进行资源分配//假如cpu只有一个

    时间片切割:time split

    进程有优先级的概念:轮流使用CPU

    1.假如一个进程霸占cpu不放

        需要一个仲裁机制:内核(进程管理:负责进程调度)

    2.保存进程状态 

        在cpu上的寄存器上,cpu上有寄存器:保存的是当前进程的状态

        一旦切换到下一个指令后,这些值都会发生改变

    进程保护与恢复:

        现场信息:由内核负责保存,在内存中存放

            进程信息:进程号,占用的内存号,状态,cpu时间分配等

        切换由内核完成,

        linux内核存储的进程信息的固定格式:task struct //task结构体

        //结构体信息,使用链表存储,方便查找

        //多个任务的task struct组成的链表:task list

    process:运行中的程序的一个副本

        存在生命周期

        //程序是一个静态的文件

    3.当中断发生的时候,必须由内核接管一切

3.进程创建

    每一个进程的组织结构都是一样的

    内核创建了第一个进程:init

    init:上帝的使者

        //init创建后,意味着用户空间也被创建出来了

    相当于总代理:

        他可以创建子进程,子进程创建子进程

        父子关系

        进程:都由其父进程创建 //需要向内核申请

            fork(),clone() //创建子进程[可以为同一段内存空间],只有在子进程需要写数据的时候,才分家CoW(写时复制)分配另外一段空间

                            //进程=指令+数据,需要写数据的时候,CoW复制一份,进行分家

    进程终止的话:释放空间,父进程负责

        父进程创建子进程:为了让子进程运行某一特定任务,子进程完成后,需要进行销毁

    系统调用:

        read(),write(),open()

    并行执行,以线程运行:很普遍//一个父程序,创建其子进程,其线程可以同时运行在其他cpu上

    一个进程可以产生多个线程,并行运行//多核

    优先级:划分了固定个数://kernel 2.6之后

    0-99:实时优先级 //数字越大优先级越高

    100-139:静态优先级//用户可指定,数字越小,优先级越高

    nice值:-20-+19 //100-139 ,-20:100  +19:100 //调整优先级

    Linux内核为了快速实现进程的调度:把系统上代运行的进程分了140个队列

        相同优先级的拍一队 //只需扫描队列的首部即可

        Big O:算法复杂度

            O(1),O(logn),O(n),O(n^2),O(2^n)

        每一对运行队列都有两队://当运行队列完成后,和过期队列对换身份

            运行队列:真正扫描的

            过期队列:已经被调度过的队列

    task struck中存放的数据:

        state,thread_info,flags,mm,tty,....

        线程,内存信息,tty,fs,files,信号等

5.内存的分配与回收,创建等

    内存分片:4K大小,单个成为page

        page frame:页框,用来存储页面数据

            存储page//页框中存储的数据成为页数据

    内存不能预测进程需要多少空间来使用:假设

        ---------------------------------|

        |--------|-----------------------|//内存

        内核占用 | 其他进程使用

    把其他的内存:切割成固定大小的片段page,把这些片段分配给其他进程

    内存占用的大小:不是固定的,后期可能会增长的

    进程启动后,内核把众多分散的空闲的空间中找,拼凑起来分配给该进程

    内存中存在大量的:page frame组成

        而这些page frame:都以不连续或者部分连续的方式组成

    页对应的是线性地址的东西   而页框对应的是物理地址   是实际的存储区域

    告诉进程是连续的:通过一个中间层,伪装

    每一个系统都认为:世界上只存在两个人,自己和内核

    进程的线性地址空间:每一个进程都假设自己有3G(32bit)的内存可用

    物理地址空间:真正占用的空间可能只有很少

        //他们之间是离散对应的,虚拟内存机制

    LRU:最近最少使用算法

        线性地址空间映射到内存空间

    进程只能访问:线性地址空间,

        MMU:Memory Management Unit//内存管理单元:负责内存线性内存和物理内存之间的映射

    一旦内存不够使用:LRU算法,置换到swap中,轮到该进程的时候,再次换回去 

    //内核为每一个进程都保存有一个task_struck:记录了线性地址空间和物理地址空间的对应关系

    有些程序的数据是必须在内存中的:常驻内存集

    能够交换出去的:虚拟内存集

    Linux内核:抢占式多任务//进程优先级高的抢占进程优先级低的

        可以把别人运行所用的CPU时间片抢过来

        只有在相应的时间点,才可以抢,不能进程刚上线,就开始抢了

6.进程类型:

        守护进程:daemon,由内核在系统引导时启动的进程

        前台进程:用户通过终端启用的进程//和终端相关

            注意:也可把在前台启动的进程送往后台,以守护模式运行

7.进程状态:

        运行态:running

        就绪态:ready

        睡眠态:

            可中断睡眠:interruptable

                    //CPU时间片到了就可以直接运行

            不可中断睡眠:uninterruptable //例如一个进程需要等待加载一个大文件,即使下一个cpu时间片到了,也没有满足运行条件

                    //进程等待的这个过程做什么呢?不可能让他占领cpu,只能让他把cpu让出来,让其他进程运行,直到该进程满足该条件

                    //这就叫做一次IO过程

                    //IO过程:某一进程需要加载的数据,内存中没有,就不得不请求内核从磁盘把数据装入到内存

                    //进程是没有权限,加载数据到内存中的,只有向内核申请,但是内核通常只是加载的数据,是加载到内核空间中的内存中的

        停止态:暂停于内存中,但不会被调度,除非手动启动之,stopped

        僵死状态:zombie,一个子进程被创建后,并且任务完成后,等待被父进程清理

            //父进程挂了,但是子进程依然存在    

8.IO过程:

        1.数据首先从磁盘装入到内核内存中去

        2.复制一份到进程内存中去

    进程的分类:

        CPU-Bound //CPU密集型

        IO-Bound //IO密集型

IPC:inter preocess communication:进程间通信

    //进程是意识不到其他进程的存在的

同一主机上:

    signal //常见通信方式

    shm:shared memory

    semerphor:

不同主机上:

    rpc:remote procecure call //远程过程调用

    socket:基于套接字的通信

        //一个进程监听在一个位置上,可以接受别人发送的消息

        //一端只管向socket发数据,内核会自动把数据传送到另一端,另一单

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1977631,如需转载请自行联系原作者

继续阅读