浅谈程序设计中的线程、进程、分布式系统
-
单线程与多线程的比较:
单线程就是我们学习编程时最开始接触的,比如写一个"hello world"。而在多线程中,其共享code、data、files,同时,它们有各自的registers和stack。
简单地说,多线程有如下的复杂性特点:
1、对资源、数据的安全性:锁保护
2、原子性:数据操作是天然互斥的
3、同步等待:如wait()、notify()、notifyAll()
4、死锁:多个线程对资源互锁,造成死锁
5、容灾:任何线程出现错误,整个进程都会停止
但多线程也有如下优势:
1、内存空间共享,信息数据交互效率高
2、提高CPU的使用效率
3、开发便捷
4、轻量级,创建、销毁的开销小
-
线程与进程的比较
看到一段用英文描述的进程与线程之间的比较,感觉还不错
大概的意思是:
1、进程是重量级的,线程是轻量级的
2、进程是资源分配和保护的单元,线程是CPU使用的单元
3、进程的创建在资源项目是消耗较大的,线程创建是消耗较小的
4、程序作为进程执行相对线程慢,而线程相比进程而言快
5、一个进程不能使用其它进程所属的内存空间,线程可以共享其所属同一进程里面其它线程的内存空间
6、进程转换是消耗较多时间的,线程转换比较快
7、一个进程可以包含许多线程,一个线程属于一个确定的进程
-
进程间通信的方式
1、管道(PIPE)
2、信号(SIGNAL)
3、消息队列:Posix以及system V,现在用得较多的MQ,在不同程序间通过发布订阅、广播、主题等方式进行消息传递,主要有离线和在线。一般在线是在大规模集群上运行的,所以一般需要用钱买服务,腾讯云和阿里云等有提供这种消息队列的服务。而离线一般在小规模或单机上实现不同程序之间的消息传递,一些比较成熟的开源库有RabbitMQ,ActiveMQ,Kafka,Redis等。后面有时间再专门探讨一下消息队列。
4、共享内存:速度最快,需要结合信号量达到进程间的同步和互斥
5、信号量:用于数据同步
6、Socket:可以标准化,可以用于多机
-
分布式系统
在学习分布式系统之间,首先我们要对程序设计中的思想与步骤进行充分了解,其是一个过程:
从我们写的程序代码(program) ? 作为进程运行(process) ? 进程间通信传递消息(message) ? 消息需要封装成包(packet) ? 消息包传输之前需要规定协议(protocol) ? 消息包传输时需要网络连接(network) ? 同时需要组件的支持,如相关硬件等(component) ? 众多上述的软硬件程序以及它们之间进行通信的网络协议等构成一个分布式系统
分布式系统具有如下的优点:
概括起来,就是容错性、高可用性、修复性、持续性、大规模、可预期展示、安全
随便找了一个简要的分布式系统框架图
这里主要实现的功能时用爬虫程序(crawler)爬取数据。
搭建分布式系统时,通常需要一个Master对整个集群进行管理,可以看到,爬虫爬去的原始网页数据存入HBase,同时,Master主要起管理作用,对比如Redis和Mongo的Server任务进行管理,分配集群中分布式系统各个主机任务的优先级,同时有一个Console方便我们进行监控操作,或者通过Web Service进行可视化展示控制。
类似这种方式的分布式系统通常是Master-Slave结构,一个主机对集群的所有服务器进行管理,对整体进行控制,同时有的可以作为集群中信息共享的桥梁,与控制复杂均衡。
在分布式系统设计过程中,还有一些用到了远程调用,Socket通信等方式,后续学习。