Linux系统编程(7)多任务编程:进程

一、进程

        进程是正在运行中的程序,或者说是一次程序的执行过程。

        程序是死的,进程是活的,程序是存储在硬盘上的,进程是运行在内存中的,一个程序可以对应多个进程。

        程序加载到内存中就成为了进程。

二、进程的组成部分

  • 代码段:即程序的可执行代码部分。
  • 数据段:包括全局变量、静态变量。
  • :用于动态分配内存。
  • :用于存储局部变量、函数调用时的参数和返回地址等。
  • 进程控制块(Process Control Block, PCB):每个进程在操作系统中都有一个PCB,它记录了进程的各种信息,如进程ID、状态、寄存器状态、调度信息、内存管理信息、文件描述符等。

进程状态

  • 创建:进程正在被创建。
  • 就绪:进程已经准备好,可以运行,但由于CPU资源未分配,暂时未运行。
  • 运行:进程正在执行代码。
  • 阻塞:进程在等待某种事件(如I/O操作完成),暂时不能运行。
  • 终止:进程执行完毕或被强制终止,进入终止状态,等待操作系统回收资源。

Linux系统下对进程状态进行了更细的划分:

僵尸进程与孤儿进程

  • 僵尸进程:当一个子进程终止后,父进程未能及时获取子进程的退出状态,此时子进程会变为僵尸进程。僵尸进程虽然已经终止,但其进程控制块仍然存在,占用系统资源。
  • 孤儿进程:如果父进程先于子进程终止,子进程会变为孤儿进程。孤儿进程通常会被系统的init(32位系统),systemd(64位系统)进程接管,以防止成为僵尸进程。

三、Linux中进程的7种状态:

1. 运行状态(Running or Runnable, R)

  • 描述:进程正在运行或者在运行队列中等待运行。
  • 详情:当进程获得了CPU时间片,它处于“运行”状态。当它在等待CPU时间片(在运行队列中),但尚未实际执行时,它也属于这个状态。

2. 可中断睡眠状态(Interruptible Sleep, S)

  • 描述:进程正在等待某个事件(如I/O操作完成),并且可以被信号中断唤醒。
  • 详情:这通常是进程在等待I/O操作完成时的状态。进程可以通过信号(例如,SIGINTSIGKILL 等)被唤醒,并从睡眠状态转为就绪状态。

3. 不可中断睡眠状态(Uninterruptible Sleep, D)

  • 描述:进程正在等待一个无法中断的系统调用,如等待磁盘I/O操作完成。
  • 详情:在这个状态下,进程无法被信号打断,除非操作完成。通常用于等待一些关键性的系统资源,如磁盘操作。这种状态通常与设备驱动程序相关。

4. 僵尸状态(Zombie, Z)

  • 描述:进程已经终止,但它的父进程尚未读取其退出状态,因而进程的控制块仍然保留在系统中。
  • 详情:僵尸进程占用系统的少量资源(如进程号),但不执行任何任务。它们最终会被系统回收,或者由父进程调用 wait() 系统调用来清理。

5. 停止状态(Stopped, T)

  • 描述:进程被停止运行,通常是因为收到了信号(如 SIGSTOPSIGTSTP)。
  • 详情:停止状态的进程可以通过继续信号(如 SIGCONT)重新恢复运行。调试工具(如 gdb)通常会使用这种状态来暂停进程。

6. 跟踪停止状态(Traced or Stopped, t)

  • 描述:进程正在被调试器(如 gdb)跟踪,此时进程处于停止状态。
  • 详情:这是停止状态的一种特殊情况,表示进程被另一个进程(通常是调试器)控制并停止执行。

7. 任务退出状态(Task Dead, X)

  • 描述:进程即将退出或已经退出,但仍未完全被移除。
  • 详情:这个状态非常罕见,通常不会在 pstop 中看到。它表示进程正在退出,但还未完全清理干净。

操作系统可以同时运行多个进程,即多任务。

内核的功能是完成进程调度

操作系统实际上是宏观并行,微观串行的

四、查询进程相关命令:

1.使用 ps aux | grep 进程名

  • 功能:查看指定进程名的相关信息。ps aux 列出所有进程,grep 进程名 用于筛选出符合条件的进程

2.使用 top

  • 功能top 命令实时显示系统中各进程的资源使用情况,按CPU占用率排序,默认每隔几秒钟刷新一次。

3.kill

  • 功能:发送信号给指定PID的进程,默认信号是 SIGTERM(15),用于请求进程终止
  • kill -9 <PID>:发送 SIGKILL 信号(9),强制终止进程。
  • kill -1:查看信号列表及其编号。
  • killall 可以向指定名称的所有进程发送信号

五、进程编程:

1. fork()

  • 功能:用于创建一个新进程,称为子进程。新进程是当前进程的副本,继承了父进程的大部分环境。
  • 返回值
    • 在父进程中,fork() 返回子进程的PID。
    • 在子进程中,fork() 返回0。
    • 如果创建失败,fork() 返回-1。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值