操作系统(王道第二章进程与线程)

本文详细介绍了进程的定义、组成,包括进程控制块(PCB)、程序段和数据段。阐述了进程的组织方式,如链接和索引,并概述了其动态、并发、独立、异步和结构五大特征。此外,讨论了进程的状态转换,强调了原语在进程控制中的作用。进程通信方面,提到了共享存储、管道通信和消息传递等机制。最后,文章介绍了线程的概念,线程与进程的区别,以及多线程模型,包括多对一、一对一和多对多模型。
摘要由CSDN通过智能技术生成

进程的定义、组成、组织方式和特征

定义
引入多道进程并发执行机制后,为了方便操作系统管理,引入进程概念
系统为每一个运行的程序配置一个进程控制块(PCB),记录进程信息
进程实体:由PCB,程序段,数据段构成
实际所说的创建进程,指的就是创建进程实体中的PCB
一般不区分进程和进程实体
组成
PCB(详细组成),程序段,数据段
进程的管理者所需的数据全部存放在PCB中
组织
多个进程之间的组织
链接方式——队列
索引方式——索引表
特征
动态、并发、独立、异步、结构

状态与转换

状态
三种基本状态:运行态,就绪态,阻塞态
还有创建态,终止态
状态转换

进程控制

概念
进程控制就是要实现状态转换
如何进行进程控制?
状态转换之间需要修改PCB等许多内容,为了防止修改内容被中断,使用了原语
原语的特点就是执行期间不允许中断,只能一气呵成,这要求使用关中断命令和开中断命令(关中断顾名思义,就是关闭,忽略中断命令),这两个指令都是只允许在核心态下执行的特权指令。
进程控制相关的原语
创建原语
撤销原语
阻塞原语 / 唤醒原语(成对出现)
切换原语

进程通信

进程通信就是进程之间的信息交换
进程是分配系统资源的单位,各进程拥有的内存地址空间相对独立,一个进程不能直接访问另一个进程的地址空间
共享存储
互斥访问共享空间(同步互斥)
基于数据结构的共享
基于存储区的共享(较高级)
管道通信
管道是指用于连续读写进程的一个共享文件,其实就是内存中的一个缓冲区。
管道通信是半双工通信,指虽然可以双向连通,但是同一时间段只能实现单向的传输。互斥访问管道。
管道写满后,写进程的write系统调用会被阻塞,管道变空后,读进程的read会被阻塞。如果没写满,就不允许读,如果没读完,就不允许写。数据被读出后就会被抛弃。
消息传递
以格式化的消息为单位,通过发送消息和接收消息两个原语实现
消息:消息头 消息体
直接通信方式:消息直接挂到接收进程的缓冲队列上
间接通信方式:消息要先发送到中间实体信箱中

线程

有的进程需要同时执行很多程序,所以引入线程来增加并发度
传统的进程是程序执行流的最小单位,现在每个进程中包括多个线程,线程成为程序执行流的最小单位,是基本的CPU执行、调度单位。
而进程是除了CPU以外的系统资源的分配单位(如内存地址空间,打印机),线程几乎不拥有系统资源
同一进程间的线程切换减少了系统开销
线程的实现方式
用户级线程:用户视角看到的线程,操作系统看不到的线程
内核级线程:由内核负责,这个才是处理机分配的单位
由几个用户级线程映射到几个内核级线程的问题引出多线程模型的概念
多线程模型
多对一模型:用户级线程的线程切换在用户态完成,系统开销小;但是系统并发度低
一对一模型:变成纯粹的内核级线程,并发度高;但是线程管理成本大
多对多模型:n个用户级线程对应m个内核级线程,n>=m

