操作系统实验-进程

操作系统—进程控制实验 文章目录1.关于实验前环境准备2.关于可能用到的命令3.关于makefile4.关于实验说明5.关于实验指导的程序6.关于独立实验Q(跪求大佬解答)? 1.关于实验前环境准备 要准备好C语言的编译环境,安装方法为sudo apt-get install gcc 相信大家编译环境都已经准备好了,这里因为已经安装好了,就不重复安装了,有问题百度上面也有详细的解决方案~ 2.关于可能用到的命令 sudo 表示 “superuser do”,它允许已验证的用户以其他用户的身份来运行命令。 用法: sudo 阅读详情

1、 实验目的

熟悉Linux下进程管理和相关的系统调用。

2、 实验内容

(1). Linux 下用线程模拟实现“生产-消费者”或“读者-写者”或“哲学家就餐”同步问题。

将设计分析过程和源代码写入实验报告。

(2). 补缺三段代码,并回答问题。

将设计分析过程和源代码写入实验报告。

3、实验代码

(1) 进程

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
/* 允许建立的子进程个数最大值 */
#define MAX_CHILD_NUMBER    10
/* 子进程睡眠时间 */
#define SLEEP_INTERVAL        2
int proc_number=0; /* 子进程的自编号,从0开始 */
void do_something();
int main(int argc, char* argv[])
{
    int child_proc_number = MAX_CHILD_NUMBER;    /* 子进程个数 */
    int i, ch;
    pid_t child_pid;
    pid_t pid[10]={0};    /* 存放每个子进程的id */
    
    if (argc > 1)
    {
        /* 命令行参数中的第一个参数表示建立几个子进程,最多10个 */
        child_proc_number = atoi(argv[1]);
        child_proc_number 
            = (child_proc_number > 10) ? 10 : child_proc_number; 
    }
    for (i=0; i<child_proc_number; i++)
        {
        child_pid = fork();
        if(child_pid > 0)
        {
            pid[i] = child_pid; 
        
        }
        else if(child_pid == 0)
        {
            proc_number = i;
            do_something();
        }
        else
        {
            perror("fail to fork!\n"); 
        }
       
        /* 在这里填写代码,建立child_proc_number个子进程
        * 子进程要执行
        *    proc_number = i;
        *    do_something();
        * 父进程把子进程的id保存到pid[i] */
    }
    
    /* 让用户选择杀死哪个进程。输入数字(自编号)表示杀死该进程
    * 输入q退出 */
    while ((ch = getchar()) != 'q')
    {
        if (isdigit(ch))
        {
            kill(pid[ch-'0'], SIGTERM);
            /* 在这里填写代码,向pid[ch-'0']发信号SIGTERM,
            * 杀死该子进程 */
        }
        
    }
/* 在这里填写代码,杀死本组的所有进程 */
    kill(0, SIGTERM);
    return 0;    
    
    
}
void do_something()
{
    for(;;)
    {
        printf("This is process No.%d and its pid is %d\n",  proc_number,  getpid());
        sleep(2); /* 主动阻塞两秒钟 */
    }
}

(2)线程

/*  POSIX 下线程控制的实验程序残缺版 */ 
#include <stdio.h> 
#include <sys/types.h>
#include <unistd.h> 
#include <ctype.h>
#include <pthread.h> 
#include<stdlib.h>
#include<semaphore.h>

#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD]; /* unsigned long  long是比long还长的整数 */
//sem_t S1;
void* thread_worker(void*); 

