操作系统A

李美蓉

目录

  • 1 操作系统引论
    • 1.1 计算机操作方式的演变
    • 1.2 什么是操作系统
    • 1.3 操作系统的结构
    • 1.4 操作系统的特性
  • 2 进程管理
    • 2.1 进程描述
    • 2.2 进程状态及转换
    • 2.3 进程控制
    • 2.4 进程的并发执行
    • 2.5 进程同步与互斥
    • 2.6 信号量机制及应用
    • 2.7 生产者消费者问题
    • 2.8 读者写者问题
    • 2.9 哲学家就餐问题
    • 2.10 进程通信
    • 2.11 消息缓冲区队列机制
  • 3 线程
    • 3.1 什么是线程
    • 3.2 线程实现
  • 4 处理机调度
    • 4.1 处理机调度概述
    • 4.2 作业调度
    • 4.3 进程调度
    • 4.4 实时调度
  • 5 死锁
    • 5.1 死锁概念及资源分配图
    • 5.2 死锁的必要条件及预防
    • 5.3 死锁避免
    • 5.4 死锁检测和解除
  • 6 存储器管理
    • 6.1 存取器概述及连续分配方式(一)
    • 6.2 动态分区分配及可重定位分区分配
    • 6.3 分页存储管理
    • 6.4 页表结构
    • 6.5 分段及段页式存储管理方式
  • 7 虚拟存储器管理
    • 7.1 虚拟存储技术
    • 7.2 请求分页存储管理
    • 7.3 页面置换算法
    • 7.4 抖动与工作集
    • 7.5 请求分段存储管理
  • 8 磁盘存储器系统
    • 8.1 磁盘存储器的结构
    • 8.2 磁盘调度
    • 8.3 廉价磁盘冗余阵列(RAID)
    • 8.4 提高磁盘I/O的其他方法
    • 8.5 磁盘可靠性技术
  • 9 输入输出系统
    • 9.1 I/O硬件系统
    • 9.2 I/O控制方式
    • 9.3 中断处理程序及设备驱动程序
    • 9.4 设备无关性软件
    • 9.5 缓冲管理
    • 9.6 用户层软件及Spooling
  • 10 文件系统
    • 10.1 文件及逻辑结构
    • 10.2 文件目录结构
    • 10.3 连续分配及链接分配
    • 10.4 索引分配
    • 10.5 空闲空间管理
  • 11 操作系统实验
    • 11.1 实验一  Linux基本命令
    • 11.2 实验二 进程管理
    • 11.3 实验三 进程间通信
    • 11.4 实验四 处理机调度
    • 11.5 实验五 存储管理
    • 11.6 实验六 文件管理
实验二 进程管理

2.1 实验目的

1.加深对进程概念的理解,明确进程和程序的区别。

2.进一步认识并发执行的实质。

3.分析进程争用资源的现象,学习解决进程互斥的方法。

2.2 背景知识

1.阅读linuxsched.h源码文件,加深对进程管理概念的理解。

2.阅读linuxfork.c文件,分析进程的创建过程。

2.3实验内容

2.3.1进程创建

  编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符a;子进程分别显示字符b”和字符“c”。

2.3.2进程控制

  修改已经编的程序,将每个进程输出一个字符改为每个进程输出一句话,观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

2.3.3参考程序

参考程序1:

#include <stdio.h>

    main()

   {

    int p1,p2;

    while  ((p1=fork())= =-1);  

     if (p1= =0)

       putchar(‘b’);

     else

     {

        while  ((p2=fork()= =-1);

         if (p2= =0)

             putchar(‘c’);

         else

             putchar(‘a’);

}

}

     回答问题: 从进程并发执行来看,输出bac,acbbca都有可能,你的程序输出了什么结果?为什么有多种可能的输出?

参考程序2:进程控制源程序

    #include  <stdio.h>

    main()

    {

     int p1,p2;

      while  ((p1=fork()= =-1);

        if (p1= =0)

         for(i=0;i<50;i++)

            printf(“child%d\n”,i);

        else

         {

           while  ((p2=fork()= =-1);

             if (p2= =0)

               for(i=0;i<50;i++)

                 printf(“son%d\n”,i);

              else

                for(i=0;i<50;i++)

                  printf(“daughter%d\n”,i);

}

}

回答问题:将程序执行多次,它们的输出结果分别是什么?分析程序结果存在多种可能的原因

参考程序3

   #include <stdio.h>

   #include <unistd.h>

   main()

   {

    int p1,p2,I;

    while ((p1=fork()= =-1);

     if  (p1= =0)

     {

       lockf(1,1,0);

       for(i=0;i<50;i++)

       printf(“child%d\n”,i);

       lockf(1,0,0);

}

else

 {

   while  ((p2=fork()= =-1);

   if (p2= =0)

    {

     lockf(1,1,0);

     for(i=0;i<50;i++)

      printf(‘son%d\n”,i);

      lockf(1,0,0);

}

           else

{

 lockf(1,1,0);

 for(i=0;i<50;i++)

   printf(“daughter%d\n”,i);

  lockf(1,0,0);

}

}

}

回答问题:改程序运行结果和参考程序2的运行结果有何不同,为什么?