Linux软件编程-进程(1)

发布于:2025-08-15 ⋅ 阅读:(10) ⋅ 点赞:(0)

1.进程的概念

正在运行的程序,其运行过程中需要消耗内存和CPU。
     main.c ---------->a.out ----------------->./a.out
     应用程序         可执行程序                  内存
      硬盘                  硬盘                           cpu

 

     程序和进程的区别
     程序:静态的数据集合,存储在硬盘空间
                程序运行起来可以产生进程;
                一个程序可以产生多个进程

     进程:是一个程序动态执行的过程,需要消耗内存和CPU,
                 进程具备动态生命周期,从产生到调度再到消亡
                 一个进程中也可执行多个程序

                 是操作系统资源分配的最小单位

2.进程的产生

进程产生时,操作系统都会为其分配0-4G的虚拟内存空间。

内核:

1. 文件管理
2. 进程管理
3. 内存管理
4. ...

栈区:

1.保存局部变量
2.函数的形参和返回值
3.保存函数的调用关系(保护现场和恢复现场)

堆区:

1. 由开发人员手动分配
2. 使用完要手动释放

数据区:

data段:1. 已初始化的全局变量 2. 已初始化的静态变量

bss段:1.未初始化的全局变量  2. 未初始化的静态变量(static)-->bss段初始时按位清0

字符串常量区:1. 保存字符串常量   "hello world"

文本区:

1. 存放指令代码   2. 存放常量             eg:'A', 10

3.进程的调度

CPU:数据处理速度快
宏观并行,微观串行

 

cpu调度算法
1、时间片轮询算法
2、先来先服务,后来后服务(任务队列)
3、短作业优先调度
4、高优先级先执行,低优先级后执行

4.进程的状态

操作系统进程进程三态图:

Linux操作系统的进程状态:

 

1.运行态(用户运行态、内核运行态)     R
        正在执行,且被CPU任务调度所执行的进程
2.就绪态    R
        正在执行,没有CPU任务调度执行的进程(只缺少cpu)
3.可唤醒等待态    S
        也称为睡眠态,阻塞等待资源的进程
4.不可唤醒等待态 D
        不想被CPU任务调度所打断的进程任务可以设置为不可唤醒等待态
5.暂停态    T
        被暂停执行的进程
6.僵尸态    Z
        进程执行结束,空间没有被回收

7.结束态    X
        进程执行结束,空间被回收

5. 进程的消亡

   1. 进程执行结束(进程退出)
   2. 回收进程资源空间

 

     僵尸进程:进程退出后,但其资源空间未被父进程回收
               如何避免僵尸进程产生:
                1.  子进程退出后,父进程及时为其回收资源空间
                2.  让该进程成为一个孤儿进程,结束时被操作系统中的系统进程回收

     孤儿进程:父进程先消亡,其对应的子进程成为一个孤儿进程,会被系统进程所收养
                 (守护类的进程)

6. 进程相关命令

      PID:进程的ID号
      PPID :父进程ID号
      父进程:产生子进程的进程称为父进程
      子进程:父进程产生出来的新进程即为该父进程的子进程

 

     1. ps  -aux      查看进程相关参数:PID、状态、CPU占有率、内存占有率
         ps -aux | grep ./a.out
          |  : 管道  :前面命令的输出作为后面命令的输入
          grep : 字符串查找:在输入中查找和后面字符串相关的数据                
     2. top          动态查看进程的相关参数:CPU占有率、内存占有率

     3. ps -ef         查看该进程的ID和父进程ID

     4. pstree         查看进程的产生关系
         pstree -p        查看进程的产生关系(有PID号)

         pstree -sp  进程PID号           查看某个指定的进程的产生关系

     5. kill -信号的编号/信信号的名称  PID         向进程发送信号,让进程的状态发生变化
         kill -l         查看系统支持的信号

eg:杀死一个指定的进程

         kill -9 PID
         kill -SIGKILL PID
         killall -9  进程名称

         有+号表示:前台进程
         无+号表示: 后台进程
         jobs         查看当前终端的后台进程
         fg 后台进程编号         让后台进程切换成前台进程

7.进程相关编程

(1)进程创建

    fork()
    getpid(); 获取当前进程自己的PID号
    getppid():获取当前进程父进程的PID号

 

 头文件:

       #include <sys/types.h>
       #include <unistd.h>

函数接口:

       pid_t fork(void);
       功能:通过拷贝父进程产生一个新的子进程
                   子进程完全拷贝父进程0-3G的虚拟内存空间
                   子进程拷贝父进程PCB(进程控制块)块中的部分内容:PID不拷贝
       返回值:
                    >0 :父进程 ,是子进程的PID号
                    ==0:子进程
                   -1 :出错

注意:
       1. 子进程完完整整拷贝父进程0-3G虚拟内存空间。
       2. 父子进程栈区、数据区、文本区、堆区完全独立,数据不共享
       3. 要想共享数据,需要使用进程间通信方式实现

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char const *argv[])
{
    int *p = malloc(sizeof(int));
    *p = 100;
    pid_t pid = fork();

    if(pid > 0)
    {
        *p = 1000;
        printf("ppid = %d, pid = %d, *p = %d\n",getpid(), pid, *p);
    }
    else if(0 == pid)
    {
        *p = 10000;
        printf("pid = %d, ppid = %d, *p = %d\n", getpid(), getppid(), *p);
    }
    else
    {
        perror("fork error");
    }
    return 0;
}

(2)进程调度

操作系统完成

(3)进程消亡

进程退出:return、exit()相关函数

      1)main中return
      2) exit ()、_exit() :结束一个进程
            exit (0) : 正常退出
            exit (非0) :由于进程产生了某种问题,需要主动退出进程

 


网站公告

今日签到

点亮在社区的每一天
去签到