int main(int argc, char* argv[])
{ 
      int i, rtn, ch; 
      pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/    
       //sem_init(&S1,0,1);
      for (i=0; i<MAX_THREAD; i++)    { 
         /* 在这里填写代码,用pthread_create建一个普通的线程, 
           线程id存入pthread_id[i],线程执行函数是thread_worker
           并i作为参数传递给线程 */
           // if(pthread_create(&pthread_id[i], NULL, thread_worker, &i)!=0){
	  if(pthread_create(&pthread_id[i], NULL, thread_worker, (void *)i)!=0){
                      printf("thread_create failed");    
		       exit(1);    
	    }
     } 
     do {/* 用户按一次回车执行下面的循环体一次。按q退出 */ 
           unsigned long long sum = 0;/* 求所有线程的counter的和 */
       for (i=0; i<MAX_THREAD; i++)  {/* 求所有counter的和 */
              sum += counter[i]; 
              printf("counter[%d]=%llu  ", i,counter[i]); 
         }
        printf("%llu/%llu", main_counter, sum);   
     }  while ((ch = getchar()) != 'q'); 
	//sem_destroy(&S1);
   return  0;
} 
void* thread_worker(void* p) { 
     int thread_num;  
    /* 在这里填写代码,把main中的i的值传递给thread_num */ 
     //thread_num = *(int*)p;
        thread_num = (int)(p);
    for(;;) { /* 无限循环 */
           counter[thread_num]++; /* 本线程的counter加一 */ 
           //sem_wait(&S1);
	   main_counter++; /* 主counter 加一 */
	   //sem_post(&S1);
     } 
}

(3)互斥

//* POSIX 下线程死锁的演示程序 */ 
#include <stdio.h> 
#include <sys/types.h>
#include <unistd.h> 
#include <ctype.h>
#include <pthread.h> 
#define LOOP_TIMES 10000 
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;   /*用宏PTHREAD_MUTEX_INITIALIZER来初始化 */
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
void* thread_worker(void*);
void critical_section(int thread_num, int i);  
int main(void)  { 
      int rtn, i; 
      pthread_t pthread_id = 0; /* 存放子线程的id */ 
      rtn = pthread_create(&pthread_id,   NULL, thread_worker, NULL ); 
      if(rtn != 0) { 
            printf("pthread_create ERROR!\n"); 
            return -1; 
      } 
      for (i=0; i<LOOP_TIMES; i++)  { 
        pthread_mutex_lock(&mutex1);
	pthread_mutex_lock(&mutex2); 
	critical_section(1, i); 
	pthread_mutex_unlock(&mutex2);
	pthread_mutex_unlock(&mutex1);
      } 
     pthread_mutex_destroy(&mutex1);
     pthread_mutex_destroy(&mutex2); 
     return 0; 
} 
void* thread_worker(void* p)  { 
      int i; 
      for (i=0; i<LOOP_TIMES; i++) { 
       // pthread_mutex_lock(&mutex2);
	//pthread_mutex_lock(&mutex1); 
        pthread_mutex_lock(&mutex1);
	pthread_mutex_lock(&mutex2); 
	critical_section(2, i); 
	pthread_mutex_unlock(&mutex2);
	pthread_mutex_unlock(&mutex1);
      }
} 
void critical_section(int thread_num, int i) { 
      printf("Thread%d: %d\n", thread_num,  i);
}

(4)模拟生产者-消费者

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
  
#define M 10 

int in = 0;  
int out = 0; 

int buff[M] = {0}; 

sem_t empty_sem;
sem_t full_sem;  
pthread_mutex_t mutex;

int producer = 0;  
int consumer = 0; 


void print()
{
int i;
for(i = 0; i < M; i++)
   printf("%d ", buff[i]);
printf("\n");
}


void *product()
{
while(1)
{
   
   sleep(1);
   
   sem_wait(&empty_sem);
   pthread_mutex_lock(&mutex);
  
   in = in % M;
   printf("producer at %d position: \t",  in);
  
   buff[in] = 1;  
   print();  
   ++in;
  
   pthread_mutex_unlock(&mutex);
   sem_post(&full_sem);  
}
}
void *prochase()
{
while(1)
{
  
   sleep(2);
   sem_wait(&full_sem);
   pthread_mutex_lock(&mutex);
  
   out = out % M;
   printf("consumer at %d position: \t",  out);
  
   buff[out] = 0;
   print();
   ++out;
  
   pthread_mutex_unlock(&mutex);
   sem_post(&empty_sem);
}
}

