操作系统-进程控制
来源:互联网 发布:盗梦侦探知乎 编辑:程序博客网 时间:2024/04/29 01:22
附录1.进程的创建#include<stdio.h>#include<stdlib.h>main(){ int p1,p2;if(p1=fork()) /*父进程创建成功*/ putchar('b');else{ if(p2=fork()) /*父进程创建成功*/ putchar('c'); else putchar('a'); /*子进程执行*/}}2.进程的互斥1>同步#include<stdio.h>#include<stdlib.h>main(){int p1,p2,i;if(p1=fork()){ for(i=0;i<500;i++)printf("parent%d\n",i); wait(0); /* 保证在子进程终止前,父进程不会终止*/exit(0); /* 结束该进程*/}else{ if(p2=fork()){ for(i=0;i<500;i++) printf("son %d\n",i); wait(0); /* 保证在子进程终止前,父进程不会终止*/exit(0); /* 向父进程信号0且该进程退出*/} else{ for(i=0;i<500;i++) printf(“grandchild %d\n",i); exit(0);}}}2>互斥 #include<stdio.h>#include<stdlib.h>main(){int p1,p2,i;if(p1=fork()){ lockf(1,1,0);/*对父进程进行加锁,实现互斥*/ for(i=0;i<500;i++) printf("parent %d\n",i); lockf(1,0,0);/*对父进程进行解锁*/ wait(0); /* 保证在子进程终止前,父进程不会终止*/ exit(0); /* 结束该进程*/}else { if(p2=fork()){ lockf(1,1,0);/*对父进程进行加锁,实现互斥*/ for(i=0;i<500;i++) printf("son %d\n",i); lockf(1,0,0);/*对父进程进行解锁*/ wait(0); /* 保证在子进程终止前,父进程不会终止*/exit(0); }else{ lockf(1,1,0);/*对子进程进行加锁,实现互斥*/ for(i=0;i<500;i++) printf("grandchild %d\n",i); lockf(1,0,0);/*对子进程进行解锁*/ exit(0);} }}3.进程的软中断通信#include<stdio.h>#include<signal.h>#include<unistd.h> void waiting(),stop(),alarming();int wait_mark;main(){int p1,p2;if(p1=fork()) /*创建子进程p1*/{if(p2=fork()) /*创建子进程p2*/{wait_mark=1;signal(SIGINT,stop); /*父进程接收到^c信号,转stop*/signal(SIGALRM,alarming);/*接受SIGALRM,并调用alarming方法 waiting(); while (wait_mark!=0);kill(p1,16); /*向p1发软中断信号16*/ kill(p2,17); /*向p2发软中断信号17*/ wait(0); /*等待子进程p2,实现同步*/wait(0); /*等待子进程p1,实现同步*/printf("parent process is killed!\n");exit(0); }else {wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN); /*子进程忽略 ^c信号*/while (wait_mark!=0); lockf(1,1,0); /*为子进程加锁,实现互斥*/printf("child process2 is killed by parent!\n");lockf(1,0,0); /*为子进程解锁*/exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN); /*忽略^c信号*/while (wait_mark!=0)lockf(1,1,0); /*为子进程加锁,实现互斥*/printf("child process1 is killed by parent!\n");lockf(1,0,0); /*为子进程解锁*/exit(0);}}void waiting(){sleep(5);if (wait_mark!=0) kill(getpid(),SIGALRM); /*获得想要中断的进程号,并返回SIGALRM*/}void alarming(){wait_mark=0;}void stop(){wait_mark=0;}4.进程的管道通信#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ){ int fd[2]; /*为管道定义输入端和输出端*/char outpipe[100],inpipe[100];pipe(fd); /*创建一个无名管道*/while ((pid1=fork( ))==-1); /*进程创建失败*/if(pid1==0) {lockf(fd[1],1,0); /*fd[1]写入端加锁*/sprintf(outpipe,"child 1 process is sending message!"); /*将数据放入定义好的缓冲区数组 outpipe内*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/sleep(5); /*自我阻塞5秒,让所显示的内容休眠5秒钟,即等待5秒 钟再显示。子进程pid1和子进程pid2也能对管道进行操作, 因为他们同属于共同的管道共同共享资源*/ lockf(fd[1],0,0); /*写入端解锁*/ exit(0); }else {while((pid2=fork( ))==-1); if(pid2==0){ lockf(fd[1],1,0); /*fd[1]写入端加锁*/ sprintf(outpipe,"child 2 process is sending message!"); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); /*实现进程间的同步*/ read(fd[0],inpipe,50); /*从fd[0]端口读出50字节的数据送到inpipe指向的缓冲 */ printf("%s\n",inpipe); wait(0); read(fd[0],inpipe,50); printf("%s\n",inpipe); exit(0); } }}5.进程间消息的创建、发送和接收#include <stdio.h> #include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75 /*定义关键词MEGKEY*/struct msgform /*消息结构*/{long mtype;char mtexe[100]; /*文本长度*/}msg;int msgqid,i;void CLIENT( ){int i;msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*通过关键字获得队列*/for(i=10;i>=1;i--){ msg.mtype=i; printf("(client)sent\n"); msgsnd(msgqid,&msg,1030,0); /*发送消息msg入msgid消息队列,1030 为消息的长度*/}exit(0);}void SERVER( ){ msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建消息队列*/ do { msgrcv(msgqid,&msg,1030,0,0); /*从队列msgid接受长度为1030的消息msg*/ printf("(server)receive\n"); }while(msg.mtype!=1); /*消息类型为1时,释放队列*/ msgctl(msgqid, IPC_RMID,0); /*删除msgqid的消息队列*/}main(){ if(fork()) {SERVER(); /*创建父进程*/ wait(0);}else CLIENT( ); /*创建的子进程*/}6.进程共享存储区的创建、附接和断接#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#define SHMKEY 75 /*定义共享区关键词*/int shmid,i;int *addr; CLIENT(){int i;shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT); /*获取共享区,长度1024,关键词 SHMKEY*/addr=shmat(shmid,0,0); /*获取共享区起始地址addr*/for(i=9;i>=0;i--) {while(*addr!= -1); printf("(client)sent\n"); /*打印(client)sent*/*addr=i; /*把i赋给addr*/}exit(0);}SERVER(){ do{while(*addr = =-1);printf("(server)received\n%d",*addr); /*服务进程使用共享区*/if(*addr!=0)*addr=-1;} while(*addr); wait(0);shmctl(shmid,IPC_RMID,0); /*撤销共享存储区,归还资源*/} main(){shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享区*/addr=shmat(shmid,0,0); /*共享区起始地址为addr*/*addr=-1;if(fork()){ SERVER();}else{ CLIENT();} }7.处理器调度 #include<stdio.h>#include<stdlib.h>#include<time.h>struct PCB *head,*tail;//这里是全局的int global_time = 0; //全局时间 struct PCB{char name[10]; //进程名字struct PCB *next; //下一个PCB指针int run_time; //运行时间int priority; //优先级char status; //目前状态};struct PCB* initPCB(struct PCB *p, int i){p->name[0] = 'P';p->name[1] = i + '0';p->name[2] = 0;p->next = NULL;printf("Process %s\n", p->name);printf("input run_time: ");scanf("%d", &p->run_time);printf("input priority: ");scanf("%d", &p->priority);/*p->run_time = i+1;p->priority = i;p->status = 'R';*/return p;}//输入任务名称, 时间和优先级,运行状态为E void run(struct PCB *p){printf("Process: %s, running @ tim %d, priority %d, run_time %d\n",p->name, global_time, p->priority, p->run_time);global_time++;p->run_time--;if(p->priority > 0)p->priority--;}//输出这个任务的状态,全局时间加1,任务还需要的时间减1,优先 级减1 void SortChain(struct PCB *phead,struct PCB *ptail){struct PCB *pMax,*pMaxPre,*pPre,*pTemp;head= tail = NULL;//再初始化 一次,重新把排列好的结点加入到链 表中pPre = pMax= pMaxPre = NULL;//pMax:priority 最大的那个结点, pMaxPre:pMax前个结点或许用双向链 表更好一些if(phead == NULL){head = tail = NULL;return ;}else{while(phead != NULL){pMax= phead;pMaxPre = phead;for(pTemp = phead;pTemp != NULL; pTemp = pTemp->next){if(pTemp->priority > pMax->priority ){pMax = pTemp;pMaxPre = pPre;}pPre= pTemp;}if(pMax == phead){phead = phead->next;}else{pMaxPre->next = pMax->next ;}pMax ->next = NULL;if(head == NULL){tail = head = pMax;}else{tail -> next = pMax;tail= pMax;}}}}int main(void ){int i;struct PCB *p = NULL, *q = NULL;//定义指针p和q,p为待运行队列PCB指针,q为待插入队列PCB指针 head = tail = NULL;for(i = 0;i < 5;i ++){p = (struct PCB *)malloc(sizeof(struct PCB)); //分配空间,让p指向这个PCBinitPCB(p,i);p -> next = NULL;if(head == NULL){// 首先把进 程 链表排列起来! 不一定按照 priority 顺序tail = head = p;}else{tail -> next = p;tail= p;}}SortChain(head,tail);/// 按照 priority顺序排列结点while(head != NULL){//当头节点不为空即链表中还有PCB的时候 printf("Current state:\n");for(p = head; p != NULL; p = p->next){printf("Process %s, priority: %d, run_time %d\n",p->name, p->priority, p->run_time);} //让p指针从 head->next 开始走到末尾,输出每一个状态 p = head;run(p);//p指向第一个PCB,然后进行调度 if(p->run_time <= 0){printf("Process %s ends.\n", p->name);p->status = 'E';///free(p);///这里就不释放了head = p-> next;} //如果PCB已经结束,输出信息,释放空间 ,进行下一轮 循环 SortChain(head,tail);//按照 priority 顺序 排列结点} //如果还需要运行,将PCB插入合适位置 system("pause");return 0;}
阅读全文
0 0
- 操作系统--进程控制实验
- 操作系统(二)进程控制
- 操作系统--进程控制
- 操作系统-进程控制
- 操作系统:进程控制
- 操作系统 实验一 进程控制
- 【操作系统】进程描述与控制
- 操作系统学习笔记-进程控制
- 操作系统学习-4. 进程控制
- Unix操作系统并发进程数的控制
- Unix操作系统并发进程数的控制
- 操作系统学习笔记——进程控制
- 操作系统实验一之进程控制实验
- 操作系统笔记---进程的描述与控制
- 操作系统之进程的描述与控制
- 操作系统精髓与设计原理--进程控制
- 操作系统控制进程的三种方式
- 操作系统——进程控制(二)
- Spring3.X jdk8 java.lang.IllegalArgumentException
- 个人简介
- Java零基础入门
- Scratch编程第七讲
- 关于SpringMVCController层请求重定向携带参数的处理
- 操作系统-进程控制
- 給MIS新人的建议
- Oracle Database 12c RMAN全量+增量备份+归档日志恢复详解
- Mac rar文件解压
- LeetCode #28
- linux中的文件查找
- iOS在json解析中出现的类似小数溢出的问题
- Nginx介绍
- Android-性能优化-内存优化