操作系统实验-进程

1、 实验目的

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

2、 实验内容

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

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

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

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

3、实验代码

(1) 进程

#include 
#include 
#include 
#include 
#include 
/* 允许建立的子进程个数最大值 */
#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 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  
#include 
#include  
#include 
#include  
#include
#include

#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

(3)互斥

//* POSIX 下线程死锁的演示程序 */ 
#include  
#include 
#include  
#include 
#include  
#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

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

#include 
#include 
#include 
#include 
#include 
  
#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); 
}



你可能感兴趣的:(操作系统)