Linux——进程(1)

一、编程角度

        标准IO --库函数   --FILE * (fopen)
        文件IO --系统调用 --fd     (open)

1、多任务编程


        1.多进程
        2.多线程 
        进程:(进行中的程序)--正在运行的程序 (动态的) ---内存 程序的一次执行过程!
        程序 -- a.out (可执行程序) ---静态的 

程序源代码 
        程序 加载 到内存 运行起来 成为了 进程。 (程序 ---> ./a.out ----> 进程) 
        栈 
        堆 
        静态区 
        字符串常量区 
        代码段 

main()
{
    while(1)
    {
    }
} //单道 程序 
操作系统  //多道程序 

   程序1->|
   程序2->|--- [CPU]--> 
   程序3->|

   进程1->| 4G空间 
   进程2->|--- [CPU]--> 
   进程3->|
  //CPU --- 单核的CPU 
  //宏观并行 微观串行 
  //并发 --- 同一时刻 同时发生 

二、进程概念


  描述 记录 程序运行过程中的 动态信息!

  一个程序 可以 对应到多个进程
  [栈            ]
  [堆            ]    
  [静态区(全局区)] //data --已初始化的 全局变量 或 静态变量 
                            //bss  --未初始化的 全局变量 或 静态变量
  [字符串常量区  ]
  [代码区        ] //text (正文) --代码段
  ./a.out -----> 进程 (开辟的)
并发: 某一时刻,同时发生  
正在执行的程序 ---进程 (动态)
程序 ----加载到内存去运行--- 进程
进程是 程序运行的实体。

 
        程序中有: 程序 = 数据+代码  
        linux: 程序 
bss  --- 未初始化的数据  |           
data --- 初始化了的数据  |  静态区 | ---数据 
text --- 正文段(代码段)

        进程: (占用 cpu ,内存相关的资源 ,IO资源(屏幕,键盘))。进程是程序执行和资源管理的最小单位。

32位的平台 
4G空间 (4G的虚拟地址空间(逻辑上的))

用户空间   [0-3G]  //用户       3G
---------------------
内核空间   [3G-4G] //操作系统   1G
linux 怎么管理进程?
PCB (process control block)//账本 信息登记表 
程序角度:

task_struct {
    PID,             //进程标识符
    PPID,            //父进程ID号  parent 
    当前工作路径     //chdir
    umask            //0002
    进程打开的文件列表 //文件IO中有提到
    信号相关设置       //处理异步io, ---段错误
    用户id,组id
    进程资源的上限
}


三、进程的一生


创建进程、执行任务  
  (1).跟父进程相同的任务         fork 
  (2).有自己的任务要做   比如: shell执行命令  fork + exec 
进程结束 
  exit()
  (1).孤儿进程 --- 没有父亲  
  (2).僵尸进程 --- 有父亲,但是自己先挂了 


1.进程的含义


    进程是一个程序执行的过程,会去分配内存资源,cpu的调度
    pcb  是一个结构体,Process Control Block              
    struct task_struct  
    {
        PID,进程标识符
        PPID,parent id (父亲)
        
        当前工作路径   chdir
        umask  0002
        进程打开的文件列表  文件IO中有提到
        信号相关设置 处理异步io,
        用户id,组id
        
        进程资源的上限
        ulimit -a,显示资源上限。
    }
    
    //一个程序运行之后(进程) 默认打开了三个文件
    stdin 
    stdout 
    stderr 


2.进程和程序的区别


    程序:静态
        存储在硬盘中代码,数据的集合
    进程:动态
        程序执行的过程,包括进程的创建、调度、消亡
        .c ----> a.out-----> process(pid)
        
    1)程序是永存,进程是暂时的
    2)进程有程序状态的变化,程序没有
    3)进程可以并发,程序无并发
    4)进程与进程会存在竞争计算机的资源
    5)一个程序可以运行多次,变成多个进程
    
    一个进程可以运行一个或多个程序内存的分布
    0-3G,是进程的空间,
    3G-4G是内核的空间,虚拟地址
    虚拟地址 *  物理内存和虚拟内存的地址 映射表 1page=4k


进程分类:
1、交互式进程    shell进程
2、批处理进程    shell脚本  .bat 
3、守护进程     (后台进程)  //前台进程 


3.进程的作用


进程的一生:    (linux里面进程的状态7种) 
       D    uninterruptible sleep (usually IO)
       R    running or runnable   (on run queue) ---就绪队列中
       S    interruptible sleep   (waiting for an event to complete)
       T    stopped(暂停态), 
            either by a job control signal or because it is being traced.
       *W    paging (not valid since the 2.6.xx kernel)
       *X    dead (should never be seen)
       Z    defunct ("zombie") process, terminated but not reaped(收尸) by its parent.   


4.进程的状态


            3个状态,就绪→执行态→阻塞(等待,睡眠)基本操作系统linux中的状态,运行态,睡眠态,僵尸,暂停态。


5.进程的调度


    内核主要功能之一就是完成进程调度

    宏观并行
    微观串行

6.查询进程相关命令


    1.ps aux | grep 进程名 (查看进程相关信息)

        1.就绪态、运行态    R
        2.睡眠态、等待态    
            可唤醒等待态    S
            不可唤醒等待态    D
        3.停止态    T
        4.僵尸态    Z
        5.结束态    

    2.top
            根据CPU占用率查看进程相关信息

    3.kill和killall发送一个信号
            kill PID发送信号+PID对应的进程,默认接收者关闭
            kill -9 进程PID号 
            kill -l //查看信号列表 
            killall -9 进程名
            发送信号 进程名对应的所有进程
            killall a.out //通过 进程名 发信号      
            kill 信号编号 进程ID 
    4.pstree -sp [pid号]  //查看某个进程的父子关系

四、相关函数


1.fork()


    pid_t fork();
    叉子
    一次调用,会返回两次。
    子进程先运行和是父进程先进程,顺序不确定。
    变量不共享。
    
    子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
    
    功能:通过该函数可以从当前进程中克隆一个同名新进程。
               克隆的进程称为子进程,原有的进程称为 父进程。
               子进程是父进程的完全拷贝。
               子进程的执行过程是从fork函数之后执行。
               子进程与父进程具有相同的代码逻辑。

    返回值:int 类型的数字。
                  在父进程中:成功 返回值是子进程的pid号 >0
                        失败 返回-1;
                  在子进程中:成功 返回值 0
                        失败 无


2.getpid()


    pid_t getpid(void); 
    功能:
        获得调用该函数进程的pid
    参数:
        缺省
    返回值:
        进程的pid

3.getppid()


    pid_t getppid(void);
    功能:
        获得调用该函数进程的父进程pid号
    参数:
        缺省
    返回值:
        返回父进程id号

   
五、进程的执行


  1.举例    fork   (//子承父业)
           复制父进程 和 父进程做同样任务 。
  2.子进程创建好之后    fork+exec 函数组   //独立创业
            子进程有自己独立任务要做。
说明:
        如果打开文件的操作 在fork之前,则 子进程会继承父进程已打开的文件的相关信息(文件表项)
此时,父子进程共享 (文件表项),实现对同一个文件的操作。

        如果fork之后,各自打开,则父子进程,各自拥有各自的文件描述符 及 对应的文件表项,各自独立操作该文件。
此时,可能存在文件内容被覆盖。
[进程表项]
{
    pid 
    文件描述符 -----------> [文件表项](文件的状态,文件的偏移量) ------> hello.c 
}  
[进程表项]
{
    pid 
    文件描述符 -----------> [文件表项](文件的状态,文件的偏移量) ------> hello.c 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值