一:
定义:
进程是一个具有一定独立功能的程序的一次运行活动。
特点:
动态性,并发性,独立性,异步性
状态图
进程ID
进程ID(PID):标识进程的唯一数字
父进程ID(PPID)
启动进程的用户ID(UID)
进程互斥
是指有若干进程要使用某一共享资源时,任何时刻最多允许一个进程使用,其他必须等待,直到占用该资源者释放了该资源为止。
临界资源
操作系统将一次只允许一个进程访问的资源称为临界资源。
临界区
进程中访问临界资源的那段程序代码称为临界区。
进程同步
一组并发的进程按一定的顺序执行的过程称为进程间的同步。
进程调度
概念:按一定的算法,从一组待运行的进程中选出一个来占有CPU运行。
调度方式:抢占式 非抢占式
调度算法:
l 先来先服务
l 短进程优先
l 高优先级优先
l 时间片轮转法
图表 1时间片轮转法
二:
获取ID
#include<sys/types.h>
#include<unistd.h>
1)pid_t getpid(void)
获取本进程ID
2)pid_t getppid(void)
获取父进程ID
例题:getpid.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
Int main()
{
printf(“PID=%d\n”,getpid()); //获取本程序的ID
printf(“PPID=%d\n”,getppid()); //获取本程序父进程ID
return 0;
}
进程创建—fork
#include<unistd.h>
pid_t fork(void)
功能:创建子进程
fork的奇妙之处在于被调用一次,返回两次,它可能有三种不同的返回值
Ø 在父进程中,fork返回新创建的子进程的PID
Ø 在子进程中,fork返回0
Ø 如果出现错误,fork返回-1
Ø
Ø fork创建了一个新的子进程,虚线的意思是代表这个进程是共享的(代码段共享),不是新开辟的占用另一块内存,还是使用原来的内存。
例题:fork.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>
int main(void)
{
pid_t child;
/* 创建子进程 */
if((child=fork())==-1)
{
printf("Fork Error : %s\n", strerror(errno));
exit(1);
}
else
if(child==0) // 子进程
{
printf("I am the child: %d\n", getpid());
exit(0);
}
else //父进程
{
printf("I am the father:%d\n",getpid());
return 0;
}
}
思考题:count运行结果?
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t pid;
int count=0;
pid=fork();
count++;
printf(“count=%d\n”,count);
return 0;
}
运行结果count=1.
count=1. 而不是2.
子进程的数据空间,堆栈空间都会从父进程那得到一个拷贝,而不是共享。在子进程中对count进行加1的操作,并没有影响到父进程中的count值,父进程中的count值任然为0.
只有代码段是共享的。
Fork PK vfork
区别:
l fork子进程拷贝父进程的数据段
l vfork 子进程与父进程共享数据段
l fork 父,子进程的执行次序不确定
l vfork子进程先运行,父进程后运行
exec函数族
exec用被执行的程序替换调用它的程序。
区别:
fork创建一个新的进程,产生一个新的PID
exex启动一个新的程序,替换原有的进程。因此,此进程的PID不会改变
如图:exec执行时突然启动一个hello程序,则exec会用hello的程序替换掉原来exec中的程序,但是PID不会改变,原来是多少还是多少。
进程等待
#include<sys/types.h>
#include<sys/wait.h>
Pid_t wait (int *status)
功能:阻塞该进程,直到某个子进程退出。
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>
int main(void)
{
pid_t child;
/* 创建子进程 */
if((child=fork())==-1)
{
printf("Fork Error : %s\n", strerror(errno));
exit(1);
}
else
if(child==0) // 子进程
{
printf("the child process is run\n");
sleep(1); //子进程睡眠一秒,但并没有去运行父进程
printf("I am the child: %d\n", getpid());
exit(0);
}
else //父进程
{
wait(NULL); //等到子进程退出,父进程才会运行
printf("the father process is run\n");
printf("I am the father:%d\n",getpid());
return 0;
}
}