20155223 第八周课下练习2

20155223 第八周课下练习2

练习要求

把课上练习3的daytime服务器分别用多进程和多线程实现成并发服务器并测试。
我为什么没有在课上完成?没有什么,时间不够,仓促间编写出来的服务器和客户端代码又不能很好地收发信息,不敢将不成熟的截图上交。新编写出来的程序能够很好的收发信息,但是并不是采用多线程或多进程方式编写的。必须要先学会多线程和多进程才能编写出合格的代码。

编写前工作

多线程

要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应于Visual C++中的CwinThread类对象。单独一个执行程序运行时,缺省地包含的一个主线程,主线程以函数地址的形式出现,提供程序的启动点,如main()或WinMain()函数等。当主线程终止时,进程也随之终止。根据实际需要,应用程序可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。
一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。
多线程意味着能够在单一时间内完成多项任务,各任务可以快速且方便地共享数据,但是多线程编程有很大的可能会出现一个任务在等待一个永远不会到达的命令(死锁)。

实现结果

多进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
多进程的实现需要使用到fork()。当服务器接受到请求时,执行fork(),由其产生的子进程来响应客户端的呼唤(?)。不过,子进程必须在客户端断开后及时收回,不然将会出现大量的僵尸进程来抢内存。

实现结果

代码查看

参考资料

《深入理解计算机系统 Version 3》第十二章
多线程编程基础知识
Linux下的多进程编程

原文地址:https://www.cnblogs.com/battlefieldheros/p/7818641.html