linux高级编程(进程)(1)

发布于:2024-06-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

进程:

进程的含义?

进程是一个程序执行的过程,会去分配内存资源,cpu的调度

进程分类:
        1、交互式进程
        2、批处理进程   shell脚本 
        3、 守护进程 

进程与程序的区别:

    1)程序是永存,进程是暂时的
    2)进程有程序状态的变化,程序没有
    3)进程可以并发,程序无并发
    4)进程与进程会存在竞争计算机的资源
    5)一个程序可以运行多次,变成多个进程

一个进程可以运行一个或多个程序

进程的作用:

并发并行(各执行各的)

进程的状态:

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

使用了一个结构体pcb(进程控制块),用于存储进程的数据,实现控制进程

(1)运行态(running):进程占有处理器正在运行。

(2)就绪态(ready):进程具备运行条件,等待系统分配处理器以便运行。

(3)阻塞态(blocked):又称为或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。

(4)僵尸态(zombie):子运行完,父没运行完,子进程会以终止状态保持在进程表中,并且会一直在等待父进程读取才能退出。

(5)孤儿态:父运行完,子没运行完,子处于托管状态,加重系统负担

进程的调度,进程上下文切换

内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动
    调度算法, other,idle
                rr,fifo
    宏观并行(从人的视角,程序是多个运行)
    微观串行(从计算机的视角,一次只能运行一行代码,也就是说这一时刻只能运行一个进程)

查询进程相关命令

    1.ps aux

    查看进程相关信息

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

    2.top
    根据CPU占用率查看进程相关信息
    
    3.killall -9 进程名
    发送信号 进程名对应的所有进程
    killall a.out

内存分布:

0-3G,是进程的空间,3G-4G是内核的空间

虚拟地址:
    在逻辑上不存在,即无法成为可供硬件读取的电信号,但实际占有内存空间,保护了程序运行

fork():

    父进程从文件头开始走,子进程从fork的位置开始走

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

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

fork()&&fork()||fork();
    生成几个子进程?5个

首先,fork看做一个变两个,一个父一个子,并且,根据其子进程只会从生成该子节点的fork()开始运行,可以理解为从该节点处开始分叉

这里还要知道逻辑运算符的截断特性(短路特性),(即已经确定结果的值时,不会继续往后运行),给fork加上编号(1&&2||3),

在父进程中运行时:此时1返回值为1,在最上层展开分支;判断2,返回值也为1,在第二层的1后展开分支,||运算的结果此时已经能确定,不会去运行3

注意:此时相当于这个父节点有两个子节点

父进程运行完:

在子进程中运行时:此时1返回值为0,不会去判断2,只会执行3,也就是所有子节点分叉一次

最终结果:

2.getpid

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

3.getppid

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

父子进程的关系:

子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。
    
    在fork之后,一般情况那个会先运行,是不确定的。如果非要确定那个要先运行,需要IPC机制。
    
    区别:
    1)fork的返回值
    2)pid不同