首页 > 其他分享 >CSci 4061多线程图像匹配服务器

CSci 4061多线程图像匹配服务器

时间:2024-04-01 13:22:24浏览次数:21  
标签:文件 图像匹配 请求 队列 CSci 线程 图像 服务器 多线程

CSci 4061:操作系统简介,2024年春季项目#3:多线程图像匹配服务器中间提交截止时间:2023年4月4日下午11:59(CDT)
最终提交截止时间:下午11:59(CDT),4。12, 2023
1.背景
这个实验室的目的是使用
C语言中的POSIX线程(pthreads)来学习线程编程和同步方法。在这个项目中,我们将使用多线程来提高服务器的性能编程为接受来自用户的图像,将其与已知图像的数据库进行匹配,然后返回最接近的匹配图像。在这个编程任务中,我们将使用调度员工作人员线程的模型。同时存在并发性和并行性(如果服务器运行在多核系统)。注意:即使线程被分派到不同的核心,它们仍然可以直接访问所有的进程内存。
此编程任务的目的是让您开始使用线程编程和同步。您需要熟悉POSIX线程、互斥锁和条件变量。
2.工程概况
您的项目将由两种类型的线程组成:调度器线程和工作线程。这个调度器线程的目的是重复接受传入的连接,读取客户端请求并将请求放入队列中。我们将假设只有一个请求每个传入连接。工作线程的目的是监视请求队列,检索请求(以输入图像的形式)并将图像读取到存储器中(即获取图像的字节),将图像与图像数据库进行匹配,并将最佳或最接近的匹配图像提供给
使用者队列是一个有界缓冲区,需要正确同步。所有客户端服务器通信是为您实现的。
3.服务器概述
当程序启动时,服务器应该创建一个固定的工作线程和调度线程池。代 写CSci 4061工作线程池的大小应该是num_worker(您可以假设工作线程的数量将小于请求的数量)并且调度器线程的大小应该是num_dispatcher。你的当服务器启动时,服务器应该将图像数据库放入内存。
3.1服务器数据库:
● 数据库是一个充满图像的目录。这些图像用于比较从客户端接收的输入图像,最接近的匹配随后返回到各自的客户。必须在服务器的启动以确保在匹配过程中有效访问。
3.2请求队列结构:
● 请求队列结构:队列中的每个请求都将包含一个图像(即字节),以及发送到哪里的文件描述符最佳匹配图像返回。在将该数据添加到队列之前,可以使用结构来保存该数据。队列结构由您决定。您可以将其实现为结构队列或的链表结构或任何其他您认为合适的数据结构。
3.3 Dispatcher线程
调度器线程的目的是重复接受传入连接,读取来自连接的客户端请求(即图像内容),并将该请求放入队列中。我们将假设每个传入连接只有一个请求。您将使用锁和条件
变量(周四讨论)来同步此队列(也称为有界缓冲区)。队列是固定尺寸。
● 队列管理:已识别的字节图像流将沿着添加到请求队列带有将图像发送回何处的文件描述符。此队列与工作人员共享。
● 发出新请求信号:一旦请求被添加到请求队列中,调度器线程将向所有工作线程发出队列中有请求的信号。
● 完整队列:一旦队列已满,调度程序线程将等待来自任何工作线程的信号线程通知队列中有空间。
● 调度员将调用的网络功能:
○ int socketfd=accept_connection():返回一个文件描述符应存储在队列中
○ Char*缓冲区=get_request(int socketfd,size_t*大小):将文件描述符作为第一个参数,将size_t指针作为第二个参数将由该函数设置的参数。返回带有原始图像字节的char*。
3.6工作线程
工作线程负责监视请求队列、检索请求,将来自数据库的图像与请求图像进行比较,并将最佳图像提供给用户。以下是其功能的细分:
● 参数:工作线程将使用threadID作为参数(0,1,2,…),稍后将使用用于日志记录。您可以按照创建线程的顺序为线程分配一个ID。笔记该线程ID与pthread_create()分配给该线程的pthread_ID不同作用
● 队列监视:工作线程持续监视共享请求队列。当一个新的请求从调度程序线程到达,其中一个工作线程将检索该请求以进行进一步处理处理。
● 请求处理:一旦获得请求,工作线程将与用于最佳匹配图像的数据库的内存副本。
● 对请求的响应:在找到图像后,工作线程准备要服务的图像通过发送图像字节返回给用户。然后,客户端将返回的图像写入文件。:输入文件是foobar.png输出文件可以是foobar_smilar.png。
● 空队列:一旦队列为空,工作线程将等待来自调度器线程,队列中现在有请求。
● 同步:适当的同步机制,如互斥锁和条件变量用于确保多个工作线程可以安全地访问和修改共享数据结构(队列)和其他全局变量,而没有竞争条件或死锁。
● 工作人员将执行的网络功能:
○ database_entry_t image_match(char*input_image,int size):
○ send_file_to_client(int socketFd,char*缓冲区,int大小):获取客户端文件描述符、匹配的图像内存块及其大小。
3.8请求日志记录
工作线程必须小心地将每个请求记录到名为“server_log”的文件中,也记录到终端(stdout),格式如下。日志文件应创建在最终文件所在的同一目录中
可执行文件“服务器”存在。您还必须保护日志文件不受竞争条件的影响。格式为:
threadId][reqNum][fd][Request string][bytes/error]
● threadId是从0到num_workers-1的整数,表示请求的线程索引搬运工人。(注意:这不是pthread_create返回的pthread_t)。
● reqNum是特定工作线程迄今为止处理的请求总数,包括当前请求(即,这是对每个请求进行唯一标记的一种方式)。
● fd是accept_connection()为此请求提供的文件描述符
● 数据库字符串是服务器发送的图像文件名
● 字节/错误是成功请求返回的字节数。日志(在“server_log”文件和终端中)应该类似于下面的示例。我们为此提供代码。
[8] [1][5][/DB/30.jpg][17772]
[9] [1][5][/DB/30.jpg][17772]确保打开serer_log文件进行写入,并将其截断为0。
3.8服务器终止我们将保持这个非常简单:^C。如果你希望你能抓住^C,并做一些清理或再见,但不需要。如果客户端正在运行,那么这可能会挂起客户端或使其崩溃。别担心。
4.客户概述
您的客户端将使用目录名作为命令行参数,并负责遍历其内容。对于目录中遇到的每个文件,客户端将启动一个线程来请求
服务器来处理它。这个线程将处理文件传输到服务器进行处理。随后,线程将保持活动状态,等待接收到相应的匹配图像从服务器,将内容写入文件,然后终止。客户端是多线程的原因是模拟对服务器的多个并发请求。
4.1客户端主线程
● 目录遍历:主线程将遍历每个映像的目录内容在目录中遇到,它将生成一个线程来处理它服务器的并发性,希望如此。
4.2客户端线程
● 文件准备:一旦线程启动,它将把图像加载到内存中并发送到使用send_file_to_server()函数的服务器。
● 用户响应:在线程成功地向服务器发送图像之后。线程将
保持活动,等待从服务器接收到相应的匹配图像。
● 匹配图像处理:一旦客户端收到匹配图像,线程将图像保存到一个新文件中并记录请求。
● 客户端需要调用的网络函数:
○ int socketFd=setup_connection():返回一个文件描述符将数据发送到服务器
○ send_file_to_server(int socketFd file*fd,size_t size):获取服务器文件描述符、图像文件描述符和图像大小。
○ receive_file(int socketFd,char*路径):服务器文件描述符和
输出新图像的路径。
5.编制说明您可以使用创建所有必要的可执行文件命令行制作使用可以完成使用各种目录运行程序
命令行
$ ./服务器<端口><数据库路径><num_dispatcher><num_workers><queue_lenght>
$ ./客户端<目录路径><服务器端口><输出目录路径变量。将.zip文件上传到Gradescope的组成员应将其他成员添加到
他们的小组提交后。一个组中只有一个成员应上传。9.2最终提交每组中的一名学生应向Gradescope上传一个.zip文件,其中包含所有项目文件。自述文件应包括以下详细信息:
● 项目组编号
● 组成员名称和x500
● 您在其上测试代码的CSELabs计算机的名称○ 例如csel-kh1250-01.cselabs.umn.edu
● 成员个人贡献
● 对Makefile或现有文件所做的任何会影响放坡的更改
● 您所做的任何未在第7节中概述的假设
● 如何使您的程序使每个单独的请求并行化?(高层伪代码是可接受的/首选的)将.zip文件上传到Gradescope的组成员应将其他成员添加到
他们的小组提交后。一个组中只有一个成员应上传。您的项目文件夹应包括原始模板中的所有文件夹。您可以添加
将其他文件添加到这些文件夹并编辑Makefile,但要确保一切正常。之前提交您的最终项目,运行“make clean”以删除任何现有的输出/数据,然后手动删除任何错误的文件。
10.其他
1.我们将提供一组初始代码,但大部分代码将由您完成。
2.不要使用系统调用“系统”。
3.之前说过:根据需要,在调试过程中杀死所有杂散进程。
4.提供的任何二进制文件都适用于CSELAB Linux环境。不会有其他二进制文件分布式。
5.禁止ChatGPT或其他重要的“其他”代码重用。本课程的目的是边做边学,不要错过最后期限。如果您不确定任何定位的在线代码,联系我们6.另一方面,定位显示如何使用系统调用的代码片段也很好

