操作系统实验主要涵盖两个核心主题:进程创建与通信以及线程同步。通过实验,学生将深入理解这些基本概念及其在实际编程中的应用。
实验的第一部分涉及到进程的创建与通信。在Linux环境下,使用C++编写了两个程序,an_ch2_1a和an_ch2_1b。an_ch2_1a程序通过`fork()`函数创建一个新的子进程,该子进程执行an_ch2_1b。an_ch2_1b程序无限循环,每隔一秒输出一行包含当前系统时间的消息。这种设计展示了进程的创建与父子进程间的简单通信。`fork()`函数复制父进程的上下文,生成一个子进程,而`system()`函数则用于在子进程中执行指定的命令。
第二部分涉及线程的同步和共享内存。实验要求创建一个控制台应用程序,程序中包含一个全局共享整型变量`shared_var`。主线程和一个新创建的线程并发执行,主线程不断递增`shared_var`,而新线程不断递减。使用`pthread_create()`函数创建线程,`pthread_join()`等待线程结束。由于没有同步机制,程序可能会表现出未定义的行为,因为两个线程可能同时访问和修改`shared_var`,这是线程竞态条件的一个示例。
实验的第三部分是生产者-消费者问题,这是一个经典的多进程同步问题。在这个实验中,有两个生产者进程和三个消费者进程。生产者尝试向缓冲区写入大写字母或小写字母,而消费者则从缓冲区读取并打印字符。为了增加可见性,生产者和消费者在适当的地方添加随机的睡眠时间。可选实验要求实现具有特定消费偏好的消费者,比如一个只消费大写字母,一个只消费小写字母,而第三个消费者则无特定偏好。当缓冲区没有对应产品时,消费者进程应被阻塞。这个实验着重于如何有效管理和同步访问共享资源,如使用信号量来协调生产者和消费者的活动。
最后一个实验是线程实现的“睡觉的理发师”问题。这是一个经典的多线程同步问题,模拟一个理发师、顾客和服务员之间的交互。理发师可以为顾客理发,但不能为自己理发;当理发师不忙时,他应该睡觉。顾客到达时,如果理发师在工作,则进入等待状态,如果理发师在睡觉,那么理发师醒来开始工作。服务员负责唤醒理发师或让顾客等待。这个问题可以通过使用信号量或互斥锁来解决,确保线程安全地访问和更新状态变量,如顾客计数器和理发师的状态。
通过这些实验,学生能够加深对操作系统基本原理的理解,包括进程创建、进程间通信、线程同步和资源管理。这将有助于他们掌握在实际系统中实现并发和多任务处理的关键技能。