int main() {int i,j,k; int oldpri,newpri;
int pid=fork(); //new first thread if(pid==0) //first thread
5
(完整word版)操作系统实验报告-观察进程的并发性
{
printf(\"parentpid is %d\\n”,getppid());
oldpri=getpriority(PRIO_PROCESS,getpid()); printf(”first thread old priority=%d\\n\); newpri=nice(5);
printf(”first thread new priority=%d\\n”,newpri); for(j=0;j〈5;j++) { }
exit(0);
printf(\"first:b\\j=%d\\n”,j); sleep(1);
}
else if(pid>0) //main thread {
int pi=fork();//new second thread if(pi==0) //second thread {
nice(2);
for(k=0;k〈5;k++) {
printf(\"second:c\k=%d\\n\;
6
(完整word版)操作系统实验报告-观察进程的并发性
}
sleep(1);
exit(0); }
else if(pi>0) //main thread {
for(i=0;i<5;i++)
{
printf(”main:a\\i=%d\\n”,i); sleep(1);
}
waitpid(pid,0,0); //wait first thread over
waitpid(pi,0,0); // wait second thread over
}
printf(\"main thread exit\\r\\n\"); exit(0);
else //new thread failed {
perror(”function fork() error!\\r\\n\"); exit(1);
}
}
7
(完整word版)操作系统实验报告-观察进程的并发性
else //new thread failed {
perror(\"function fork() error!\\r\\n”); exit(1); }
return 0; }
五、调试运行结果:
1) 进程之间的并发性结果
8
(完整word版)操作系统实验报告-观察进程的并发性
父子进程并发运行的结果
2) nice函数的应用
9
(完整word版)操作系统实验报告-观察进程的并发性
运用nice函数前后结果对比
六、所遇问题及解决方法:
1. 对Linux的操作不是很熟悉,有请老师辅导。
2. nice()函数之前没接触过,上网找了一些资料,对nice函数有了一定的了解,在程序中我是通过改变子进程1和子进程2的优先级,并且输出子进程1优先级改变前后的大小。最后运行程序,体会nice()函数的作用。观察到在nice()函数应用前后,输出字符的顺序确实有一定的改变。体会到优先级的数值越小优先级越高,数值越大优先级越低。
七、实验总结:
1. 通过这次试验,对linux的操作有了进一步的了解,深深体会到, fork()执行一次但有两
个返回值。在父进程中,返回值是子进程的进程号;在子进程中,返回值为0。因此可通过返回值来判断当前进程是父进程还是子进程。使用fork函数得到的子进程是父进程的一个复制品,它从父进程处复制了整个进程的地址空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进程组号,当前工作目录,根目录,资源,控制终端等.而子进程所独有的只是它的进程号,资源使用和计时器等。在fork()函数返回后,父子进程会根据不同的返回值执行不同的代码,一般是通过if语句来判断是从父进程还是子进程返回。
2. 当首次调用新创建的子进程时,其入口一般在fork()函数返回等于零的分支里。
3. nice函数在当前程序运行优先级基础之上调整指定值得到新的程序运行优先级.优先级的范
围为—20 ~ 19 等40个等级,其中数值越小优先级越高,数值越大优先级越低,既—20
10
(完整word版)操作系统实验报告-观察进程的并发性
的优先级最高, 19的优先级最低。若调整后的程序运行优先级高于—20,则就以优先级—20来运行命令行;若调整后的程序运行优先级低于19,则就以优先级19来运行命 令行。若 nice命令未指定优先级的调整值,则以缺省值10来调整程序运行优先级,既在当前程序运行优先级基础之上增加10.
11