进程的相关知识
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进程将控制它退出后的资源回收任务。
产生孤儿进程:
测试结果:
产生僵尸进程:
测试结果:
程序是静态的,就是我们通常编写的代码
进程是动态的,完成对程序的一次执行,执行完成该进程就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]#
相关文章推荐
- sql server 提示无法彻底删除_复制-而无法删除数据库或重新配置发布订阅
- 线性表的操作 (1)实现 A= A U B
- 程序员的自我修养 读书笔记01
- 2.网页布局之切切豆腐
- nginx学习笔记之二:nginx作为web server
- 109_飞入飞出效果的集成
- JS学习1简介
- 构建之法阅读笔记03
- 删除对话框练习
- sqlserver修改某列为行号
- (1)Java网络编程----网络基础
- BFS和DFS的差别,BFS实现迷宫最短路径
- 【转】查看java类是从哪个包加载
- 用户描述
- 拨打电话与发送短信功能
- 2、3、4的幂
- R语言 模糊c均值(FCM)算法程序(转)
- [MySQL]去重:DISTINCT
- Ado.Net 通用DB访问类
- ARP数据报格式