进程与线程的一个简单解释

*:这篇文章转载自:阮一峰的博客,原文.

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。

最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。

1.

thread1
image-1771

计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

2.

thread2
image-1772

假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

3.

thread3
image-1773

进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

4.

thread4
image-1774

一个车间里,可以有很多工人。他们协同完成一个任务。

5.

thread55
image-1775

线程就好比车间里的工人。一个进程可以包括多个线程。

6.

thread6
image-1776

车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

7.

thread7
image-1777

可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

8.

thread8
image-1778

一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫“互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

9.

thread9
image-1779

还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

10.

thread10
image-1780

这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做“信号量”(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

11.

thread11
image-1781

操作系统的设计,因此可以归结为三点:

      以多进程形式,允许多个任务同时运行;
      以多线程形式,允许单个任务分成不同的部分运行;
      提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

ExJDBC1.2.0发布

写在前面

  • ExJDBC是一个开源的,对JDBC简单重写之后的类JDBC程序;
  • ExJDBC的版权依照项目主页版权:http://dev.w1520.com
  • ExJDBC具有小型化,类结构清晰等特点.
  • 假如,你需要为ExJDBC添加代码,可以在(http://dev.w1520.com)单击”Java”,之后选择ExJDBC1.2.0_source.zip下载之后即可对其进行修改,修改之后若愿意可以pruidong#gmail.com我.

java标志
image-1767

因中文可能导致乱码问题,所以类文件均为英文注释,可以采用各种翻译工具进行还原.并且在jar包中的Test类是一个不可运行的类,里面包含了基本的示例.

脱脱拉拉的搞了好几个月,终于发上来了.

下载地址

项目主页(多个项目):http://dev.w1520.com

ExJDBC下载地址:http://dev.w1520.com/Java

多线程通信经典问题:存取钱问题

几天前在看到多线程通信问题的时候,觉得还挺头疼的,后来就画了一张图,之后就只能慢慢理解了.
这道题是这么规定的:两人,一人负责存款,一人负责取款;每次只要一存款就必须把钱取走;不能存钱两次,也不能取钱两次.

据分析,这个问题里面需要以下部分:

  1. 判断账户里面是否可以存钱(账户为空);
  2. 需要判断账户是否可以取钱;
  3. 之后需要判断一些余额什么的.

因此得出:

  • 对于存钱以及取钱的判断可以使用一个boolean变量来完成.
  • 由于多线程环境本身的不确定性,因此需要使用synchronized对存取钱方法进行同步.
  • *:给予money(钱,用于记录余额)一个get方法,但不用给予set方法.

如果没看明白上面的文字描述,可以看下面的图:

多线程通信经典问题
image-1760

懒得说了,直接甩源代码把,这个是我昨晚写的,大家可以适当进行改写,主要是理解里面的思想就行.

网站迁移进行时

步骤1:搬了吧,还是搬了

大概一个月前,我的主机商bluehost给我发来邮件(现在说来应该是以前的主机商了),说我的空间还有一个月即将到期了.于是我就开始筹措着给网站搬个家了,顺便提升一下速度,然后呢,再提升一下我的Linux技术(彼时,我正在学习Linux).于是呢,换个vps吧.去网上找了一大圈,发现真的VPS太多了,找起来很困难啊,只好随便选了一个(具体名字就不说了,因为发生了点纠纷,名称用A代替吧).立刻就下单了,A呢在24小时内,也把账号和密码都发我了,可是….可是……我怎么登陆不了控制面板??于是去ping一下,发现那个新ip竟然在国内都ping不通(去掉墙的问题,因为他们主站访问速度都很慢),也不知道当时LZ(搂住,楼主)是怎么想的,竟然在他们主站访问速度都那么慢的情况下居然还买了他们的vps……难道这是传说中的神经短路??f*ck…额,今天看到新闻说中国雅虎要关闭邮箱服务了..(貌似跟我没多大关系..)..跑题了…然后因为我就想到了退款,去网上一搜索竟然发现他们是不接受退款的,于是只好采取下策了:去Paypal投诉(忘了说,我是用Paypal买的).大概是10号左右买的,到现在钱还没退还回来……呜呜呜….这个教训告诉我,在海外购物需要慎重…再慎重……

在大概第六天的时候,我的QQ签名改成了这样:做任何事情,都不能把别人的帮助计算在内……

于是,那天晚上我做了一个决定!

买!立刻,马上买!!

步骤2:700大洋没了

没错,我又找了一个国内信誉不错的VPS服务商,最重要的是他们有中文服务(其实中英文都还好,不过有中文最好了),最最重要的是他们可以7天无条件退款!!这可是一针强心剂啊!一点也不后悔的买了,然后立刻ping了一下ip(有了上次的教训),然后一下买了好几个ip备用着(因以前被墙过一个ip),哇,访问速度很快,很牛BO啊!!万分高兴啊!!!

步骤3:苦逼的配置之路

我看了他们说vps还是不要用Apache了,用Nginx把,于是我头也不回的去了Nginx的家,只因为她说今晚只有她一个人在……

步骤是这样的,我去了控制面板,然后脱GUANG了系统的外衣(重装),一个纯净的Centos就出炉了.(交代一下,我在虚拟机里面搞过一个Centos6.3,并且还编译安装成功了Nginx+PHP+MySQL,当时觉得自己挺牛的.事实是…我想多了)于是我就像个愣头青一样热火热茶的搞配置了,找了教程,配置了大概3天,不行!各种配置不成功!!各种错误!!!找客服求助吧,这个事情还是很奇葩的,在客服将lnmp的链接发给我的时候,我也刚好找到了.

于是,lnmp我来了…..(编译安装,只需一键)

Linux+Nginx+PHP+MySQL
image-1752

步骤4:揪心的域名绑定

安装完lnmp都还好,域名绑定可难住我了(因为我有几枚二级域名),这个时间又搞了好几天,大概是什么呢,就是能绑定顶级域名,但二级域名死活绑定不上(对了,期间我还装了一个Nginx的控制面板,发现那个多余了…挺难用的..叫啥?不记得了),于是我去国外的一个论坛发帖,各种百度,各种谷歌,各种BING,结果还是不行…于是我去了CSDN论坛,用100分的”酬劳”发帖询问怎么绑定域名的.可惜……可惜……也许是Nginx知道的人太少…也许是Nginx的配置很难(纯属扯DAN)…直到我找到了答案也还是没有人回复我的帖子……

我是怎样找到答案的?且听我慢慢道来:

lnmp的安装里面明明有个添加虚拟主机的(说实话,当时我是以土鳖思维看的,因为哥原来就是虚拟主机啊啊啊啊…),我以为那个没多大用,后来才发现,那个就是添加域名的啊啊…(可以添加顶级域名,也可以添加二级域名的).不过呢,我还是搞了两份域名绑定的源码下来,下面的就是:

Nginx绑定顶级域名

Nginx绑定二级域名

好了,配置文件就是这样,如果报错记得检查一下:权限(使用ls -l,看下是否有读写权限,chmod 755 [文件或目录名,如果需要让一个目录下的所有文件都有此权限,可以这样写:chmod 755 [目录名]/* ])和用户组(有时候只能使用www用户启动,如果不是www用户及用户组,使用chown www:www [文件名或目录名] 就可以更改,如果需要改目录下跟chmod一样加上”/*”就可以了).

修改完之后,记得使用:/etc/init.d/nginx restart 重启Nginx让配置生效.

步骤5:伪静态也很坑爹啊

其实标题不是真的想说的,我真的想说的其实是–没文化,真可怕!!

因为搬过来的有wordpress,discuz这些程序,于是就需要配置伪静态,我就开始去网上找规则,找了很多都不行.

后来看到这样一句话:规则都必须写在server{ }里面.我试了试!竟然真的可以!!!

伪静态配置规则(Discuz X 系列可用):

其他规则在网上能搜索到,大家自行百度,谷歌吧.记得一定要放在server{ //规则 } 里面,不然Nginx会报错的

一点感触就是——这几天学的Linux命令比过去一年都学的多.而且我发现我越来越喜欢命令行界面了,倒是对图形化没多少赶脚了.

号外:

最后,如果最近要换vps的朋友,也可以通过diavps去购买.速度都还不错,服务也挺好的.

严肃的对待你的DNS

*:这并不是一篇讲述DNS原理的文章.

起因:邮件丢失

前几天的时候,我的一个域名快要到期了,准备续费。发现密码忘记了,于是申请重置密码(注册商:Godaddy),提示邮件已经发送。我在电脑前面等了得有一个小时,

邮件依然没有过来(咦,不会被墙了吧?)。继续申请(重复N遍,N>10),依然无果。当晚有任务,于是暂时放在一边了,上班去了。第二天回来继续搞这个问题,想起来

原来Godaddy有G+账号(若需在G+找本人,请右侧往下拉[需翻墙]),于是哥噼里啪啦的写了一大段(大概邮箱不能收到重置密码的邮件之类的),去有道翻译(请勿鄙视,

鸟语没学好,每次跟英文客服沟通的步骤都是:1.敲文字;2.–有道翻译或者Google翻译–;3.发送邮件或者其他形式),发送之后,当晚我睡觉之后客服回复了(这个环节

可以忽略,他们基本都是什么电话联系的)。哥就在这时候发现了一个Google开发的工具

(目测只适用于:GoogleApps[谷歌企业套件],遗憾的是,他们现在不让免费用了:详情),检测了一下MX记录(邮件记录),一大堆问题啊。我当时还在想,我可是用的Dnspod的国内DNS啊,应该不会有什么问题吧?

只记得所有DNS记录的TTL都是600(关于DNS的TTL值设定),检查了一下也没有问题啊。。于是就这么苦逼的过了几天…[各种焦急…]

GC部分来了

很多有过几个域名的朋友都知道一种现象—-当一个注册商续费某个域名很贵的时候,我们会选择把快到期(到期时间>60天)的域名转移到另外一个注册商(转入费用相对便宜),

这样就可以节约不少钱,而到期时间又可以延续一年。(具体操作可看图)

域名转移技巧
image-1744

是的,你没猜错,我就是这么做的。

这么做倒也没什么错误,最大的错误是:转入成功之后,我没有看新注册商那里的DNS设置(虽然转入时会设置使用原来的DNS)。问题就出现在这里了,我那会去看DNS的时候,发现竟然一个惊天秘密!注册商竟然将两个DNS服务器的地址,都设置在第一个里面了(用空格分开的),第二个设置项竟然是空的。想象如下:

  • DNS服务器1:DNS地址1 DNS地址2
  • DNS服务器2:
  • DNS服务器3:
  • DNS服务器4:
  • DNS服务器:

这样看来,出错也就可以解释了。(但并不排除GFW的问题)

解决方案

以前我一直在用he.net的DNS,用了很长一段时间,老牌DNS服务商,服务比较稳定。于是我就把DNS服务器换到国外去了,将DNS的TTL设置成86400了。