11.准则(暂定)
● [10%]自述
● [15%]中间提交
● [15%]编码风格:缩进、可读性、适当的注释
● [20%]测试用例
● [30%]正确使用pthread_create()、pthread_join()和pthread_mutex_t,pthread_cond_t,
pthread_mutex_lock()、pthread_mutex_unlock(),pthread_cond_wait(),pt hread_cond-signal()
● [10%]错误处理--应处理系统调用错误并正常终止附加说明:
● 我们将使用安装在CSELabs机器上的GCC版本来编译您的代码。制作
确保您的代码在CSELabs上编译和运行。
● CSELabs机器列表可在https://cse.umn.edu/cseit/classrooms-labs
○ 尽量使用Keller Hall电脑,因为这些电脑是我们用来测试您的密码
● 有用的GDB手册。黄:GDB教程考夫曼:GDB快速指南

 

标签:文件,图像匹配,请求,队列,CSci,线程,图像,服务器,多线程
From: https://www.cnblogs.com/meryo/p/18108217

相关文章

  • C#中的多线程编程
    多线程编程在C#和WPF日常开发中非常常见,特别是在需要处理并发任务或者提高程序性能的场景下。以下是关于多线程编程的知识点,以及可能会在面试中被问到的一些问题和答案:多线程编程的知识点:线程和进程:线程是程序执行流的最小单元,多个线程可以共享同一个进程的资源。在C#......
  • Java多线程三种实现方式
    一、继承Thread方法publicclassMyThreadextendsThread{@Overridepublicvoidrun(){for(inti=0;i<10;i++){System.out.println(getName()+"输出内容");}}publicstaticvoidmain(String[]args){......
  • 详解 Java多线程带来的的风险-线程安全
    目录一、什么是线程安全? 二、线程不安全的原因1、线程调度是随机的2、修改共享数据:多个线程修改同⼀个变量3、原⼦性 ​编辑(1)什么是原⼦性(2)⼀条java语句不⼀定是原⼦的,也不⼀定只是⼀条指令 (3)不保证原⼦性会给多线程带来什么问题(4)可⻅性:可⻅性指,⼀个线程对共......
  • 【Java多线程】7——阻塞队列&线程池
    7线程池⭐⭐⭐⭐⭐⭐Github主页......
  • 多线程的使用
    多线程并发和并行并行:在同一时刻,有多个任务在多个CPU上同时进行并发:在同一时刻,有多个任务在单个CPU上交替进行进程和线程进程:进程简单地说就是在多任务操作系统中,每个独立执行的程序,所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看到进程)线程......
  • Java(2) ----- 异常、多线程、同步安全、死锁、并发包、Lambda表达式、Stream流
    异常方法默认都可以自动抛出运行时异常!自定义异常:(1)自定义编译时异常1、定义一个异常类继承Exception2、重写构造器3、在出现异常的地方用thrownew自定义对象抛出4、编译时异常是编译阶段就报错,提醒跟家强烈,一定需要处理!(2)自定义运行时异常1、定义一个异常类继承RunTimeE......
  • C#多线程编程详细教学
     在C#中,多线程编程是一种非常重要的技术,它允许程序同时执行多个任务,从而提高了应用程序的响应性和整体性能。本文将详细介绍C#中的多线程编程,包括基本概念、线程创建、线程同步以及相关的代码示例。一、基本概念线程是操作系统进行运算调度的最小单位,它被包含在进程之中,是......
  • cnc数据采集 ,机床数据采集,设备联网,多品牌多线程采集驱动,融合马扎克、西门子、海德汉、
    +cnccaiji采集驱动可以对不同品牌的机床信息进行管理(ip、端口、采集点位、车间、工厂、设备名称、编号)等,将采集到的数据通过mqtt或者http推送到指定地址,实现和业务系统的完全解耦。对于不了解cnc采集相关业务的公司来讲非常的友好。驱动支持系统 马扎克马扎克MAZAKCNC数据采......
  • CSci 4061 增强型自动平地机
    CSci4061:操作系统简介2024年春季项目2:增强型自动平地机中间到期时间:3/15午夜1.目标在这个项目中,你将通过多种方式扩展/增强你的自动标记。你将使用管道(管道)在自动转换器及其子级(可执行文件)之间通信信息,2)使用I/O重定向(dup2)和随机I/O(seek),3)使用消息传递队列来实现差异,并使用警报......
  • 线程池的介绍与实现(多线程代码案例)
    目录概念:ThreadPoolExecutorintcorePoolSizeintmaximumPoolsizelongkeepAliveTimeTimeUnitunitBlockingQueuewokrQueueThreadthreadFactoryRejectedExecutionHandlerhandler1.ThreadPoolExecutor.Abortpolicy2.ThreadPoolExecutor.CallerRunsPolicy3.Thre......