多任务编程

一、进程process 过程(动态的过程)
1.1、进程

进程是程序的一次执行过程,是系统进行资源分配和处理机调度的一个独立单位

  •         进行中的程序--正在运行中的程序
  •         进程---程序的一次执行的过程
  •         进程是程序的一个实例
  •         程序 加载 到内存 运行起来 成为了 进程。 
  •         一个程序 可以 对应到多个进程

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

1.2、进程 vs 程序

1、./a.out 程序都在内存里面运行、程序跑起来的在内存变为进程

  • 一个程序可以对应多个进程
  • 程序 --- 静态---硬盘
  • 进程---动态---内存

 2、程序

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

程序 
./a.out 

进程: (占用 cpu ,内存相关的资源 ,IO资源(屏幕,键盘))

栈 
堆   //程序运行过程中动态的内存   
bss  --- 未初始化的数据  |           
data --- 初始化了的数据  |  静态区 | ---数据 
text --- 正文段(代码段)

3、区别

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

1.3、为什么需要进程?

1、单道程序

main()
{
    while(1)
    {
        
        
    }
} //单道 程序 

2、多道程序

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

   进程1->| 4G空间 
   进程2->|--- [CPU]--> 
   进程3->|

为了描述和管理 程序运行 动态过程

进程(操作系统为了 管理程序的动态运行提出了进程的概念)进程调度

1.4、PCB(process control block)进程控制块

1.5、进程的组成

程序的构成:代码+数据
  [栈            ]
  [堆            ]    
  [静态区(全局区)] //data --已初始化的 全局变量 或 静态变量 
                   //bss  --未初始化的 全局变量 或 静态变量
  [字符串常量区  ]
  [代码区        ] //text (正文) --代码段

data 初始化数据,bss 未初始化

可执行程序 a.out

bss /datat/text/ c程序编译就定下来

堆/栈/bss/data/text ./a.out 之后就产生了堆栈,其他三个不消失

进程 = PCB+进程的实体(也即是各个段)

PID(process id)每个进程都有唯一的id

1.6、进程的生命周期

具体解释 

  • 宏观并行,微观串行(cpu还是一个一个串进去的)
  • 深度(不可中断态)、浅度(可中断),暂停用于代码调试阶段
  • 僵尸态,进程的实体运行结束。

2、Linux 系统进程的状态

3、查询进程相关命令

    1.ps aux | grep 进程名 

    查看进程相关信息

R ------- 运行或可运行 ----就绪态

S ---------可中断的睡眠态

D-----------不可中断睡眠态

T ------------暂停态

Z -------------僵尸态

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

    3.kill和killall发送一个信号

  •     kill PID
  •     发送信号+PID对应的进程,默认接收者关闭
  •     kill -9 进程PID号 
  •     kill -l //查看信号列表 

  •  killall -9 进程名
  •  发送信号 进程名对应的所有进程
  •  killall a.out //通过 进程名 发信号     
  •  kill 信号编号 进程I
  • Linux进程命令 
  • pstree -sp(查看指定的) pid号查看父子进程的关系(以树形图的方式展现) 

ps-elf 查看父子id的号

ps aux (查看某个进程的id号以及状态) |(管道) grep表示搜素(程序名)

二、进程的创建
2.1、进程的创建

fork() // 叉子 - 树杈

  • 功能;创建一个子进程,通过复制他调用的进程(复制父进程(调用函数))子进程和父进程分别在独立的内存空间
  • 返回值类型 pid_t
  • 返回值是-1 代表创建子进程失败
  • 成功:
  • 在父进程中 返回了 子进程的pid 号
  • 在子进程 返回了 0

2.2、注意点
  • pid 号 实际上是一个非负 整数
  • 最小的pid号---------1
  • 复制主要是复制他的实体
  • 返回值是在父进程里面返回一次,在子进程里面返回一次。
  • 32位的平台,每个进程拥有独立4G(3G的用户空间,1G的内核空间)站在进程角度。

  • 每个进程运行在个自己独立的4G内存空间中。

  • 父子进程间,数据相互独立,不受影响。
  • 父子进程运行的顺序,不确定(谁先运行),取决于操作系统-----先调度谁。
  • 僵尸态的状态,尽可能多的避免,对系统资源来说是一种消耗
  • 2^32 // 1024
  • 重定向 >: ./a.out > log.txt(本来在屏幕上输出,但是现在让输出到文本)
2.3、容易出错点

在被系统收养之后,自动变成后台程序,因此前台给其CTRL+c 对齐没有影响。

被init收养之后,不管咋结束都变成僵尸态,希望有人来关心态,回收资源。

多个fork之间的关系,总共是 2^n,生成 2^n -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值