嵌入式学习(Day 24 :进程1)

1.进程的含义?
    进程是一个程序执行的过程,或正在执行的程序,会去分配内存资源,cpu的调度
    pcb  是一个结构体,process control block             print circuit board
    vim -t
    task_struct 
    
    PID,进程标识符,Process ID(最重要)
    Cwd,当前工作路径   chdir
    umask  0002   (设置0666,0777时,减umask)
    进程打开的文件列表  文件IO中有提到,(如:各文件描述符监控)
    信号相关设置 处理异步io,(如:ctrl c,退出运行)
    用户id,组id
    进程资源的上限
    ulimit -a,显示资源上限。(-a,所有,如:open file,一个a.out中最大打开1024个file文件,stack size:栈区空间:8M)
2.进程和程序的区别?
    程序:静态
        存储在硬盘中代码,数据集合
    进程:动态
        程序执行的过程,包括进程的创建、调度、消亡(CPU调度机制)
        .c ----> a.out-----> process(pid)
    1)程序是永存,进程是暂时的
    2)进程有程序状态的变化,程序没有
    3)进程可以并发,程序无并发
    4)进程与进程会存在竞争计算机的资源
    5)一个程序可以运行多次,变成多个进程
        一个进程可以运行一个或多个程序
        内存的分布
    0-3G,是进程的空间,3G-4G是内核的空间,虚拟地址
    虚拟地址 *  物理内存和虚拟内存的地址 映射表 1page=4k    mmu


        进程分类:
        1、交互式进程  (如:mini shell)
        2、批处理进程   shell脚本 
        3、 守护进程   (如:杀毒软件,windows中的后台进程)


3.进程的作用? 并发,并行区别。
    while (1) {            while (1) { 上下左右
        发视频
    }        }
4.进程的状态:
    3个状态,就绪→执行态→阻塞(等待,睡眠)基本操作系统的3个状态。(就绪态:资源已调配好,就差CPU了;运行态:运行过程中,
阻塞态:程序运行时,某个条件未满足);
    linux中的状态,运行态,睡眠态,僵尸,暂停态。
(可唤醒睡眠:如迷你shell等待输入;不可唤醒:光驱;暂停状态:如:gdb调试;僵死状态:程序运行完后,资源未回收完毕,待回收);
    
5.进程的调度,进程上下文切换
    内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动(top,PR、IN)
    调度算法, other,idle
                rr,fifo
    
    Linux中进程调度的特点:宏观并行,微观串行。

6.查询进程相关命令
    1.ps aux

    查看进程相关信息

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

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

    3.kill和killall发送一个信号  
    kill -2 PID  15
    发送信号+PID对应的进程,默认接收者关闭
    
    killall -9 进程名
    发送信号 进程名对应的所有进程
    killall a.out
    
7.进程相关函数:
1.fork();
    pid_t fork(); 叉子
    1.一次调用,会返回两次。
    2.子进程先运行还是父进程先运行,顺序不确定。
    3.变量不共享。
    4.子进程复制父进程的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号
        fork()&&fork()||fork();    共5个进程,不算自己,有4个。
       
        while(1)sleep(1);
应用场合:(网络服务器、)

        1)一个进程希望复制自己,使父子进程同时执行同的代码段。网络服务中会比较多见。
        2)一个进程需要执行一个不同的程序。fork+exec

        使用变量测试,验证位于不同的地址空间。
        文件的写入测试。
    

8.父子进程的关系:
    子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。(正文段,即代码共享,父给子一个指针)
    
    在fork之后,一般情况那个会先运行,是不确定的。如果非要确定那个要先运行,需要IPC机制。
    
    区别:
    1)fork的返回值,父进程返回子的PID号,子返回0;
    2)pid不同


9.进程的终止:8种情况
    1)main 中return(到return时,main中的所有进程结束);
    2)exit(), exit()是c库函数,①会执行io库的清理工作(相当于刷新缓冲区),②关闭所有 的流,以及③关闭所有打开的文件(相当于调用了free)。已经清理函数(atexit)。
    3)_exit,_Exit 是系统调用, 会关闭所有的已经打开的文件,不执行清理函数。(与2)区别:不会清理,资源浪费,少用)
    4)    主线程退出
    5)主线程调用pthread_exit  (4、5均是主线程结束)
    异常终止
    6)abort()    abort关闭,相当于拔掉电源,可能会对硬件伤害。
    7)signal   kill pid    发信号
    8)最后一个线程被pthread_cancle
  
   10.进程的退出  
    僵尸进程和孤儿进程
    孤儿进程:父进程先消亡,子进程挂靠到bash或1号进程;
    
    僵尸进程:进程执行结束但部分空间(默认进程结束,PCB块不释放),未被回收变成僵尸进程,等待父进程调用相关函数回收;

    1.exit     库函数
    退出状态,终止的进程会通知父进程,自己是如何终止的。如果是正常结束(终止),则由exit传入的参数。如果是异常终止,则有内核通知异常终止原因的状态。任何情况下,父进程都能使用wait,waitpid获得这个状态,以及资源的回收。
    void exit(int status) 
    exit(1);        exit最常用
    功能:
        让进程退出,并刷新缓存区(刷新缓冲区,该写内容写内容)
    参数:
        status:进程退出的状态
    返回值:
        缺省
    
    EXIT_SUCCESS    0
    EXIT_FAILURE    1

    return  当该关键字出现在main函数中时候可以结束进程
            如果在其他函数中则表示结束该函数。
    exit -> 刷新缓存区 -> atexit注册的退出函数 -> _exit
    
    2._exit    系统调用    (不常用)
    void _exit(int status);
    功能:
        让进程退出,不刷新缓存区
    参数:
        status:进程退出状态
    返回值:
        缺省

    
             mian(int agc,argv)
{
    main();
}             
    
    回调函数
    3.atexit    (进程回收动作) 主要点:①被动调用、②进程结束那一刻之前
    int atexit(void (*function)(void));    (void (*function)(void))函数指针
    功能:
        进程退出前执行的函数
    参数:
        function:函数指针
            指向void返回值void参数的函数指针
    使用:如:atexit(clean);    //进程结束前调用clean函数
    返回值:
        成功返回0
        失败返回非0

    当程序调用exit或者由main函数执行return时,所有用atexit
    注册的退出函数,将会由注册时顺序倒序被调用

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值