int main()
{
pthread_t id1;
pthread_t id2;
int ret;

int ini1 = sem_init(&empty_sem, 0, M); 
int ini2 = sem_init(&full_sem, 0, 0);  
if(ini1 && ini2 != 0)
{
   printf("sem init failed \n");
   exit(1);
} 

int ini3 = pthread_mutex_init(&mutex, NULL);
if(ini3 != 0)
{
   printf("mutex init failed \n");
   exit(1);
} 
    
   ret = pthread_create(&id1, NULL, product,NULL);//
   if(ret != 0)
   {
    printf("product creation failed \n");
    exit(1);
   }

   ret = pthread_create(&id2, NULL, prochase, NULL);
   if(ret!= 0)
   {
    printf("prochase creation failed \n");
    exit(1);
   }


   pthread_join(id1,NULL);
   pthread_join(id2,NULL);


exit(0); 
}



计算机操作系统实验之模拟进程管理(C语言) 利用C语言模拟实现操作系统中的进程管理 阅读详情

相关推荐

操作系统实验——进程调度的模拟

实验内容: 熟悉进程调度的各种算法,并对模拟程序给出数据和流程的详细分析,之后画出流程图,最后参考模拟程序写出时间片轮转调度算法的程序。 实验目的: 通过本实验,加深对进程调度算法原理和过程的理解。 实验要求: (1) 对调度算法进行详细分析,在仔细分析的基础上,完全理解主要数据结构和过程的作用,给出主要数据结构的说明及画出主要模块的流程图。 (2) 根据提示信息,把函数写完整,使成为一个可运行程...

Jimmy Huang's Blog 5625

一个java的实验

首先声明一点,本人对java并不熟悉,只是学习过C++,然后因为课程的安排才看了一下java的,所以对java强的类库和运行机制还不是很了解。        这个java程序是为明天的实验做的准备。具体的要求是这样的:        1、编写一个程序,其功能是运行之后,其中有一个线程可以输出 20 次你的学号,另一个线程会输出 20 次你的姓名。        2、编写一个图形界面程序,运行

Just_IT_1991的专栏 1214

c++ 操作系统实验 进程调度

实验一  进程调度 实验学时:4学时 实验类型:设计 实验要求:必修 一、 实验目的 多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。 二、 实验内容 1. 优先权法、轮转法 简化假设 1) 进程为计算型的(无I/O) 2) 进程状态:ready、

cccccttttyyy的博客 6763

Java实验报告多线程_java多线程实验报告.doc

