$16 进程和线程. $16 进程和线程 进程 进程 属性 ProcessName / Id MachineName / MainModule BasePriority StartTime / ExitTime TotalProcessorTime / UserProcessorTime PrivateMemorySize64.

Slides:



Advertisements
Similar presentations
第 12 章 命 名 空 间 (时间: 1 次课, 2 学时)
Advertisements

鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
讓你的程式具有多工(Multitasking) 及多重處理(Multiprocessing)的能力
人 工 智 慧 報 告 五子棋AI設計 報告者 : 潘輝銘.
四資二甲 第三週作業 物件導向程式設計.
Memory Pool ACM Yanqing Peng.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
第二章 JAVA语言基础.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
第八章 C#高级编程.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
常用工具类.
Java语言程序设计 第七部分 多线程.
DEV 331 深度探索 Microsoft Visual C# 2.0
C# 的 Web 相關物件之使用 日期 : 2018/11/21.
第十三章 文件和注册表操作.
C#程序设计 c# programming 多线程 C#程序设计课程组.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第14章 多线程和异步程序设计 14.1 多线程程序设计 14.2 异步程序设计.
程式設計實作.
C++ with Managed Extensions
基于 C# 的 .NET Framework 程序设计
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
Java语言程序设计 第五部分 Java异常处理.
第9章 多线程 王德俊 上海交通大学继续教育学院.
委派與執行緒 建國科技大學 資管系 饒瑞佶.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
第10章 Java的线程处理 10.1 线程的基本概念 10.2 线程的属性 10.3 线程组 10.4 多线程程序的开发.
C#面向对象程序设计 $7 继承和多态性.
文件流. 文件流 文件流 Stream FileStream BufferedStream MemoryStream NetworkStream …… 所有流的抽象 Stream FileStream BufferedStream MemoryStream NetworkStream ……
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第 十二 章 C# 中的文件处理.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
C#程序设计基础 第二章 数据类型.
第六章 属性、索引器、委托和事件.
P2P聊天工具.
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
第三章 C# 基础知识.
Multithread 多執行緒 以GUI為例了解物件以及Event
第五讲 酒店客房管理系统(一) 教育部“十二五”职业教育国家规划教材
辅导课程八.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++复习2----类与对象.
嵩贊油封工業股份有限公司 小 而 美 的 管 理 簡報人: 管理部 柯美伶.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第四章 类 4.1 基础知识 4.2 构造函数 4.3 方法 4.4 属性与索引 4.5 String类
第二章 Java语法基础.
Review 1~3.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C#快速導讀 流程控制.
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Presentation transcript:

$16 进程和线程

进程

进程 属性 ProcessName / Id MachineName / MainModule BasePriority StartTime / ExitTime TotalProcessorTime / UserProcessorTime PrivateMemorySize64 / VirtualMemorySize64 PagedMemorySize64 / NonpagedMemorySize64

进程 操作 Start Kill CloseMainWindow Close

进程示例 //程序清单P16_1.cs: using System; using System.Diagnostics; namespace P16_1 { class ProcessInfoSample static void Main() Process proc = Process.GetCurrentProcess(); OutputProcessInfo(proc); proc = Process.Start("Notepad.exe"); proc.WaitForExit(500); proc.WaitForExit(); } public static void OutputProcessInfo(Process p) { Console.WriteLine("进程{0} ID{1}:", p.ProcessName, p.Id); Console.WriteLine("启动时间" + p.StartTime); Console.WriteLine("基本优先级" + p.BasePriority); Console.WriteLine("专用内存{0}K", p.PrivateMemorySize64 / 1024); Console.WriteLine("使用物理内存{0}K", p.WorkingSet64 / 1024); Console.WriteLine("使用虚拟内存{0}K", p.VirtualMemorySize64 / 1024); Console.WriteLine("使用分页内存{0}K", p.PagedMemorySize64 / 1024); Console.WriteLine("使用非分页内存{0}K\r\n", p.NonpagedSystemMemorySize64 / 1024); }

线程

线程概念 每个进程启动时都将创建一个默认线程,称为进程的“主线程”。 执行过程中始终只有一个线程的程序,称为“单线程程序”,否则称之为“多线程程序”。 每个线程都可以创建新的线程,而主线程之外的其他线程都称为“辅助线程”。

线程属性 Name Priority IsAlive / IsBackGround ThreadState

线程简单示例 //程序清单P16_3.cs: using System; using System.Threading; namespace P16_3 { class MultiThreadsSample private static Thread t1, t2; static void Main() Console.WriteLine("主方法开始"); t1 = new Thread(new ThreadStart(Method1)); t2 = new Thread(new ThreadStart(Method2)); t1.Start(); t2.Start(); Console.WriteLine("主方法结束"); } public static void Method1() { Console.WriteLine("线程1开始"); for (int i = 0; i < 100; i++) Console.WriteLine("线程1: " + i); Thread.Sleep(1); } Console.WriteLine("线程1结束"); public static void Method2() Console.WriteLine("线程2开始"); //if(t1.IsAlive) //t1.Join(); for (int i = 100; i >= 0; i -= 2) Console.WriteLine("线程2: " + i); Console.WriteLine("线程2结束");

