最近接触了一些多线程的程序设计,主要涉及到使用多线程对一个缓冲区的数据进行读写。以前觉得多线程好像也不怎么难,到这时候才发现原来是自己所接触到的多线程程序太简单了。好了,废话不多说,直接切入主题,操作系统同步算法。
本科时候所学习的操作系统课程,里面有一个非常重要的部分是关于进程的同步,考试也是必考内容,以前一直感觉晕晕的,想不到这个时候验证了“出来混总是要还的”这句话。以前没理解好,现在来恶补一下。多线程作为现代操作系统的一个基本特征,很多地方和进程的设计理念是类似的,就比如同步算法。
我们知道,当多个线程同时运行时,是由操作系统对其进行调度,线程的运行顺序是我们无法控制的。这个时候,传统的结构化程序自顶向下的分析思想就显得捉襟见肘了。而事实是,不仅在程序分析上会变得很麻烦,程序对资源的访问的控制也需要进行非常仔细的掂量。关于“读脏”数据等并发引起的问题就不进行详细叙述。
我们来看第一个非常简单的例子,非常经典的读者/写者问题。
问题简单描述:有一个读者和一个写者,当写者在进行写作的时候,读者不能阅读,读者阅读的时候,写者不能进行写作。也就是说,读者和写者只能有一个运行,另外一个要阻塞。
算法是用C语言在Linux下实现的
/**
**读写互斥问题
**读的时候不能写,写的时候不能读
**
**/
#include<stdio.h>
#include<pthread.h>
//声明一把互斥锁
pthread_mutex_t mutex;
void writer(void)
{
while(1)
{
pthread_mutex_lock(&mutex);
printf("writer加锁成功,开始写...\n");
sleep(2);
printf("writer写操作结束,释放互斥锁\n");
pthread_mutex_unlock(&mutex);
}
}
void reader(void)
{
while(1)
{
pthread_mutex_lock(&mutex);
printf("reader加锁成功,开始读...\n");
sleep(2);
printf("reader读操作结束,释放互斥锁\n");
pthread_mutex_unlock(&mutex);
}
}
int main(void)
{
printf("初始化互斥锁\n");
pthread_mutex_init(&mutex,NULL);
pthread_t thread_writer;
pthread_t thread_reader;
printf("开始读写线程\n");
pthread_create(&thread_reader,NULL,(void *)reader,NULL);
pthread_create(&thread_writer,NULL,(void *)writer,NULL);
printf("回收线程\n");
pthread_join(thread_reader,NULL);
pthread_join(thread_writer,NULL);
printf("运行结束\n");
return 0;
}
注意:编译的时候要加上-lpthread
编译命令示例:gcc -o mutex.exe mutex.c -lpthread
这个程序由于设计上不是很合理,会进入一个无限循环,所以在控制台下运行以后要使用Ctrl+C来强行结束程序的运行,不过不影响整个算法的主要流程。
我们运行以后可以发现一个很严重的问题,读者或者写者的其中一个可能会长期占据着互斥锁的加锁权,从而导致另外一个线程长期没有机会运行,导致一种线程“饿死”现象。
在实际的读写过程中,比较正常的一种简单情况是,先写再读,读写交替。下一篇文章我们来改进一下本文的算法,使其达到读写交替的目的。
分享到:
相关推荐
操作系统中的线程同步是多线程编程中一个关键的概念,它确保了多个线程在访问共享资源时的正确性,防止数据竞争和其他并发问题。在Windows操作系统中,提供了多种线程同步机制,如临界区、事件、信号量以及互斥量等...
在操作系统的设计与实现中,有十大核心算法,这些算法对于理解和优化操作系统至关重要。让我们深入探讨这些算法及其重要性。 1. **调度算法**:调度是操作系统管理处理器的关键部分,包括进程调度、I/O调度等。短...
操作系统_进程同步算法习题精选.ppt
本文将深入探讨三种常见的帧同步算法,并提供MATLAB代码实现,适合本科毕设项目参考。 1. **滑动窗口同步(Sliding Window Synchronization)** 滑动窗口同步是一种基本的同步方法,它依赖于在接收数据中寻找特定...
在操作系统的设计与实现中,算法起着至关重要的作用。本篇文章将深入探讨标题中提及的几个关键算法:多级调度算法、银行家算法、磁盘调度算法以及生产者-消费者问题。 1. **多级调度算法**: 多级调度算法是操作...
在操作系统的设计与实现中,有三个重要的算法:银行家算法、进程调度算法和页面置换算法。这些算法对于系统的性能和稳定性至关重要。 首先,让我们深入探讨银行家算法。这个算法主要用于预防操作系统的死锁问题。...
3.内容:基于5G通信系统的时间同步算法matlab仿真。 5G通信系统的时间同步需求主要源于对基站空口时间偏差的严格限定,这主要是为了避免上下行时隙干扰。对于4G TDD系统,采用固定子载波间隔15kHz,保护周期GP...
分布式操作系统算法Demo是一种高级操作系统技术的实践展示,它涵盖了分布式系统和算法的核心概念。在现代计算机科学中,分布式操作系统是连接多台独立计算机,通过网络通信实现资源共享和协同工作的系统。这种系统...
实验一、进程控制实验 实验二、线程和进/线程管道通信实验 实验三、进程调度算法实验 实验四、进程同步实验 实验五、进程互斥实验 实验六、死锁问题实验 实验七、内存页面置换算法实验 实验八、磁盘移臂调度...
这个压缩包包含的是一系列用Java语言编写的操作系统经典算法,对于学习和理解操作系统的工作原理极其有价值。 1. **进程管理**: - **进程创建与销毁**:Java代码可能实现了创建新进程和结束进程的逻辑,这涉及到...
在这个"操作系统实验各类算法的程序"压缩包中,我们很可能会找到一系列与操作系统原理相关的代码实现,这些代码通常会涵盖以下几个关键知识点: 1. **进程管理**:在操作系统中,进程是程序的执行实例。这里可能...
总的来说,这个项目为学习操作系统原理和算法提供了一个实践平台,通过代码和流程图,使得抽象的概念变得具体可操作,对于提升理解和应用能力非常有帮助。无论是对操作系统感兴趣的初学者还是希望深化理解的专业人士...
操作系统是管理计算机硬件和软件资源的核心程序,而死锁是多进程环境中的一种常见问题,它发生在两个或多个进程互相等待对方释放资源而无法继续执行的情况。银行家算法是由E.F.科恩提出的,用于预防操作系统中的死锁...
本主题将详细探讨基于MATLAB的无线传感器网络时间同步算法。 MATLAB是一种强大的开发环境,适用于数值计算、符号计算以及算法开发。在无线传感器网络时间同步领域,MATLAB可以用来设计、模拟和测试各种同步算法,如...
OFDM(Orthogonal Frequency Division Multiplexing,...总之,"OFDM经典同步算法MATLAB程序"是一个实用的学习资源,可以帮助工程师和学生了解并实践OFDM系统中的关键同步步骤,提升无线通信领域的理论知识和编程技能。
在这个主题中,我们探讨了几个关键的操作系统算法,它们对于理解和优化系统的性能至关重要。 1. FIFO(先进先出)算法:这是一种最简单的页面替换算法,按照内存中的页面到达顺序进行淘汰。当内存满时,最先进入...
7. 系统调用:操作系统提供了一系列接口供用户程序调用,如fork、exec、wait、exit等。通过C语言,我们可以理解和实现这些系统调用,了解它们如何与内核交互。 8. 防火墙和安全:C语言也可以用于实现简单的防火墙...
操作系统实验报告《进程同步与互斥》实验的主要目的是掌握基本的进程同步与互斥算法,了解生产者-消费者问题,并学习使用 Windows 2000/XP 中基本的同步对象,掌握相关 API 的使用方法。实验中,设计了一个控制台...
作业调度是操作系统内核的一部分,其主要目标是确保系统公平、高效地服务所有用户请求。作业可以理解为用户提交的程序或任务,它们首先被存储在作业队列中,等待被调度执行。作业调度器根据一定的策略选择一个作业,...