精品文档Java实验程序设计实验报告实验名称:多线程一:实验目的1、掌握线程和多线程的概念。2、掌握创建线程的两种方法及其区别。3、了解线程的启动、终止、同步、互斥和优先级等概念。二:实验内容1、编写一个程序,其功能是运行之后,其中有一个线程可以输出20次你的学号,另一个线程会输出20次你的姓名。2、编写一个图形界面程序,运行之后,让其中有一个线程能在界面上“实时”显示系统当前时间(精确到秒获取时...

weixin_32135505的博客 2801

操作系统实验一:进程管理(含成功运行C语言源代码)

源程序中一共构造了5个函数方法来实现进程的创建、(运行进程的)显示、换出、结束(杀死)与唤醒。

南小山的博客 6万+

操作系统进程调度实验

实验2 进程调度 一、实验目的 进程调度是处理机管理的核心内容。本实验要求用高级程序设计语言编写和调试一个简单的进程调用程序,模拟完成进程控制及进程调度算法。进程控制包括进程的创建、阻塞、唤醒和撤销,进程调度算法包括先来先服务、优先级(包括动态和静态)和论证法。通过本实验可以使学生加深对进程控制块和进程队列的概念的理解,并了解循环轮转调度和优先级调度的实现方法。 二、实验内容 1.设计进程控制块PCB结构,PCB结构包括以下信息:进程ID,用户ID, 进程状态,进程优先数(或轮转时间片),进程创建时

qq_50533078的博客 2940

实验一进程管理c语言,操作系统实验一 进程管理

实验一 进程管理1.目的和要求通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。2.实验内容用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。3.实验环境Windows操作系统、VC++6.0C语言4.实验提示PCB结构通常包括以下信息:进程名,进程优先...

weixin_35676504的博客 2939

实验六:《操作系统》之进程调度算法的模拟实现

Part6. 进程调度算法的模拟实现 往期回顾: Part0. 实验环境 Part1-1.熟悉UKylin环境 Part1-2.熟悉UKylin环境 Part2.进程控制 Part3.进程通信 Part4.管道通信 Part5.避免死锁——银行家算法的实现 一、实验目的 1.理解和掌握课堂上讲的进程调度算法,并编程模拟实现调度过程。 2.研究进程调度算法的实现方法,并对算法性能参数进行对比。 二、实验要求 编程模拟实现传统的进程调度算法:FCFS调度算法、SPF调度算法、RR调度算法、优先级调度等算法。

qq_41713240的博客 1万+

实验1 进程管理实验-计算机操作系统

在分析给定进程创建源代码基础上,结合可能使用的进程调度算法,完善PCB结构 编写程序实现进程撤销功能,并与进程创建程序构成一个进程管理程序,模拟实现进程的管理功能 进行动态的进程创建、撤销等测试。 按要求撰写实验报告并及时提交报告 进行10次以上的创建操作 进行10次以上的撤销操作(至少各有1次包含子、孙进程) 代码一:main.cpp 代码一:basic.h //与main.cpp放在同一目录 #include "basic.h" pnode *proot; //system p..

m0_46411624的博客 5916

操作系统实验-实验一 进程管理与进程通信

一、 实验目的 1、掌握进程的概念,明确进程的含义。 2、认识并了解进程并发执行的实质,进程的阻塞与唤醒,终止与退出的过程。 3、熟悉进程的睡眠、同步、撤消等进程控制方法。 4、分析进程竞争资源的现象,学习解决进程互斥的方法 。 5、了解什么是信号,利用信号量机制熟悉进程间软中断通信的基本原理, 6、熟悉消息传送的机理 ,共享存储机制 。 二、 实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程并发执行,观察实验结果并分析原因。 2、用fo

打工人的博客 4490

基于linux的socket多人聊天室程序,采用posix多线程控制技术

基于linux的socket多人聊天室程序,采用posix多线程控制技术。客户端和服务器采用协议机制通信,服务器端在用户上线和下线时及时更新在线人数,并打印上下线信息(用户名)。客户端登陆需要输入用户名,若用户名已存在则让用户重新登陆。客户端也有即时显示好友上线下线信息功能。

操作系统的进程管理(c语言模拟)

今天就更一下,模拟进程管理程序。 #include #include #include #include //#define NULL 0 int shumu=0; //进程的内容结构体 struct node { char a[20]; //int a; // char ch; }; typedef struct node Node; //进程PCB结构体 struc

best_fiends_zxh的博客 1万+

实验八:Java多线程

本次实验了解线程与进程的概念、区别与联系,掌握了多线程的内涵与使用场景,掌握了线程的状态与生命周期,掌握了Java实现多线程的两种方式,理解了临界区、对象锁、互斥、同步等核心概念,理解了线程的互斥与同步,了解了线程的死锁等。

操作系统实验——进程控制

操作系统实验——进程控制 预习内容: 1.进程的概念 ⑴程序的并发执行 ⑵进程的定义 2.进程的描述 ⑴进程控制块 ⑵进程上下文 ⑶进程上下文切换 ⑷进程空间与大小 3. 进程状态及其转换 ⑴进程状态 ⑵进程状态转换 4.进程控制 ⑴进程创建与撤销 ⑵进程的阻塞与唤醒 实验目的与要求(及主要实验仪器、设备): 1、理解进程的概念,明确进程和程序的区别。 2、理解并发执行的实质。 3、 掌握进程的创建、睡眠、撤销等进程控制方法 要求: (1)一台Windows7以上版本操作系统的计算机。 (2)计算机装有Mi

xuanyuanchun的博客 5813

进程演示系统,创建新进程,杀死进程等

进程实验的演示c++源程序 创建新进程,杀死进程等

操作系统linux进程实验报告

计算机操作系统教程第二版,操作系统linux进程实验报告,

《操作系统实验之四种进程调度》

C语言编写操作系统四种进程调度一、先来先服务调度算法(FCFS) 二、短作业(进程)优先调度算法(SJF) 三、高响应比优先调度算法(HRRN) 四、时间片轮转调度算法(RR)

qq_52743307的博客 3955

操作系统进程演示

实现进程的创建 删除 阻塞和 唤醒

下一篇: 页式地址变换-虚地址结构(整理)
macandroid
博客等级 码龄14年 35粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值