Python渗透系列——TCP扫描器之多线程:threading模块(1)

微信扫一扫,分享到朋友圈

Python渗透系列——TCP扫描器之多线程:threading模块(1)

学了网络安全快一年了,都是学一会玩一会,感觉什么都没学进去,什么知识点都知道,但是一做题、一打比赛全部都要去谷歌和翻看自己以前的笔记,什么都没有记在脑子里。 在懵的时候突然看到网页上有一篇文章,这种情况可以写作博客,写的让新手都知道。这篇文章让我想起了我刚开始学的时候,刷知识点的时候都是一脸蒙,没有人带真的看不懂,所以我就加入写博客的队列中,把自己学习过程的细节全部写下来,写出一篇篇让新手通俗易懂的文章。在后续也写一些自己总结起来的笔记,方便做题渗透比赛的时候参考!!!!!

前言:

渗透测试 的初步阶段通常我们都需要对攻击目标进行 信息搜集 , 而 端口扫描 就是信息搜集中至关重要的一个步骤。 通过端口扫描我们可以了解到目标主机都开放了哪些服务, 甚至能根据服务猜测可能存在某些漏洞。 但是 端口 有那么多,一个一个扫要多久呀!!!

在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 image.baidu.com/ ,如果我们想把 图片大量的保留下来,我们就需要到 爬虫相关知识 来爬取图片。 在Python爬虫中,爬取一张图片可能需要1秒,但如果爬取一百张呢,一千张、一万张呢? 那要多长时间呀。

以上两种脚本编写证明了学习多线程的必要性, 所以这几节我们将围绕多线程并发来学习,本节将讲解· threading 如何 使用

一、多线程的相关概念

  • 计算机的核心是 CPU ,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
  • 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。(多核CPU就相当于有多个发电站,使好多车间同时运行)
  • 而一个车间可以有多个工人,他们协同完成一个任务。

这里就可以看出进程相当于车间,线程相当于工人,车间和工人都可以多个,一个车间代表一个进程,车间里有多个工人代表多个线程。

  • 车间中许多房间是工人共享的,比如很多房间工人都是可以随意进出的。这象征着一个进程的内存空间是共享的,每个线程都可以使用这些共享的内存。
  • 可是每个房间的面积都是不一样的。
  • 有些只能容纳一个人,比如厕所。同时只能容纳一个人(如果两个人的话,嘿嘿嘿!!!),里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
  • 所以进入厕所后会在外面亮灯提醒有人,等里面的人出来后你才能进去,而我们叫他它做 互斥锁 (Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
  • 还有些房间,可以容纳多人,不如饭堂。但厨房也有面积限制,比如最多10人,这时多的人就要在外面等待了。这好比某些内存区域,只能供给固定数目的线程使用。
  • 这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做 信号量 (Semaphore),在某种情况下叫做 线程池 ,用来保证多个线程不会互相冲突。
  • 不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

总结:只能容纳一个人的叫使用 互斥锁 ,能容纳多人的使用 信号量 。当然,还有其他的解决方法,这个放在后面一起细讲

信号量和 线程池 的区别,使用线程池,实际工作线程由线程池创建;使用Seamphore,实际工作的线程由你自己创建。

二、线程的周期

各个状态说明:

  • 1. New(新建) ,新创建的线程进过初始化,进入**Runnable(就绪)**状态;
  • 2. Runnable(就绪) ,等待线程调度,调度后进入**Running(运行)**状态;
  • 3. Running(运行) ,线程正常运行,期间可能会因为某些情况进入 Blocked(堵塞) 状态( 同步锁 ;调用了 sleep() join() 方法进入 Sleeping状态 ;执行 wait() 方法进入 Waiting状态 ,等待其他线程 notify 通知唤醒);
  • 4. Blocked(堵塞) ,线程暂停运行,解除堵塞后进入**Runnable(就绪)**状态 重新等待调度;
  • 5. Dead(死亡) :线程完成了它的任务正常结束或因异常导致终止;

三、并行和并发

并行是同时处理多个任务,而 并发 则是处理多个任务,而不一定要同时。 并行可以说是并发的子集。

四、同步和异步

  • 同步 的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就这样一个一个来,按顺序来
  • 异步 呢,异步的意思就是来第一位客人,点什么,点鱼,给它一个牌子,让他去一边等吧,下一位客人接着点菜,点完接着点让厨师做去吧,哪个的菜先好就先端出来

同步的优点是:同步是按照顺序一个一个来,不会乱掉,更不会出现上面代码没有执行完就执行下面的代码, 缺点:是解析的速度没有异步的快;

异步的优点是:异步是接取一个任务,直接给后台,在接下一个任务,一直一直这样,谁的先读取完先执行谁的, 缺点:没有顺序 ,谁先读取完先执行谁的 ,会出现上面的代码还没出来下面的就已经出来了,会报错;

五、死锁,饥饿与活锁

  • 死锁 :是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
  • 活锁 :是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。
  • 饥饿 :是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求……,T2可能永远等待。

六、守护线程

后台线程,是一种为其他线程提供服务的线程。 如果你设置一个线程为守护线程,,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。如果你的主线程在退出的时候,不用等待那些子线程完成。 通俗的讲:守护线程就是告诉主进程你做就好了,不要等我! 差不多等于刺客经常抢完人头就把队友买了的意思!

七、python中的GIL

GIL是什么,它叫 全局解释器锁GIL(Global Interperter Lock) ,GIL并不是Python语言的特性,它是在现实CPython解释器时引用的一个概念。GIL只在Python解释器上存在。作用是保证同一时间内只有一个线程在执行。 是不是觉得跟 互斥锁 差不多,但其实还是有差别的。

  • 线程互斥锁Python代码层面的锁 ,解决Python程序中多线程 共享资源 的问题。
  • GILCPython解释层面的锁 ,解决解释器中多个线程的 竞争资源 问题。

那这个python有了GIL不就变成单线程了吗,那还要多线程干嘛,不如去用多进程呀!! 不不不,虽然在CPU密集型任务中使用多进程比使用多线程跟节省资源,但是在IO密集型任务中,多线程比多进程效率高。 所以其实是各有优点

八、CPU密集型和IO密集型

在上面讲到了在 CPU密集型IO密集型 中那个使用多进程更好,那我们就再来讲一下CPU密集型和IO密集型的区别。

  • CPU密集型 也叫计算密集型,指的是 系统的硬盘、内存性能相对CPU要好很多 ,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
  • IO密集型 指的是 系统的CPU性能相对硬盘、内存要好很多 ,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。

往简单说,意思就是

  • CPU 密集型:程序比较偏重于 计算 ,需要经常使用 CPU 来 运算 。也就是说CPU计算占主要的任务,CPU一直处于满负荷状态。
  • I/O 密集型:顾名思义就是程序需要频繁进行 输入输出操作 。指磁盘IO、网络IO占主要的任务,计算量很小。

在python中 CPU密集型 任务主要使用多进程。例子: 复杂的加减乘除科学计算程序计算圆周率对视频进行高清解码 等大型 运算 。 而 IO密集型 任务适合使用多线程。例子: 文件处理爬虫

乌克兰逮捕不太高明的黑客Sanix

上一篇

留给A380的日子不多了 多家航司宣布退役该机型

下一篇

你也可能喜欢

Python渗透系列——TCP扫描器之多线程:threading模块(1)

长按储存图像,分享给朋友