进程的学习
进程控制开发纲要
基本概念
定义:相对于程序而言,它是一个动态的过程,是资源分配的最小单位,包括动态的创建,调度消亡的整个过程,
进程控制块:从系统的角度,通过进程控制块来描述进程,它包括描述信息,控制信息,以及资源信息,每一项是一个task_struct结构,include/linux/sched.h
进程控制块是进程存在的唯一标识,一般把PCB放在操作系统专门开辟的PCB区内
进程实体:进程控制块,程序段,数据段
进程的标识:PID,PPID
getpid()
getppid()
进程的运行状态:
执行态
就绪态
等待态
这三个状态通过时间片,调度,中断进行相互的转换。
Linux进程的结构:进程之间是并行的,互不干扰,运行在独立的虚拟地址空间
有以下三个段
数据段:存放全局变量,常数及动态数据分配的数据空间
代码段:程序的代码数据
堆栈段:子程序的返回地址,子程序的参数及程序的局部变量
进程运行的模式
用户空间
内核空间:执行机器的特权指令,root用户也不可干扰
进程的管理:
进程的启动:手工启动,调度启动
进程的调度:包括以下几个方面:对进程的操作,改变优先级,查看进程状态
常用命令
ps:查看进程的状态
top:动态显示进程
nice:按指定的优先级运行
renice:改变正在运行进程的优先级
kill:关闭进程
crontab:用于安装,删除或者列出用于驱动cron后台进程的任务
bg:将挂起的进程放到后台去操作
进程控制编程
fork()是创建进程的唯一函数,用于从已知的进程创建一个新进程,两个进程间是父子关系,子进程完全复制了父进程的
地址空间,进程上下文,代码段,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进程组号,当前工
作目录,根目录,资源限制,控制终端等。而子进程独有进程号,资源使用,计时器等
函数的返回值:父进程中返回子进程的进程号,子进程返回0
缺点:系统开销比较大,执行速度降低
函数说明:
头文件:sys/types.h
unistd.h
原型: pid_t fork(void)
返回值:0 子进程
>0 父进程
-1 出错
例程
/*fork sample*/
#include
#include
#include
#include
int main(void)
{
pid_t result;
int ret;
result = fork();
if(result<0)
{
printf("fork error\n");
}
else if(result == 0)
{
printf("child process!\nThe pid is %d\nThe return value is %d\n",getpid(),result);
}
else
{
printf("father process!\nThe pid is %d\nThe return value is %d\n",getpid(),result);
}
return result;
}
注意:fork使用一次就产生一个进程,在循环语句在要小心
vfork 也可创建进程,但不产生副本,通过充许父子进程可访问相同物理内存从而伪装驿进程地址空间的真实拷贝,当子进程
需要改变内存中数据时才复制父进程,这就是著名的写操作复制。
阅读(557) | 评论(0) | 转发(0) |