Linux,  Win10,  长篇积累

句柄、线程、进程、lookhandle相关知识利用

本文于2021年1月27日由AlvinCR更新

文章导引

一:基础内容

1 什么是句柄

在程序设计中,句柄(handle)是Windows操作系统用来标识被应用程序所创建或使用的对象的整数。其本质相当于带有引用计数的智能指针。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,可以使用句柄。

个人理解:句柄相当于一个特别的指针,同指针一样,都是用来指示另一个变量所在的位置,但是句柄相当于指针的plus版本,句柄自带引用计数,可以显示出自己指向的位置。

2 句柄与指针的区别

指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。(类似于封装)。通俗的说就是我们调用句柄就是调用句柄所提供的服务,即句柄已经把它能做的操作都设定好了,我们只能在句柄所提供的操作范围内进行操作,但是普通指针的操作却多种多样,不受限制。–WKI

AlvinCR理解:指针直接指向原汁原味的内存地址,而句柄则是指向被处理过的地址。使用句柄进行操作相当于通过傀儡进行操作,调用文件的时候,不是自己亲自动手,而是需要通过傀儡之手进行,也就是一个中介。指针相当于放养型的导师,虽然能使用各种资源,但是所有事情都需要自己亲自处理;句柄相当于小学老师,虽然大部分事情都帮你解决好,但是也因此丧失了自主权。

二:Linux中的句柄

1 查看线程占用句柄数

[root@alvincr ~]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 5844

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 5844

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

2 查看进程ID

Ps -ef

为了安全起见,更换另一台VPS查看后台进程,请不要在重要VPS上执行关闭命令,以免出现错误。

如果知道进程的名称,还可以直接使用 ps -ef | grep name (这里的name就是进程的名称),从下图可以看出https所占用的PID为15580

3 关闭进程

https://blog.csdn.net/lechengyuyuan/article/details/16337233

3.1 kill命令

PID为进程识别号,详细内容看附录。

使用kill -PID (这里的PID是指通过ps -ef得到的进程编号)

标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。

kill -l PID

-l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总能成功–或许仍然需要先手工杀死子进程,然后再杀死父进程。

3.2 killall命令

killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。

附:

ulimit命令

ulimit用于查看shell进程占用的资源.

如图,ulimit主要参数:

-H 设置硬资源限制.

-S 设置软资源限制.

-a 显示当前所有的资源限制.

-c size:设置core文件的最大值.单位:blocks

-d size:设置数据段的最大值.单位:kbytes

-f size:设置创建文件的最大值.单位:blocks

PS命令

更多Linux指令:https://alvincr.com/2020/05/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%95%B4%E7%90%86/

PS是Process Status的缩写,用于列出系统中当前正在运行的进程。使用此命令来确定哪些进程正在运行以及正在运行的状态,该进程是否结束,该进程是否已死,哪些进程占用了太多资源,等等。

ps -aux | grep “test.sh” #a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分

jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务。

在这里插入图片描述

PID和PPID

PID(Process Identification,即进程识别号)是程序被操作系统加载到内存成为进程后动态分配的资源。每次程序执行的时候,操作系统都会重新加载,PID在每次加载的时候都是不同的。PID是唯一的,一个PID只标识一个进程。–wiki

PPID则是父进程ID,即parent PID。

三:作用

专业领域的作用我没资格说,非计算机专业平日能够使用到句柄的地方在于:查看任务进程并关闭应用/弹窗,以WIN为例:

通过LookHandles我们可以查看弹窗资源调用情况

从这里我们既能够得到任务的句柄,还能得到名称以及进程ID。这样就能方便我们对任务进行相关的处理,也可以直接根据LookHandles提供的模块路径对本体文件进行删除修改操作。

1 LookHandles的操作:

通过LookHandles提供的接口,我们可以直接进行下面的操作:

  1. 隐藏–隐藏radar.exe窗口
  2. 显示—使被隐藏的窗口显示出来
  3. 终止线程—很多时候效果和终止进程类似(区别看附录)
  4. 终止进程—直接关闭窗口
  5. 卸载—直接卸载弹窗的程序,从此再也没有弹窗

2 资源管理器

进入任务管理器-资源管理器-CPU选项可以对句柄进行搜索。

通过LookHandles提供的线程ID值,在资源监视器中进行关联句柄的搜索,可以发现进程进程的名称,在这里可以直接选择结束任务进程。

附:

线程

进程(英语:process),是指计算机中已运行的程序。从这里可以看出进程就是这个程序的全部,如果将进程终止,那么整个程序也就会终止。

程序本身只是指令,数据及其组织的描述,等同于名词,而过程是程序的真实运行实例(那些指令和数据)。现代计算机系统可以在同一时间段内以进程的形式将多个程序加载到内存中,并使用时间共享(或时分多路复用)来显示一种处理器感觉上的同时(并行)操作。同样,使用多线程技术的操作系统或计算机体系结构(多线程意味着每个线程代表一个进程中的独立执行上下文)。同一程序的并行线程可以在多个CPU主机或网络上同时运行。 (在不同的CPU上)。–WIKI

进程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

–WIKI

总结:

以下是alvincr个人理解,如有错误请斧正

(1)服务器/windows系统相当于工厂,进程相当于工厂的车间, 线程相当于流水线。每个车间至少要有一个流水线,然而流水线并不一定属于这个车间(流水线也必须属于一个车间,不能闲着)。即:一个进程可以有很多线程来处理,每条线程并行执行不同的任务。

(2)如果想要车间生产更多的东西,就必须提供更多的流水线,因此某个任务所需资源越多,需要的线程也就越多。

(3)平时购买的CPU,会有6核12线程,在某种程度上这也类似于线程和进程的关系。每个CPU核心任何时间内仅能运行一项进程,因此对于运行多个程序的用户而言就需要购买多核处理器,以免出现卡顿的情况。

(4)进程则可以跨机器迁移并且利于资源的管理和保护,线程执行开销小并且可以在某些机器上直接运行,无需二次编译。

(5)程序在被执行的时候从CPU中抽象成进程,CPU处理进程的时候是采用时间片轮转的方式,因此会把进程给分割成多个线程。

参考:WIKI,baike

留言

您的邮箱地址不会被公开。 必填项已用 * 标注

句柄、线程、进程、lookhandle相关知识利用