您的位置:首页 > 其它

进程的相关知识

2016-05-13 23:25 183 查看
程序和进程的区别:

程序是静态的,就是我们通常编写的代码

进程是动态的,完成对程序的一次执行,执行完成该进程就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]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: