目录
进程基本概念
进程相关命令
进程的创建
进程的调度
进程相关函数接口
进程的消亡
实例:创建九个子进程
目录
进程基本概念
进程相关命令
进程的创建
进程的调度
进程相关函数接口
进程的消亡
实例:创建九个子进程
exec函数族
进程基本概念
 1.进程:
     程序:存放在外存中的一段数据组成的文件
     进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡
进程相关命令
     1.top 
       动态查看当前系统中的所有进程信息(根据CPU占用率排序)
        PID:唯一识别进程的ID号(>0)
         NI优先级:Linux系统中数值低,优先级高(-20 - 19)  Windows系统中数值高,优先级高
         进程状态: 
             R   运行态/就绪态
             S   睡眠态/可唤醒等待态
             D   不可唤醒等待态
             T   暂停态
             Z   僵尸态
             X   结束态
q退出
    2.nice
       以指定优先级来运行进程
      示例:
         nice -n 优先级 要执行的集成任务
      renice 
       重新设定一个正在运行的进程的优先级
       
       示例:
         renice -n 优先级 进程PID 
    3.kill
       杀死指定的进程任务
      示例:
         kill -9 进程PID 
      killall 
       杀死进程名对应的所有进程任务
      示例:
         killall -9 进程名 
    4.ps -ef 
       查看当前时刻所有进程的信息
PPID:父进程的ID号
ps -ef | grep a.out 通过管道将前面命令的输出作为面命令的输入
    5.pstree
       查看进程树关系
    6.ps -aux 
       查看当前时刻的进程信息
    7.    ./a.out &
       将a.out任务放在后台执行
     
     8.jobs
       查看一个终端下后台执行的所有任务
     
     9.fg 编号
       将后台任务放到前台执
进程的创建
     
 
32bits:
一个进程在运行时,操作系统会为该进程分配 0 - 4G 虚拟内存空间,分为文本段、数据段、系统数据段
    文本段:
       也称为文本区,存放代码和指令
     
     数据段:
       也称为数据区,可以细分为:
             1.字符串常量区
             2.未初始化全局变量/静态变量
             3.已初始化全局变量/静态变量 
     
     系统数据段:
       包含 堆区(大概几G):1,程序员手动管理,空间要自己malloc和free
2,堆的增长方向是自低向高
栈区(基本就是8MB):1,局部变量存放在栈区
2,未经初始化的随机值
3,代码执行到变量定义的时候开辟空间
4,超过变量作用域回收空间
5,栈的增长方向自高向低

4.进程中虚拟地址和物理地址的关系
     1. 0 - 4G虚拟内存空间只有一个
     2. 实际物理地址中每个进程空间独立
     3. 通过MMU内存映射单元,单一个进程执行时,将物理地址中的数据加载到虚拟地址中运行
进程的调度
     1.常见的调度算法:
       1.先来先执行,后来后执行
       2.高优先级调度算法
       3.时间片轮转调度算法
       4.多级队列反馈调度算法
       5.负载均衡调度算法
      时间片:
         1.CPU在一个任务中的运行时间称为一个时间片
2.宏观并行,微观串行
    3.进程的状态:
         R     运行态、就绪态 
         S     睡眠态/可唤醒等待态 
         D     不可唤醒等待态 
         T     暂停态
         Z     僵尸态
         X     结束态
进程相关函数接口
     1.进程的创建 
       fork 
       pid_t fork(void);
       功能:
         创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程称为新进程的父进程
       参数:
         void 缺省
       返回值:
         成功子进程返回0 
         父进程返回子进程的PID 
         失败返回-1 
父进程调用fork创建子进程,子进程拷贝父进程的文本段、数据段、系统数据段 ,除了内核不拷贝。
宏观并行,微观是切换进行,具体根据情况。
      getpid
       pid_t getpid(void);
       功能:
         获得调用进程的PID号
       
       getppid
       pid_t getppid(void);
       功能:
         获得调用进程的PPID,获得父进程的PID
  2.exit
     void exit(int status);
     功能:
       让进程结束
     参数:
       status:进程结束的状态
     返回值:
       缺省
    exit在主函数中使用和return效果一致
     exit会刷新缓存区
    _exit
     void _exit(int status);
     功能:
       让进程直接结束,不会刷新缓存区。
     参数:
       status:进程结束的状态
     返回值:
       缺省
进程的消亡
  1.僵尸进程:
     进程代码执行结束,空间没有被回收,称为僵尸进程
   2.如何避免产生僵尸进程?
     1.让父进程先结束
     2.让父进程回收子进程空间
  3.孤儿进程:
       进程的父进程先结束,此时该进程称为孤儿进程,被系统进程收养,进程再结束时,会被系统进程回收进程空间
8.wait 
   pid_t wait(int *wstatus);
   功能:
     回收子进程空间
   参数:
     wstatus:存放子进程结束状态空间的首地址
   返回值:
     成功返回回收到的子进程PID
     失败返回-1 
  1.wait函数具有阻塞功能
   2.wait函数具有同步功能
  WIFEXITED(wstatus)
   进程是否正常退出 
  WEXITSTATUS(wstatus)
   进程结束状态值
  WIFSIGNALED(wstatus)
   进程是否被信号杀死
  WTERMSIG(wstatus)
   获得杀死进程的信号编号
实例:创建九个子进程

exec函数族
     extern char **environ;
    int execl(const char *path, const char *arg, ...
                     /* (char  *) NULL */);  : 
     int execlp(const char *file, const char *arg, ...
                     /* (char  *) NULL */);
     int execle(const char *path, const char *arg, ...
                     /*, (char *) NULL, char * const envp[] */);
     int execv(const char *path, char *const argv[]);
     int execvp(const char *file, char *const argv[]);
     int execvpe(const char *file, char *const argv[],
                     char *const envp[]);
执行结束子程序整个代码也会结束。
    功能:
         利用进程空间执行另外一份代码
     
     l:参数以列表形式传递
     v:参数以指针数组形式传递
     e:更新环境变量
     p:在系统指定目录下查找文件

    getenv
     char *getenv(const char *name);
     功能:
         获得环境变量名对应的值,也就是平时的PATH     
     
     setenv
     int setenv(const char *name, const char *value, int overwrite);
     功能:
         设置环境变量的值
     参数:
         name:环境变量名
         value:环境变量的值
         overwrite:非0 覆盖
                   0   不覆盖
     返回值:
         成功返回0 
         失败返回-1 

