【操作系统】多线程和多进程的管理
来源:互联网 发布:手机倒啤酒软件 编辑:程序博客网 时间:2024/06/07 20:24
一、实验目的
加深对进程概念的理解,明确进程与线程的区别。
掌握Linux进程创建和撤销的方法,进一步认识并发执行的实质。
了解多线程的程序设计方法。
二、实验项目内容
多进程和多线程
1号进程创建2,3号两个进程
2号进程创建两个线程Thread1,Thread2
Thread1:求(1~n)之间的素数
Thread2:生成Fibonacci序列
3号进程创建4,5号两个进程
4号进程执行系统命令,ls,ps,cp等
5号进程执行一个用户编写的可执行文件
每个进程输出自己的进程ID和父进程的进程ID,观察分析,并画出程序的进程树结构。
三、实验程序代码:
#include <stdio.h>#include <math.h>#include <sys/types.h> #include <sys/wait.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>/*** Attention to add -lpthread and -lm when compile* eg : gcc process.c -lpthread -lm -o process*///The thread to find the prime number between (1~n)void *MyThread1(void* arg){ int n; //Get the resolve range printf("input the value of n:\n"); scanf("%d",&n); printf("the prime number between 1~%d is:\n",n); for(int m=2;m<=n;m++) { if (m<=3) { printf("%4d",m); continue; } int k=sqrt(m); for(int i=2; i<=k; i++) { // printf("m: %f\n",k); if(m%i==0) break; if(i>=k) printf("%4d",m); } } printf("\n thread1 exit!\n"); pthread_exit(0);}//The thread to generate Fibonacci sequencesvoid *MyThread2(void* arg){ int fib0=0,fib1=1,fib2,i,N; printf("input fib value N:\n"); scanf("%d",&N); printf("the fib sequences as following:\n"); for (int i = 0; i < N; i++) { if (i==0) { printf("0"); } else if (i==1) { printf("1"); } else { fib2=fib0+fib1; printf("%d",fib2 ); fib0=fib1; fib1=fib2; } } printf("\n thread2 exit!\n"); pthread_exit(0);}//No.2 process create two threadsint createThread(){ int ret1=0,ret2=0; //Define the id of thread pthread_t id1,id2; //Create thread1 ret1=pthread_create(&id1,NULL,MyThread1,NULL); if (ret1) { printf("Create pthread error!\n"); return 1; } //Create thread2 ret2=pthread_create(&id2,NULL,MyThread2,NULL); if (ret2) { printf("Create pthread error\n"); return 1; } //Mainthread wait for childthread pthread_join(id1,NULL); pthread_join(id2,NULL); printf("main thread exit!\n"); return 0;}//The Function of N0.4 and No.5void childProcessfunc(int i){ switch(i) { case 4: printf("\nThis is NO.4 process, ID is %d, parent ID is %d, will create 2 thread\n",getpid(),getppid()); printf("\nExcute system command ls:\n"); system("ls"); printf("\nExcute system command ps:\n"); system("ps"); printf("\nExcute system command cp:\n"); system("cp sayhello.c sayhello.cpp"); break; case 5: printf("\nThis is NO.5 process, ID is %d, parent ID is %d, will create 2 thread\n",getpid(),getppid()); printf("\nCarray out executable program:\n"); system("./sayhello"); break; } exit(0);}//No.3 process create two child process, N0.4 and No.5int createProcess(){ int i; for (int i = 4; i <= 6; i++) { pid_t child=fork(); //create process failed if (child==-1) { printf("Error hanppened in fork function!\n"); return 0; } //exert function when success else if(child==0) { childProcessfunc(i); } } for (int i = 0; i < 2; i++) { //Parent process waits child process pid_t tempPid=wait(NULL); printf("The process %d exit\n", tempPid); } return 0;}//The Function of N0.2 and No.3void mainProcessfunc(int i){ switch(i) { case 2: printf("\nThis is NO.2 process, ID is %d, parent ID is %d, will create 2 thread\n",getpid(),getppid()); createThread(); break; case 3: printf("\nThis is NO.3 process, ID is %d, parent ID is %d, will create 2 thread\n",getpid(),getppid()); createProcess(); break; } exit(0);}int main(){ int i; //Create two child process, No.2 and No.3 for (int i = 2; i < 4; i++) { pid_t child=fork(); if (child==-1) { printf("Error happened in fork function!\n"); return 0; } else if(child==0) { // printf("process Id is %d:\n",getpid()); mainProcessfunc(i); } } for (int i = 0; i < 2; i++) { //Parent process waits child process pid_t tempPid=wait(NULL); printf("\nThe process %d exit\n", tempPid); } //Root process exit printf("\nThe No.1 root process Id is %d exit\n",getpid()); return 0;}
注:在编译命令中添加-lpthread和 -lm ,-lpthread是表示要连接到pthread的库是这里省略的lib,因为在求素数算法中使用math库中sqrt函数,需要用到math.h,则加上 -lm。
四、实验结果
阅读全文
0 0
- 【操作系统】多线程和多进程的管理
- 多线程和多进程的管理
- 操作系统------多线程与多进程的区别和应用场景
- 操作系统的进程管理
- 操作系统-进程和线程管理
- 操作系统的课程设计《进程管理》
- 计算机操作系统的进程管理
- 关于操作系统多进程多线程问题的小的总结
- 操作系统------进程管理(进程)
- 操作系统的进程、多线程、内存管理、垃圾回收、以及缓冲等方面
- 操作系统中的进程管理与Java中的多线程
- 操作系统(二):进程和线程管理_1_进程、线程
- 操作系统进程管理实验
- 操作系统之进程管理
- 操作系统之进程管理
- 操作系统 进程管理
- 操作系统--进程管理
- 操作系统学习-进程管理
- HDU 5094 题解(状压BFS)
- sublime 安装
- 主从同步常用指令
- Gradle配置解决下载速度慢问题
- 懒人改造别人的工具eternalblue
- 【操作系统】多线程和多进程的管理
- 年度总结
- HTTP联机接口测试的交易录放-录
- 关于Java的String字符串常量的长度问题
- 【JZOJ 4345】【WC2016模拟】Fountain
- [转载]省选学习算法(补坑记录)
- 从 webpack 到全面拥抱 Parcel #1 探索 Parcel
- CGlib动态代理复习
- C++内存错误检测工具