当前位置: 首页 > news >正文

嵌入式学习(18)---Linux文件编程中的进程

一、进程的概念

进程:(用来描述 程序动态执行的过程,方便操作系统管理的)
    进行中的程序 
    程序的一次执行过程 (内存 + CPU)
    程序的实例    
    程序  ----加载到内存----> 进程

应用场景:
   实现并发 
      同一时刻 同时发生 
   
   并行 
      一并前行 

进程 的组成:
   
   进程怎么来的?
   
   程序 ---- 加载到内存 ----> 进程 
   
   程序的组成:
    
   程序 = 代码 + 数据 
   
   程序 = 代码区 + [栈|堆|全局区|字符串常量区]

   进程 = 代码|data|bss|堆|栈 + pcb     //pcb (process control block) 进程控制块 

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

进程的调度算法 
   1.公平 效率
   2.时间片轮转 
   3.先来先服务 
 

进程的状态:

PROCESS STATE CODES
       Here are the different values that the s, stat and state output specifiers 
       (header "STAT" or "S") will display to describe the state of a process:

               D    uninterruptible sleep (usually IO)      //不可中断的睡眠态
               R    running or runnable (on run queue)  // 运行态
               S    interruptible sleep (waiting for an event to complete)//可中断的睡眠态
               T    stopped by job control signal            // 暂停态
               t    stopped by debugger during the tracing
               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

       For BSD formats and when the stat keyword is used, additional characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
               +    is in the foreground process group

     R  --- 运行态 
     D  --- 不可中断 睡眠态
     S  --- 可中断 睡眠态 
     T  --- 暂停态 
     Z  --- 僵尸态 
 

二、进程管理的命令及运用

1、进程管理的命令

top  //类似Windows的下任务管理器 

ps -eLf | head -1   //可以观察到 PID PPID等
    eg:

     F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD

ps -eLf | grep a.out  //查看a.out 信息 //可以观察到 PID PPID
ps -aux | grep a.out  //可以查看进程 的状态 


pstree  //进程树  

pstree -sp pid号 //查看指定的进程的关系

kill //给进程发信号 
     kill + 信号 + 程序的pid号    
    eg:
       kill -9 5266
kill -l  //查看可以发送的信号 

2、进程的运用

linux下编程 使用进程:
1.创建
2.进行运行 
3.进程结束 

1.创建 
fork()  

       pid_t fork(void);
       功能:
          创建子进程 (通过复制调用进程)
       参数:
          void 
       返回值:
          成功 
              在父进程中 返回子进程的pid号
              在子进程中 返回0

          失败 
             -1 && errno 被设置
             
     pid号:
          pid 本质上就是一个数值 
          正整数 1 

    
    叉子
    一次调用,会返回两次。
    子进程先运行和是父进程先进程,顺序不确定。
    变量不共享。
    
    子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
    
    此时,父子进程各自拥有独立的4g内存空间 (32位的系统)
    
    功能:
          通过该函数可以从当前进程中克隆一个同名新进程。
          克隆的进程称为子进程,原有的进程称为父进程
          子进程是父进程的完全拷贝
          复制之后,
          子进程和父进程各自拥有自己的用户空间(进程空间)
          子进程和父进程的执行过程是从fork函数之后执行。
          
          子进程与父进程具有相同的代码逻辑。
          
    返回值:int 类型的数字。
            在父进程中:成功 返回值是子进程的pid号 >0
                        失败 返回-1;
            在子进程中:成功 返回值 0
                        失败 无
            
     注意:
      1.创建好之后,父子进程的运行顺序是不确定 ---全部取决于操作系统的调度 
      2.他们的数据相互独立,父进程或子进程对数据的修改,不会相互影响,只会对各自造成影响

操作: 
      将父进程杀死         //使用kill停止父进程
      init进程(1)   //UNIX环境高级编程(init -- systemd)
       
 init(1)───gnome-terminal-(2554)───bash(3336)───a.out(5934)───a.out(5935)


 杀死父进程:     init(1)───a.out(5935) 

    子进程还在 ,父进程不在 ---- 孤儿进程 
                             ---- 此时由init进程 收养 
                             
      结束子进程,父进程还在,但是父进程并没有对子进程"收尸",会占用硬盘空间
       
    特殊:
      孤儿进程 
           子进程 还在,父进程不在
      僵尸进程 
          子进程 结束,父进程还在,且父进程并未"收尸"
          僵尸态进程有危害 

eg:创建n个子进程

相关文章:

  • 代码随想录算法训练营第六天| 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数 、1. 两数之和
  • 《Kettle保姆级教学-性能调优,抽取速率提升800%》
  • java网络编程02 - HTTP、HTTPS详解
  • 若依-@Excel新增注解numberFormat
  • 【SFRA】笔记
  • 【可实战】Linux 常用统计命令:排序sort、去重uniq、统计wc
  • idea连接gitee完整教程
  • 精通特征选择:过滤器方法提升机器学习模型的技巧
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • docker中pull hello-world的时候出现报错
  • javaSE学习笔记20-线程(thread)的状态以及控制
  • Day6 25/2/19 WED
  • Win10下安装 Redis
  • ssh免密登录配置
  • 【前端】使用WebStorm创建第一个项目
  • 【笑着写算法系列】位运算
  • Python常见面试题的详解13
  • Linux | 进程控制(进程终止与进程等待)
  • 鱼皮面试鸭30天后端面试营
  • MySQL 如何使用EXPLAIN工具优化SQL
  • 央行行长详解降息:将通过利率自律机制引导商业银行相应下调存款利率
  • 心期末后有人传——《钱谦益年谱长编》在钱氏故里首发
  • 医生李某某饮酒上班?重庆长寿区人民医院:正在调查,将严肃处理
  • 申活观察|人潮涌动成常态,豫园为何常来常新?
  • 长三角铁路持续迎五一出行高峰:今日预计发送旅客418万人次
  • AI把野史当信史?警惕公共认知的滑坡