进程、线程

先阐述一下 进程线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。

概念

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是 系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有 任何运行的含义,只是一个静态实体。而 进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
线程(Thread)是 进程的一个实体,是CPU调度和分派的基本单位。 线程不能够独立执行,必须依存在 应用程序中,由应用程序提供多个线程执行控制。

二者关系

线程进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一 内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。 线程可与属于同一 进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有 系统资源,只拥有一点在运行中必不可少的信息(如 程序计数器、一组 寄存器和栈)。

操作系统分类

根据 进程线程的设置, 操作系统大致分为如下类型:
(1)单 进程单线程MS-DOS就是这种 操作系统
(2) 多进程单线程,多数UNIX(及类UNIX的LINUX)是这种 操作系统
(3) 多进程多线程,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是这种 操作系统
(4)单 进程、多线程,VxWorks是这种 操作系统

引入线程的好处

操作系统中引入 线程带来的主要好处有:
(1)通过 进程来创建、终止 线程比单独地通过 应用程序来创建、终止 线程要快;
(2)同一 进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。另外, 线程的出现还有以下几个原因:
并发程序的并发执行,在多处理环境下更为有效。一个 并发程序可以建立一个 进程,而这个并发程序中的若干并发程序段就可以分别建立若干 线程,使这些线程在不同的处理机上执行。
②每个 进程具有独立的 地址空间,而该进程内的所有 线程共享该地址空间。这样可以解决 父子 进程模型中,子进程必须复制 父进程 地址空间的问题。
线程对解决 客户/服务器模型非常有效。

编辑本段进程作用

进程间通信(IPC)

Win32 进程间通信的方式主要有:
(1) 剪贴板(Clip Board);
(2) 动态数据交换(Dynamic Data Exchange);
(3)部件对象模型(Component Object Model);
(4)文件映射(File Mapping);
(5)邮件槽(Mail Slots);
(6)管道(Pipes);
(7)Win32 套接字(Socket);
(8) 远程过程调用(Remote Procedure Call);
(9)WM_COPYDATA消息(WM_COPYDATA Message)。

获取进程信息

在WIN32中,可使用在PSAPI .DLL中提供的Process status Helper函数帮助我们获取 进程信息。
(1) EnumProcesses()函数可以获取 进程的ID,其原型为:
BOOL EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD*cbNeeded);
参数lpidProcess:一个足够大的DWORD类型的 数组,用于存放 进程的ID值; 参数cb:存放进程ID值的数组的最大长度,是一个DWORD类型的数据;
参数cbNeeded:指向一个DWORD类型数据的 指针,用于返回 进程的数目;
函数返回值:如果调用成功,返回TRUE,同时将所有 进程的ID值存放在lpidProcess参数所指向的 数组中,进程个数存放在cbNeeded参数所指向的 变量中;如果调用失败,返回FALSE。
(2)GetModuleFileNameExA()函数可以实现通过 进程句柄获取 进程文件名,其原型为:
DWORD GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule,LPTSTR lpstrFileName, DWORD nsize);
参数hProcess:接受 进程句柄的参数,是HANDLE类型的 变量
参数hModule: 指针型参数,在本文的程序中取值为NULL;
参数lpstrFileName:LPTSTR类型的 指针,用于接受主调函数传递来的用于存放 进程名的字符 数组指针
参数nsize:lpstrFileName所指 数组的长度;
函数返回值:如果调用成功,返回一个大于0的DWORD类型的数据,同时将hProcess所对应的 进程名存放在lpstrFileName参数所指向的 数组中;如果调用失败,则返回0。
通过下列代码就可以遍历 系统中的 进程,获得进程列表:
//获取当前进程总数
EnumProcesses(process_ids, sizeof(process_ids), &num_processes);
//遍历进程
for (int i = 0; i < num_processes; i++)
{
//根据进程ID获取句柄
process[i] = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0,
process_ids[i]);
//通过句柄获取进程文件名
if (GetModuleFileNameExA(process[i], NULL, File_name, sizeof(fileName)))
cout << fileName << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值