进程

文章来源:http://www.cnblogs.com/prime/archive/2009/05/24/1488345.html
啥是进程?简单的说就是一个正在运行的程序。比如打开QQ,就是一个进程。

  啥是线程?简单的说就是进程的细分。进程好比西瓜,线程就是西瓜片。切丫切,想切几个切几个。不过一个进程有1个到N个线程。

  进程与线程的区别?进程是系统分配各种资源(比如内存)的单位,而线程是系统分配CPU时间的基本单位。为啥不以进程为分配CPU时间单位呢?因为进程运行于一个特定的进程上下文,它拥有很大的数据量,保存着各种让进程生存的环境信息。如果以进程为单位分配CPU时间,就需要频繁的保持和重建这些上下文,耗费大量的时间和空间,因此聪明的程序员就想到了以更小的单位——线程来分配CPU时间。

  如果A进程有1个线程,而B进程有9个线程,那么A的CPU分配时间则是1/10,B为9/10。很简单,概率嘛!

  操作系统讲CPU时间分为极小的时间片,轮流给每个线程分配一个时间片,而CPU速度很快,因此每个线程运行和挂起的间隔时间很短,这就造成了用户感觉所有的程序都是并行执行的假象。当然,在多核CPU中,确实是并行执行的,不过每次执行的线程数都有限,还是有大量的线程被挂起。因此,硬件发烧友喜欢“超频”CPU,这样频率快了,同一时间线程的执行时间长了,因此程序就快了。不过因为工艺和发热量以及成本的原因,芯片频率无法直线上升,因此多核心处理器就出现了。以后的趋势是多核心CPU,多核心GPU,多通道内存,磁盘阵列。云计算的基础其实就是大量连接到一起的普通计算机。

  那么.NET上的进程与线程是什么样的呢?

  托管?熟悉吧?.NET就是一个托管环境。我们用C#创建的进程与线程叫做”托管进程“”托管线程“。而对而言,用C++编写和创建的都是”本地进程“。一个托管进程对应一个本地进程,而一个托管线程则不一定对应一个本地线程!托管线程由CLR来负责管理。我们常用的异步委托创建的代码是由托管线程池来执行的。如果我们BeginInvoke了10个异步委托执行请求,但实际上不一定对应10个操作系统本地线程,也不一定对应10个线程池线程。一般而言,10个异步请求使用的本地线程都会少于10个,除非你那10个请求都是long long time的。否则CLR会用1个托管线程执行多个异步请求,最终的线程数量少于10个。

  句柄(handle)是一个标识符,用于代表操作系统的各种资源,比如窗体、绘图对象、进程线程对象、文件等,都有一个句柄。操作系统可用的句柄数是有限的。因此,应尽量避免占有过多的句柄,用完之后要及时归还系统。在.NET中,我们用FileStream打开一个文件,用完之后一定要释放资源,就是这个道理。相关的.NET概念是Dispose方法。在.NET中,使用文件、内存流,网络、GDI+对象等等都需要显示调用close()或者Dispose()方法。

  .NET相关进程类在System.Diagnostics 命名空间下:Process 类提供下列功能:监视整个网络的系统进程以及启动和停止本地系统进程。除了检索运行进程列表(通过指定计算机、进程名称或进程 ID)或查看有关当前可访问处理器的进程的信息之外,还可以获取有关进程线程和模块的详细信息,其方法是通过 Process 类本身,以及分别通过与 ProcessThread 和 ProcessModule 类进行交互来获取。利用ProcessStartInfo 类,您可以指定用来启动新进程的多种元素,如输入流、输出流、错误流、工作目录以及命令行谓词和参数。它们使您能够对进程的行为进行细微的控制。其他相关类用于指定窗口样式、进程和线程优先级以及与线程和模块的集合进行交互。

  好了,这篇主要是打个基础。结尾说到了类,下篇我们就详细介绍类和方法的使用。同时,下篇会讲更重要的话题——进程间通信!

  PS:发现写博文蛮累的啊,耗费大量的时间……

文章来源:http://www.cnblogs.com/prime/archive/2009/05/31/1493249.html

这篇主要是实践。因为进程的使用就是类库和方法的使用,因此不做详细阐述,以例子带过。

  一、进程基本操作:

  1. 启动进程。使用Process.Start()。比如Process.Start("IExplorer.exe", "www.cnblogs.com")将启动IE并打开博客园。如果要启动的程序路径不在Windows环境变量中,则必须指明其绝对路径。Process.Start("1.doc")将启动Word并打开1.doc。这是因为“文件关联”了doc类型到Word程序。

  2. 向启动的进程传送信息。使用类ProcessStartInfo。

ProcessStartInfo

  3. 使用进程谓语。进程谓语就是应用程序支持的操作,每个操作对应一个命令行参数。我们可以由ProcessStartInfo.Verbs数组得到支持的所有谓语。

进程谓语

 

  

  其实谓语对应 /p %1命令行参数。在.NET中,ConsoleApplication可以直接从string[] args里面读取谓语参数。

从args读取谓语参数

 

从Envirment取谓语参数

 

  4. 终止一个进程。对于可视化界面的Windows程序,可以调用processInstance.CloseMainWindow()和Kill()。注意:不可以嗲用实例方法processInstance.Close()。因为Close()方法其实就等同于Dispose()方法,只是释放资源,而不是杀死进程。通过调用CloseMainWindow()方法发出的结束进程运行的请求不会强制应用程序推出,它相当于用户直接单击主窗体上的“关闭”按钮,发出退出指令。应用程序可以再退出前请求用户验证,也可以拒绝退出。而Kill()则是请求操作系统直接结束进程,不给进程保存数据的机会。


  二、进程间通信:

  1. 使用剪贴板通讯。剪贴板对应的类是静态类System.Windows.Clipboard(WPF)。原理就不说了,大家都用过,是一个内存共享区。可以看下面的例子。利用Clipboard可以在不同进程间通过剪贴板传送自定义对象。

 

 

 

 

 

  2. 使用FileSystemWatcher实现进程同步。FileSystemWatcher是.NET Framework提供的一个组件,它可以监控特定文件夹或文件的变化。因此,这种方法是通过共享文件来实现进程间通讯。我们可以在2个进程监听同一个文件并执行当文件改变时的策略。

 

 

 

 

 

 

 

FileSystemWatcher

 

  3. 通过COM接口控制进程。这个一般在跟Office通讯时候使用,这里不再详述,可以参考Office示例。

 

  最后,教大家一招,快速发送Email:

Send Email

 

  OK,这次进程的课程到此结束。好累哇………

利用Clipboard存取数据
使用自定义对象进行进程间交互

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值