NCindy

.net 2.0平台上的高性能网络程序开发框架
随笔 - 45, 文章 - 0, 评论 - 129, 引用 - 4
数据加载中……

2007年12月18日

Windbg点滴

暂记下提纲,培训完回来慢慢写。
1. 设置

2. 下断点

3. 查看进程信息

4. 查看线程调用栈(Native&Managed)

5. 查看Managed内存

posted @ 2008-03-19 10:12 iceboundrock 阅读(52) | 评论 (0)编辑

MySQL Connector/Net 5.20安装后无法在VS2008中正常使用的问题

安装了MySQL Connector/Net 5.20之后在VS2008中新建连接,居然直接报告错误

Package Load Failure

Package 'MySQL Connector Net 5.2.0' has failed to load properly ( GUID = {79A115C9-B133-4891-9E7B-242509DAD272} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use 'devenv /resetskippkgs' to re-enable package loading.

反复安装几次都无效,只好求助万能的google了,看来这个问题还是普遍存在的,总结一下解决方法:

首先执行一条命令:msiexec /a MySql.Data.msi /qb TARGETDIR="C:\MySQL_VS",将安装包解压到C:\MySQL_VS目录中,然后复制C:\MySQL_VS\Visual Studio Integration目录到C:\Program Files\MySQL\MySQL Connector Net 5.2.0目录

然后修改注册表中的:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{79A115C9-B133-4891-9E7B-242509DAD272}

它里面的CodeBase字段中多写了一个“\”符号,删除多余的“\”之后,重启VS2008就可以了。

成名已久MySQL居然犯下这样的低级错误,真不知道是因为不重视.net还是因为他们的测试不够。

posted @ 2008-02-16 14:50 iceboundrock 阅读(228) | 评论 (0)编辑

LAMP周边点滴

SSH

这绝对是个好东东,配合putty简直是彪悍的一塌糊涂啊。

SSH首先是地球人都知道的远程登录功能,这就不说了。说几个个比较有特色的吧。

Tunnel功能

可以在Putty的Session设置界面,Connection->SSH->Tunnel中增加隧道,将一个本机的端口和一个远程的端点(Endpoint,IP:Port)关联起来。这个功能主要好处就是可以只在防火墙上开放一个22端口,防火墙后面的主机就都可以被暴露出来了,相对安全,配置起来也省力。

SSH的private key

这个可以用putty套件里面的PUTTYGEN.EXE来生成,上传公钥到到Ubuntu的~/目录中,然后用下面这串命令起用公钥

cd ~

mkdir .ssh

ssh-keygen -i -f public.pub >  .ssh/authorized_keys

再在putty中设置使用私钥进行认证,为了方便,还可以使用pagent来管理Session对应的私钥。

Putty的字体和字符集

个人感觉设置为Consolas比较好看,同时将Window->Translation中的字符集设置为UTF-8

Apache的启动、停止和重启控制

Ubuntu中使用命令:/usr/sbin/apache2ctl [start|stop|restart]

 

Xdebug

php的调试是一件比较头疼的事情,昨天还为一个很小的错误折腾到半夜2点,今天痛下决心非要找出一款合适的调试器不可。终于被我看到了Xdebug,加载这个模块之后,一个页面出现的所有未捕获异常都会用一个很简洁明了的表格显示出来,终于轻松了,还可以配合客户端进行代码级别调试。

posted @ 2008-01-22 17:53 iceboundrock 阅读(55) | 评论 (0)编辑

并行与并发编程学习心得

最近一直在学习并行与并发相关的东西,从用CCR户手册到erlang论文,从Channel 9的视频到MSDN的文章到,略有心得拿出来分享一下:

就像多任务操作系统中一个进程不能直接访问(OK,起码是不能很轻松的访问)另外一个进程的内存

思路

分离异步操作的执行方法和数据提供。一个有意义的程序执行需要两个部分:代码和数据。如果代码得到了数据之后就可以去执行了,能够并行执行的代码中,共享的数据越少越好,共享数据越少,需要锁定的地方就越少,效率提高,出错的可能降低。erlang中甚至要求两个不同的进程之间只能通过消息传递数据。

CCR使用Port来进行消息传递。port是将数据传递给代码的载体。当数据被投递到port中,port会根据元素类型将之和port上绑定的处理函数结合在一起组成一个Task,然后放入DispatcherQueue中等待执行。

 

 

并行与并发

并发与并行为啥重要有啥好处就不再多说了。谈谈并发与并行编程中常见的问题和困难吧。

  • 共享内存:传统的处理方式中,往往需要在多个并行的线程中共享数据,这是一个很容易出错的地方。锁的多了性能差,锁的少了更加可能会导致程序运行出现莫名其妙的问题。无论是CCR还是erlang,对这个问题的解决办法都很直接,避免使用共享内存,erlang更加严格,
  • 多个线程之间的同步:并发运行的多个线程之间往往是有关系的
  • 错误处理:如何找到错误的上下文,如何处理多个并发操作中部分成功部分失败的情况,都是

单元测试

 

 

单元测试之外的问题

posted @ 2007-12-23 00:08 iceboundrock 阅读(194) | 评论 (0)编辑

并发和协调运行时

原文链接

微软最近发布了为机器人编写应用的新的Microsoft Robotics Studio的预览版。这些新的工具很有趣,但是它应该比仅仅为机器人编程更加有趣。

 

Dispatcher类

当你的应用程序初始化的时候,你首先希望构造一个Dispatcher对象来管理一组线程。它实际上是一个线程池。和CLR的线程池一样,这些线程调用方法(通过delegate)来执行任务:

public sealed class Dispatcher : IDisposable {
    public Dispatcher();
    public Dispatcher(Int32 threadCount, String threadPoolName);
    public Dispatcher(Int32 threadCount, ThreadPriority priority,
        String threadPoolName);
    public ICollection<DispatcherQueue> DispatcherQueues { get; }
    ... // Other members not shown
}

当你构造Dispatcher对象时,可以把你想要的线程数传递给构造函数。在默认情况下,Dispatcher为每个CPU创建一个线程。注意,一个Dipatcher对象创建的线程数量是固定的,Dispatcher没有动态的创建或者销毁线程的逻辑。和CLR线程池不同,没有用来定期检查工作负载并动态调整线程池中线程数量的的特殊线程。这简化了Dispatcher线程池逻辑,并且使它更加高效。

当构造一个Dispatcher的时候,你还可以设定线程调度的优先级。默认情况下线程的优先级为普通。你还可以设置Dispatcher创建的线程的名称,当Dispatcher内部创建线程时,它会将线程对象的Name属性赋值为你设定的名字。这个名字可以帮助你进行调试,当你在Visual Studio中调试的时候还可以在线程窗口中看到它。

不像CLR中全局唯一的线程池,CCR允许你通过创建多个Dispatcher对象来创建多个线程池。这还使得你可以为不同类型的任务创建不同的线程池,如果你需要的话,还可以为每个线程池设定不同的优先级。

DispatcherQueue类

在你创建了一个Dispatcher之后,你将希望创建一个DispatcherQueue对象。一个DispatcherQueue维护了一个准备执行的delegate的队列。Dispatcher的线程等待有元素出现在DispatcherQueue中。通常DispatcherQueue是空的,并且Dispatcher的线程处于等待状态。当有元素出现时,Dispatcher线程苏醒,并且行该元素对应的方法。

public sealed class DispatcherQueue : IDisposable {
    // Use CLR thread pool; not Dispatcher
    public DispatcherQueue(string name); 
    public DispatcherQueue(String name, Dispatcher dispatcher);

    public virtual void Enqueue(ITask task);
    public virtual void EnqueueTimer(
        TimeSpan timeSpan, Port<DateTime> timerPort);
   
    public void Dispose();

    ... // Other members not shown
}

对于CLR的线程池,如果有1000个元素在排队,当这1000个元素被处理完之前你没有办法让一个新的元素被处理。但是在CCR中,你可以分配一个DispatcherQueue给大多数的工作项,同时分配另外一个DispatcherQueue对象给高优先级的工作项。Dispatcher对象轮循所有与之关联的DispatcherQueue,并从中取出元素。我还需要指出,如果在DispatcherQueue的构造函数中不带Dispatcher参数将可能会创建一个使用CLR线程池而不是Dispatcher的DispatcherQueue对象。

通常情况下,应用程序在初始化的时候构造Dispatcher和DispatcherQueue对象,并在程序余下的生命周期中使用它们。所以,现在我们把注意力转到那些应用程序常常构造、使用一小段时间然后就废弃的对象上。

Port和Arbiter类

一个泛型的Port<T>对象代表一个队列,队列中所有的元素类型都是T。你可以认为port是一种回调函数的参数队列,类似于ThreadPool.QueueUserWorkItem方法的state参数。

当异步操作完成,它的结果会投递到一个Port对象中。

posted @ 2007-12-18 14:47 iceboundrock 阅读(66) | 评论 (0)编辑

其它并发方法

原文链接

CCR可以表达(当需要的时候通过简单的助手方法)各种其它的并发方法,例如:

  1. .net中的异步编程模型(APM):MSDN杂志中的Concurrent Affairs文章有一些用CCR适配器助手和APM APIs来调用系统类库的例子。
  2. Futures:Futures被表达为立即从一个类中返回一个port,并且并行的激活处理函数。使用一个dispatcher queue来并行的执行调用者和被调用的代码,然后一个操作系统事件会阻塞一个等待结果的公共方法(假定一个同步未来模式(assuming a synchronous future pattern),看不懂,再汗一个-_-!!!)。为了调度未来工作项(future work items),CCR调度器设计自然的在适当的时候充分利用CPU处理能力来执行高效计划,使用用户定义的策略来进行速度控制和负载均衡。分发队列是FIFO对,但是DispatcherQueue的实现暴露了一组虚方法,允许继承类来实现LIFO,随机插入等等。
  3. 连接(joins):连接编程在操作系统中出现已经有很长时间了(WaitForMultiple, I/O Completion ports in NT, etc),CCR更加用动态连接和多元素接收器对连接进行了扩展。
  4. 传统的线程原语,例如读写锁、锁和监控器(monitors):CCR可以通过port和仲裁器来表达线程同步原语,并且取代显式的对共享内存的锁定。问题就从保护共享内存变成了调度和协议设计。

posted @ 2007-12-18 10:36 iceboundrock 阅读(70) | 评论 (0)编辑