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上
    一个进程可以产生多个线程,并行运行//多核
        
4.进程调度
    优先级:划分了固定个数://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密集型
        

9.IPC
IPC:inter preocess communication:进程间通信
    //进程是意识不到其他进程的存在的
同一主机上:
    signal //常见通信方式
    shm:shared memory
    semerphor:
不同主机上:
    rpc:remote procecure call //远程过程调用
    socket:基于套接字的通信
        //一个进程监听在一个位置上,可以接受别人发送的消息
        //一端只管向socket发数据,内核会自动把数据传送到另一端,另一单