流程图,代码,截图三、程序源代码: #include"stdlib.h" #include"stdio.h" #include"string.h" /********** globle structure and viable ******/ struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行间 int P_Requiry; //PCB需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; struct PCB * Create_state; //创建状态 struct PCB * Run_state; //运行状态 struct PCB * Ready_state; //就绪状态 struct PCB * Block_state; //阻塞状态 struct PCB * Exit_state; //退出状态 int signal4=0; //标示进程4的完成状态 int signal5=0; //标示进程5的完成状态 void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */ { struct PCB * p,*q; node->next=NULL; if(*head==NULL) //如果队列为空 { *head=node; } Else //队列不空 { p=*head; q=p->next; while(q!=NULL) //找到最后的元素位置 { p=q; q=q->next; } p->next=node; //将节点插入队列 } } void DeleteQueue(struct PCB **head,struct PCB *node) //撤销进程,从队列中删除元素 { struct PCB *p,*q; q=*head; if(*head==NULL||node==NULL) //如果队列为空,返回 return ; if(*head==node) //如果要删除的元素是队首元素 { *head=(*head)->next; return; } Else //如果不是队列的首元素 { while(q->next!=p&&q->next!=NULL) q=q->next; q=p->next; p->next=NULL; } } void Display_Process(struct PCB * node) //打印进程状态的元素函数 { printf("\n\nthis process Id is : %d \n",node->P_Id); printf("this process name is : %s \n",node->P_Name); printf("this process state is : on %s \n ",node->P_State); printf("this process Runtime is : %d \n",node->P_Runtime); if(node->P_Requiry) printf("this process resource is ready \n"); else printf("this process resource is not ready ! \n"); } void DispatchToBlock(struct PCB *node) // /* dispatch to block function*/ { //调度到阻塞状态的函数 //struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB)); if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态 { strcpy(node->P_State,"block"); InsertQueue(&Block_state,node); //插入到阻塞队列 Display_Process(node); } } void DispatchToReady(struct PCB *node) // dispatch to ready state { //调度到就绪状态的函数 if(node->P_Requiry) //如果所需的资源满足,则调度 { strcpy(node->P_State,"Ready"); InsertQueue(&Ready_state,node); Display_Process(node); } } void DispatchBlockToReady() //dispatch the process to readyqueue { //从阻塞状态调度到就绪状态函数 struct PCB*p,*q; q=Block_state; while(q!=NULL) //如果阻塞状态队列不空 { p=q; q=q->next; if(signal4&&p->P_Id==4) //如果所需要的资源满足 { DeleteQueue(&Block_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); printf("process4 will be in the state of ready!\n"); Display_Process(p); } if(signal5&&p->P_Id==5) { DeleteQueue(&Block_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); printf("process5 will be in the state of ready!\n"); Display_Process(p); } } } void Create_Process() //创建进程函数 { int i; struct PCB *p; char name[10]; strcpy(name,"process"); for(i=1;iP_Id=i; name[7]=i+'0'; name[8]='\0'; strcpy(p->P_Name,name); strcpy(p->P_State,"create"); p->P_Runtime=1; //所需要间片为1 p->P_Requiry=0; Display_Process(p); sleep(4); printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i); DispatchToBlock(p); //同调度到阻塞队列 } for(i=3;iP_Id=i; name[7]=i+'0'; name[8]='\0'; strcpy(p->P_Name,name); strcpy(p->P_State,"create"); p->P_Requiry=1; if(i==6) //在这里个进程6所需要间片为2 p->P_Runtime=2; else p->P_Runtime=1; Display_Process(p); sleep(4); printf(" \n process%d will be in the state of Ready, waiting to run \n\n",i); DispatchToReady(p); } } void display(struct PCB **head) //打印各个状态队列里进程数目 { struct PCB *p,*q; p=*head; while(p!=NULL) { sleep(2); //printf("\n\n///////////////////////////////////\n"); printf("\n\nthis process Id is : %d \n",p->P_Id); printf("this process name is : %s \n",p->P_Name); printf("this process state is : on %s \n ",p->P_State); printf("this process Runtime is : %d \n",p->P_Runtime); if(p->P_Requiry) printf("this process resource is ready \n"); else printf("this process resource is not ready ! \n"); p=p->next; } } void Process_Run() //进程运行函数 { struct PCB *p,*q; p=Ready_state; q=p; while(p!=NULL) //就绪队列不空则继续执行 { if(p->P_RuntimeP_State,"running"); Display_Process(p); p->P_Runtime=p->P_Runtime-1; sleep(4); if(p->P_Runtime>0) //没有完成,则进入就绪队列 { printf("this process is not finished,will be dispatch to the ready queue!!\n"); DeleteQueue(&Ready_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); Display_Process(p); } Else //执行完成,则跳出,并发送相应的信息 { printf("\n\nProcess%d is finished and will be in the state of exit!\n\n",p->P_Id); if(p->P_Id==4) signal4=1; if(p->P_Id==5) signal5=1; } if(signal4||signal5) DispatchBlockToReady(); //如果资源满足,则将进程调度到就绪队列 q=q->next; p=q; } if(q==NULL) printf("\nthere is no process ready!\n STOP Machine!!!\n"); } int main(int argc,char * argv[]) //主函数 { int i; char c='c'; //界面 printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n"); printf("...................................Ding Hai bo\n"); printf("......Press s to start the process.......\n"); scanf("%c",&c); while(1) { if(c=='s')break; scanf("%c",&c); } Create_Process(); //调用创建进程函数 printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); printf("\n>>>>>>> Display the Ready queue >>>>>>>>>>>>>>>\n"); sleep(5); display(&Ready_state); ////////////////显示就绪队列里的进程 printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); printf("\n>>>>>>>> Display the Block queue >>>>>>>>>>>>\n"); sleep(5); //显示阻塞队列函数 display(&Block_state); ///////////////////// printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n\n"); printf("\n>>>>>>>> Now the process start to run >>>>>>>>>>>\n"); sleep(5); Process_Run(); //调用进程运行函数 } 都有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值