跳转到主要内容

进程

进程的核心概念与底层原理

1.进程的本质

  • 作系统视角
    • 地址空间
    • 资源隔离
    • 进程控制块(PC进程控制块(PCB) :进程控制块(PCB) :作系统内核维护的进程元数据,包括:
      • 程序计数器(PC)、寄存器状态。
      • 虚拟内存映射、线程列表、打开的句柄。
      • 进程优先级、CPU 时间片、I/O 状态。

2.进程的创建与终止

** C#C# 中创建进程

夏普


using System.Diagnostics;

// 启动外部进程(如计算器)
Process calculator = new Process();
calculator.StartInfo.FileName = "calc.exe";
calculator.Start();

// 启动带参数的进程
Process notepad = new Process();
notepad.StartInfo.FileName = "notepad.exe";
notepad.StartInfo.Arguments = "test.txt";
notepad.Start();

// 同步等待进程退出
notepad.WaitForExit();

进程终止

夏普


// 强制终止进程
if (notepad.ProcessId > 0)
{
notepad.Kill();
notepad.WaitForExit();
}


3. 进程间通信(IPC进程间通信(IPC)

进程间通信是高阶编程的关键,以下是常见的 IPC 方法及 C# 实现:


3.1 管道(Pipe)

  • 匿名管道
  • 命名管道

示例:命名管道服务器与客户端 '''c

夏普


// 服务器端(接收数据)
using System.IO.Pipes;

NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
pipeServer.WaitForConnection();
byte[] buffer = new byte[1024];
pipeServer.Read(buffer, 0, buffer.Length);
string message = Encoding.UTF8.GetString(buffer);
Console.WriteLine($"Received: {message}");

// 客户端(发送数据)
NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut);
pipeClient.Connect();
byte[] data = Encoding.UTF8.GetBytes("Hello from client!");
pipeClient.Write(data, 0, data.Length);

3.2 共享内存(Shared Memory)

  • 原理 MemoryMappedFile在进程间共享内存区域。
  • C# 实现
夏普


// 服务端创建共享内存
using System.IO.MemoryMappedFiles;

var mmf = MemoryMappedFile.CreateNew("MySharedMemory", 1024);
using (var writer = mmf.CreateViewStream())
{
byte[] data = Encoding.UTF8.GetBytes("Shared Data");
writer.Write(data, 0, data.Length);
}

// 客户端读取共享内存
using (var mmf = MemoryMappedFile.OpenExisting("MySharedMemory"))
using (var reader = mmf.CreateViewStream())
{
byte[] buffer = new byte[1024];
reader.Read(buffer, 0, buffer.Length);
string message = Encoding.UTF8.GetString(buffer);
Console.WriteLine($"Received: {message}");
}

3.3 Windows 特有 IPC

  • 窗口消息(HWND) SendMessagePostMessage传递消息。
  • 内存映射文件(MapViewOfFile)
  • 命名事件(Event)

夏普


// 创建命名事件(Windows API)
using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);

IntPtr hEvent = CreateEvent(IntPtr.Zero, true, false, "Global\\MyEvent");


4.进程同步与安全

4.1 进程同步

  • 互斥量(Mutex

    互斥量(Mutex)

    夏普


    using System.Threading;

    Mutex mutex = new Mutex(false, "Global\\MyMutex");
    mutex.WaitOne(); // 获取锁
    // 临界区操作
    mutex.ReleaseMutex(); // 释放锁
  • 信号量(Semaphore)

    夏普


    Semaphore semaphore = new Semaphore(2, 2, "Global\\MySemaphore"); // 最大允许2个进程同时访问
    semaphore.WaitOne();
    // 资源访问
    semaphore.Release();

4.2 进程安全

  • 权限控制
    夏普


    // 创建受保护的命名管道
    var pipeSecurity = new PipeSecurity();
    pipeSecurity.AddAccessRule(new PipeAccessRule("Everyone", PipeAccessRights.ReadWrite, AccessControlType.Allow));
    var pipeServer = new NamedPipeServerStream("SecurePipe", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, pipeSecurity);


5.进程的高级特性

5.1 进程优先级与调度

夏普


// 设置进程优先级
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;

// 获取进程详细信息
foreach (Process process in Process.GetProcesses())
{
Console.WriteLine($"PID: {process.Id}, Name: {process.ProcessName}, Priority: {process.PriorityClass}");
}

5.2 进程调试与注入

  • 调试进程

    夏普


    Process targetProcess = Process.Start("notepad.exe");
    targetProcess.EnableDebugging = true;
  • 进程注入(需管理员权限)

    夏普


    // 使用 P/Invoke 调用 Windows API 注入 DLL(示例)
    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll")]
    static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

    // 具体实现需结合 WriteProcessMemory 和 CreateRemoteThread


6.WPF 中的进程管理

6.1 异步进程启动

夏普


// 在 WPF 中异步启动进程
private async void StartProcessAsync()
{
var process = new Process { StartInfo = { FileName = "notepad.exe" } };
await Task.Run(() => process.Start());
MessageBox.Show("进程已启动");
}

6.2 进程与 UI 线程交互

夏普


// 在后台进程完成时更新 UI
private void ProcessExited(object sender, EventArgs e)
{
Dispatcher.Invoke(() =>
{
ResultTextBlock.Text = "进程已退出!";
});
}

process.Exited += ProcessExited;


7.进程的高级应用场景

7.1 进程沙箱化

  • 隔离危险作
    夏普


    // 启动沙箱进程
    ProcessStartInfo psi = new ProcessStartInfo("sandbox.exe");
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;

    Process.Start(psi);

7.2 进程集群与负载均衡

夏普


// 启动多个工作进程
for (int i = 0; i < Environment.ProcessorCount; i++)
{
Process.Start("worker.exe", $"--id={i}");
}

7.3 进程监控与自动化

夏普


// 监控特定进程
private void MonitorProcess()
{
while (true)
{
foreach (var process in Process.GetProcessesByName("notepad"))
{
if (process.Responding == false)
{
process.Kill();
}
}
Thread.Sleep(1000);
}
}


8.进程的底层实现与优化

8.1 虚拟内存管理

  • 内存页大小
  • 优化内存使用
    夏普


    // 避免内存泄漏
    using (var mmf = MemoryMappedFile.CreateNew("MyMMF", 1024))
    {
    // 使用共享内存后自动释放
    }

8.2 进程调度优化

  • 实时进程
    夏普


    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;

8.3 进程资源监控

夏普


// 监控进程 CPU 和内存使用率
private void MonitorProcessResources()
{
Process target = Process.GetProcessById(1234);
while (!target.HasExited)
{
Console.WriteLine($"CPU: {target.TotalProcessorTime}, Memory: {target.WorkingSet64} bytes");
Thread.Sleep(1000);
}
}


9.高阶技巧与陷阱

9.1 进程间死锁预防

  • 避免循环依赖
  • 超时机制
    夏普


    // 带超时的等待事件
    if (WaitHandle.WaitAny(new[] { mutex, timeoutEvent }) == 0)
    {
    // 成功获取锁
    }

9.2 内存泄漏检测

  • 使用System.Diagnostics 
    夏普


    var performanceCounter = new PerformanceCounter("Process", "Working Set - Private", Process.GetCurrentProcess().ProcessName);
    Console.WriteLine($"内存使用:{performanceCounter.NextValue()} bytes");

9.3 跨平台进程管理

夏普


// 使用跨平台库(如 System.Diagnostics.Process)
Process.Start(new ProcessStartInfo("ls", "-l") { UseShellExecute = false });


10.实战案例:WPF 多进程架构

案例:分布式计算服务

夏普


// 主进程(WPF UI)
public partial class MainWindow : Window
{
private List<Process> workers = new List<Process>();

private void StartWorkers()
{
for (int i = 0; i < Environment.ProcessorCount; i++)
{
var worker = Process.Start("Worker.exe", $"--id={i}");
workers.Add(worker);
}
}

private void StopWorkers()
{
foreach (var worker in workers)
{
worker.Kill();
}
}
}

// 工作进程(Worker.exe)
static class Program
{
static void Main(string[] args)
{
// 从命令行参数获取 ID
int workerId = int.Parse(args[0].Split('=')[1]);

// 执行计算任务
while (true)
{
// 通过管道或共享内存返回结果
}
}
}


总结

掌握进程相关知识需要深入理解作系统的底层机制,同时结合 C# 的高级 API 和 Windows 核心功能。设计复杂的分布式系统、高性能服务或安全敏感的应用程序。高阶技巧包括:

  1. 进程隔离
  2. 高效 IPC
  3. 性能调优
  4. 安全性