进程的相关知识

程序和进程的区别:

程序是静态的,就是我们通常编写的代码
进程是动态的,完成对程序的一次执行,执行完成该进程就over。

进程是拥有资源的最小单位

linux是用命令来管理进程的,如: ps, at, top, kill, pstree, nice, renice等

进程由三个部分组成:

进程控制块(PCB)—->描述和控制进程运行的数据结构;主要包含进程标示符,进程控制和调度信息等
代码段—->存放程序代码的数据
数据段—->存放程序的参数以及程序的局部变量,全局变量,常数以及动态数据分配的数据空间

进程的主要特征:

动态性: 进程的实质是程序的一次执行过程, 进程是动态产生,动态消亡
并发性: 可以和其他进程一起并发执行
独立性: 进程是一个能独立运行的基本单位,也是系统分配资源和调度的基本单位
异步性: 进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的,不可预知的速度向前推进

因为进程执行期间的间断性,运行中的进程有三种基本状态:

就绪状态—->资源已经就绪,就等CPU调度
运行(执行)状态—->资源就绪,也得到CPU资源
阻塞状态—->缺少资源

Linux系统启动时处于核心模式,此时只有一个进程,初始化进程(init进程),进程号为1, Linux系统中的所有进程都是由1号i进程直接或间接创建的!

在系统中,默认的最大进程数是512,即系统可同时容纳512个进程个数!

进程的终止:

子进程一旦被创建就与其父进程一起被系统进行调度,子进程运行完成后并不是立即释放所占有的资源(进程控制表项),
而是作为疆尸进程存在于系统,直到父进程正常退出或者调用wait()函数,子进程才彻底终止。

注意:调用了*wait()函数的父进程 会马上阻塞自己,直到wait()函数等到一个子进程变成僵尸进程,wait()就回收该进程的资源,并返回子进程结束状态值*

孤儿进程:就是父进程在子进程over之前over,此时的子进程就变成了孤儿进程,该子进程就会被init进程管理,init进程将控制它退出后的资源回收任务。

产生孤儿进程

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

using namespace std;


int main()
{
    pid_t pid;

    pid = fork();

    if(pid == 0){
        //child
        printf("I am child process, pid = %d\n", getpid());
        sleep(3);
        printf("ppid1 = %d\n", getppid());
    }else if(pid > 0){
        //parent
        printf("I am parent process, pid = %d\n", getpid());
        printf("ppid2 = %d\n", getppid());

    }else{
        printf("errno = %d\n", errno);
        printf("create child error\nd");
    }

    return 0;
}

测试结果:

[root@localhost mine]# g++ fork.cpp -o fork
[root@localhost mine]# ./fork 
I am parent process, pid = 8538
ppid2 = 8353
I am child process, pid = 8539
[root@localhost mine]# ppid1 = 1
^C
[root@localhost mine]# 

产生僵尸进程:

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>

using namespace std;


int main()
{
    pid_t pid;

    pid = fork();

    if(pid == 0){
        //child
        printf("I am child process, pid = %d\n", getpid());
        sleep(3);
        printf("ppid1 = %d\n", getppid());
    }else if(pid > 0){
        //parent
        printf("I am parent process, pid = %d\n", getpid());
        printf("ppid2 = %d\n", getppid());

        int status;
        wait(&status);

    }else{
        printf("errno = %d\n", errno);
        printf("create child error\nd");
    }

    return 0;
}

测试结果:

[root@localhost mine]# ./fork 
I am parent process, pid = 8734
ppid2 = 8353
I am child process, pid = 8735
ppid1 = 8734
[root@localhost mine]# 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值