Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82075
  • 博文数量: 12
  • 博客积分: 1445
  • 博客等级: 上尉
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 10:12
文章存档

2010年(12)

我的朋友

分类: C/C++

2010-05-20 16:36:59

三,进程控制

1,进程是动态的,程序是静态的。进程有三态,阻塞,就绪,执行,详见操作系统资料。进程创建运行时首先处于就绪态,通过操作系统的调度占用CPU时转为执行态。执行态时间片用完就会转为就绪态。运行态时假如访问某一设备而设备正忙时就会转为阻塞态,一旦设备空闲就会就绪,再有调度时就会转为执行态。

2,进程用进程控制块PCB来描述,它包含了进程的描述信息,控制信息和资源信息,它是进程的一个静态描述。进程有自己的PID,其父进程ID为PPID,启动这个进程的用户的ID为UID。

3,进程互斥是指有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其它要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。

4,操作系统中将一次只允许一个进程访问的资源称为临界资源。进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证各进程互斥的进入各自的临界区。

5,一组并发进程按一定的顺序执行的过程称为进程的同步。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。

6,进程调度就是按一定算法,从一组待运行的进程中选出一个来占有CPU来运行。调度方式有抢占式和非抢占式。调度算法一般有先来先服务,短进程优先,高优先级优先,时间片轮转。

7,死锁就是多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。

8,getpid函数,pid_t getpid(void)
获取本进程ID。
getppid函数,pid_t getppid(void)
获取父进程ID。

9,fork函数,pid_t fork(void)
创建之进程,它被调用一次,却返回两次,可能有三种不同的返回值:
1)在父进程中,fork返回新创建的子进程的PID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值。

10,在fork函数调用之前,只有一个进程在执行,但在这个函数调用之后,就变成两个进程在执行了,这两个进程共享下面的代码段。父子进程的区别在于PID不同。子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。在子进程中对fork调用代码之下的某一变量的操作并不会影响到父进程中该变量的值。一个好的例子见国嵌的视频。

11,vfork函数,pid_t vfork(void)
创建子进程。与fork的区别如下:
1)fork是子进程拷贝父进程的数据段,而vfork是子进程与父进程共享数据段;
2)fork的父子进程的执行次序不确定,而vfork是子进程先运行,父进程后运行。

12,exec函数族
exec用被执行的程序替换调用它的程序。它取代原调用进程的数据代码堆栈段。它与fork的区别如下:
1)fork创建一个新的进程,产生一个新的PID;
2)exec启动一个新程序,替换原有的进程,因此进程的PID不会改变,个人认为一般在fork后的子进程中使用。

13,execl函数,int execl(const char *path, const char *arg1, ...)
参数1为被执行的程序名,完整路径,参数2-n为被执行程序所需的命令行参数,含程序名,以空指针NULL结束。

14,execlp函数,int execlp(const char *file, const char *arg1, ...)
参数1为被执行程序名,不含路径,将从path环境变量中查找该程序,参数2同execl。

15,execv函数,int execv(const char *path, char * const argv[])
参数1是被执行程序名,完整路径,参数2是被执行程序所需的命令行参数组数。

16,system函数,int system(const char *string)
调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数string所代表的命令。个人认为重要且好用,双向应用程序中用的多。

17,wait函数,pid_t wait(int *status)
阻塞该进程,直到其某个子进程退出或者该进程接到了一个指定的信号。如果该进程没有子进程或者它的子进程已经结束,则wait函数会立即返回。参数status若为空则代表任意状态结束的子进程,若不为空则代表指定状态结束的子进程。

18,waitpid函数,pid_t waitpid(pid_t pid, int *status, int options)
waitpid是wait的超集,这有若干选项,如可提供非阻塞的wait功能,也能支持作业控制。参数pid如果大于0则表示只是等待这个pid的子进程退出,其它子进程退出wqit无视依然在等,如果pid为-1则与wait一样。参数status同wait,参数options如果为0则同wait,如为WNOHANG则表示如果由pid指定的子进程不立即可用,waitpid不阻塞,此时返回0。

19,exit/_exit函数, void exit(int status)/void _exit(int status)
此两个函数调用时,进程会无条件的停止剩下的操作,清除PCB,并终止本进程的运行。exit对_exit进行了封装,exit多了之前的的检查文件打开情况,把文件缓冲区内容写回文件等清理IO缓冲的工作。若想保证数据的完整性就一定要使用exit函数。参数status传递进程结束的状态,0表示正常结束,其它表示出现了错误,在实际使用时可以用wait系统调用接收子进程的返回值,从而针对不同的情况做不同的处理。

阅读(2270) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~