线程应用场合 长时间等待:某些任务的执行可能需要较长的时间,这对于单线程程序就会出现阻塞甚至停止响应的情况,可以考虑使用多线程来提高程序的执行效率。 后台处理:对于图形界面应用程序来说,可以使用主线程来处理用户操作,而以辅助线程的方式在后台处理其他任务(如拼写检查,定时自动保存文件等),从而提高界面的友好性。 优先任务:有时候不同任务的执行顺序无关紧要或难以确定,但希望程序按照任务的轻重缓急程度来执行相应的代码,这就可以通过创建多线程以及设置线程的不同优先级来实现。

线程状态 Unstarted – 尚未启动 Running – 正在运行 Suspended – 已挂起 SuspendedRequested – 正在请求挂起 Aborted – 已终止 AbortRequested – 正在请求终止 WaitSleepJoin - 在等待 Background – 在后台运行 Stopped - 已停止 StoppedRequested – 正在请求停止

线程操作 Start – 启动线程 Abort – 终止线程 Interrupt – 中断处于等待状态的线程 Join – 合并线程并等待其执行完毕

线程操作示例 catch (ThreadAbortException) { //程序清单P16_5.cs: using System; using System.Threading; namespace P16_5 { class ThreadAbortSample static void Main() int count = 0; Thread[] ts = new Thread[4]; for (int i = 0; i < 4; i++) ts[i] = new Thread(delegate() try Console.WriteLine("{0}开始于{1}", Thread.CurrentThread.Name, count); for (int j = 0; j < 100; j++) Console.WriteLine("{0}: {1}", Thread.CurrentThread.Name, count++); Thread.Sleep(1); } Console.WriteLine("{0}退出于{1}", Thread.CurrentThread.Name, count); catch (ThreadAbortException) { Console.WriteLine("{0}中止于{1}", Thread.CurrentThread.Name, count); } }); ts[i].Name = "线程" + i; ts[i].Start(); Thread.Sleep(10); ts[3].Abort(); ts[2].Abort(); ts[1].Join(); ts[0].Join(); Console.WriteLine("所有线程执行完毕");

线程同步同步 线程同步带来的问题 两个线程使用同一个循环变量,一个在循环中增加变量的值,另一个则减少变量的值,就可能导致两个线程都处于死循环的状态。 在银行应用程序中,一个账户可以开设多张银行卡,那么代表不同银行卡的两个线程可能同时查询到帐户余额为1000元,而后各自从帐户上取出800元,这就破坏了银行的业务规则。

线程同步问题示例 //程序清单P16_6.cs: using System; using System.Threading; using System.Runtime.Remoting.Contexts; namespace P16_6 { class ThreadSynchronizationSample static void Main() TicketAgency ta = new TicketAgency(); Thread[] ts = new Thread[4]; for (int i = 0; i < 4; i++) ts[i] = new Thread(new ThreadStart(ta.RandomSell)); ts[i].Name = "窗口" + i; ts[i].Start(); }

线程同步问题示例 //[Synchronization()] public class TicketAgency //: ContextBoundObject { private Mutex mut = new Mutex(); private int m_num = 0; private Random rand = new Random(); public void Sell() //mut.WaitOne(); //Monitor.Enter(this); //lock (this) if (m_num < 66) //int tmp = Interlocked.Increment(ref m_num); int tmp = m_num + 1; Thread.Sleep(1); //模拟售票过程所花费的时间 m_num = tmp; Console.WriteLine("{0}:售出{1}号车票", Thread.CurrentThread.Name, tmp); }

线程同步问题示例 else { Console.WriteLine("{0}:车票已售罄", Thread.CurrentThread.Name); } //Monitor.Exit(this); //mut.ReleaseMutex(); public void RandomSell() int time = rand.Next(20); for (int i = 0; i < 20; i++) Thread.Sleep(time); this.Sell();

线程同步问题解决 Lock – 简单锁 P385 Monitor – 监视器 P386 Mutex – 互斥对象 P387 Synchronization – 上下文同步 P388 Interlocked – 互锁操作 P388

线程回调 BeginRead  IAsyncResult EndRead(IAsyncResult) Demo

线程回调示例 //程序清单P16_7.cs: using System; using System.Text; using System.IO; using System.Threading; namespace P16_7 { class AsynIOSample static void Main() FileStream fs1 = new FileStream("C:\\Windows\\setuplog.txt", FileMode.Open, FileAccess.Read); byte[] bs = new byte[20000]; //fs1.Read(bs, 0, 20000); IAsyncResult ar = fs1.BeginRead(bs, 0, 20000, null, null); long pos1 = fs1.Position; StringBuilder sb1 = new StringBuilder(); for (int i = 0; i < 100; i++) sb1.Append((char)i); long pos2 = fs1.Position; fs1.EndRead(ar); long pos3 = fs1.Position; fs1.Close(); Console.WriteLine("开始生成字符串:{0}", pos1); Console.WriteLine("结束生成字符串:{0}", pos2); Console.WriteLine("结束文件读取:{0}", pos3); }