简介:学习网络安全快一年了,总是学着玩着。我觉得我没有学到任何东西。什么知识点我都知道,但是每次做题或者玩游戏都要去google翻之前的笔记,什么都不记得了。正在发呆的时候,突然看到网页上有一篇文章。既然如此,我可以写一篇博客,让新手了解一下。这篇文章让我想起了刚开始学习的时候,刷知识点的时候总是蒙着眼睛,真的没人看不懂,所以加入了博主的队列,分享一下自己学习过程的细节。都写下来,写新手容易理解的文章。后续也会写一些自己总结的笔记,方便自己做题和渗透比赛的时候参考!!!!!前言:在渗透测试的前期,我们通常需要收集攻击目标的信息,而端口扫描是信息收集中至关重要的一步。通过端口扫描,我们可以知道目标主机上开启了哪些服务,甚至可以根据服务猜测可能存在一些漏洞。但是端口那么多,一个一个扫描要多长时间啊!!!在用户浏览网页的过程中,我们可能会看到很多好看的图片,比如http://image.baidu.com/,如果我们想要保留大量的图片,就需要爬虫相关的知识来爬取图片。在Python爬虫中,可能爬取一张图片需要1秒,但是如果爬取一百张、一千张、一万张图片呢?多久才能做到?上面两个脚本证明了学习多线程的必要性,所以在这几节中我们将学习多线程并发,这一节将讲解如何使用线程。一、多线程的概念计算机的核心是CPU,它承担着所有的计算任务。它就像一个工厂,一直在运转。假设工厂的电力有限,一次只能供一个车间使用。也就是说,当一个车间开工时,其他车间必须关闭。其背后的含义是单个CPU一次只能运行一个任务。(一个多核CPU相当于有多个电站,可以让多个车间同时运行)而一个车间可以有多个工人,他们合作完成一个任务。这里可以看出进程相当于一个车间,线程相当于一个worker。可以有多个车间和工人。一个车间代表一个进程,一个车间内的多个工人代表多个线程。车间里有很多房间是工人共用的。例如,许多房间的工作人员可以随意进出。这象征着一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。但是每个房间的大小都不一样。有的只能容纳一个人,比如厕所。只能同时容纳一个人(如果是两个人,嘿嘿!!!),里面有人的时候,其他人不能进去。这意味着当一个线程使用了一些共享内存时,其他线程必须等待它结束才能使用这块内存。所以进厕所后,外面的灯会亮,提醒别人,里面的人出来后,你才能进去,我们称之为互斥锁(Mutualexclusion,简称Mutex),防止多线程读和读同时写入某个内存区域。还有一些房间可以容纳很多人,不如食堂。但是厨房也有面积限制,比如最多容纳10人,这时候人多了就得在外面等。这就像某些内存区域只能由固定数量的线程使用。这时候的解决办法就是在门口挂n把钥匙。进去的人拿一把钥匙,出来的时候把钥匙挂回原处。后来到的人发现钥匙是空的,才知道要在门口排队。这种方法称为信号量(Semaphore),在某些情况下称为线程池,以确保多个线程不会相互冲突。不难看出互斥量是信号量(n=1)的特例。也就是说,前者可以被后者替代。但是由于mutex比较简单高效,所以在必须保证资源独占性的时候还是采用这种设计。总结:只能容纳一个人的就叫使用互斥锁,能容纳多人的就叫信号量。当然,还有其他解决方案。后面再说信号量和线程池的区别。使用线程池,实际工作的线程由线程池创建;使用Seamphore,实际的工作线程是你自己创建的。---2、线程循环各状态说明:1、新建(new),新创建的线程已经初始化,进入Runnable(就绪)状态;2.Runnable(就绪),等待线程调度,然后进入运行(Running)状态;3.Running(运行),线程正常运行,期间可能进入Blocked(阻塞)状态(同步锁;调用sleep()和join()方法进入Sleeping状态;执行wait()方法进入Waiting状态,等待其他线程通知唤醒);4.阻塞(blocked),线程暂停运行,解除阻塞后进入Runnable(就绪)状态等待再次调度;5.死(death):线程已经完成其任务正常结束或因异常终止;3、并行与并发并行是同时处理多个任务,而并发是处理多个任务,不一定同时处理。并行可以说是并发的一个子集。4.同步和异步同步的意思就是第一个点餐的人,点了一条鱼,嗯,厨师去抓鱼杀了,半小时后鱼就做好了给第一位客人,然后下一位客人,就一个一个来,异步按顺序,异步的意思是来到第一个客人,点东西,点鱼,打个招呼,让他去等,下一个客人继续点,点完了,让厨师做吧。哪道菜先做好,就会先出来。同步的好处是:同步是一个一个按顺序进行的,不会乱七八糟的,更不会在上面的代码执行之前先执行下面的代码。缺点:解析速度没有异步快;异步的好处是:异步接受一个任务,直接发给后台,然后接下一个任务。没有顺序,谁先读谁先执行,会出现上面的代码没出来下面的已经出来了,会报错;5、死锁、饥饿和活锁死锁:是指两个或两个以上进程(或线程)在执行过程中,由于争夺资源而相互等待的一种现象,如果没有外力,它们将无法推进.这时候就说系统处于死锁状态或者系统已经发生了死锁,而这些一直在互相等待的进程就叫做死锁进程。Livelock:表示线程1可以使用资源,但是很有礼貌,让其他线程先使用资源,线程2也可以使用资源,但是很绅士,让其他线程先使用资源。这样,你让我,我让你,最后两个线程不能使用资源。饥饿:表示如果线程T1占用了资源R,线程T2请求阻塞R,于是T2等待。T3也请求资源R,当T1解除对R的封锁后,系统先批准T3的请求,T2还在等待。然后T4请求阻塞R,当T3在R上释放块时,系统批准了T4的请求……T2可能会一直等下去。六、守护线程后台线程是为其他线程提供服务的线程。如果你把一个线程设置为守护线程,那就意味着你在说这个线程不重要。当进程退出时,你不必等待这个线程退出。如果您的主线程退出,您不必等待那些子线程完成。通俗地说:守护线程就是告诉主进程,你就这么干吧,别等我!几乎等同于刺客经常抢到人头后收买队友的意思!7.python中的GILGIL是什么?它被称为全局解释器锁GIL(GlobalInterperterLock)。GIL不是Python语言的特性。它是实际CPython解释器中引用的概念。GIL仅存在于Python解释器上。作用是保证同一时刻只有一个线程在执行。是不是觉得它和互斥量很像,其实还是有区别的。线程互斥量是Python代码层面的锁,解决了Python程序中多线程共享资源的问题。GIL是CPython解释级的锁,解决了解释器中多线程竞争资源的问题。那这个python有了GIL,不就变成单线程了吗?为什么需要多线程?最好使用多进程!!不不不,虽然在CPU密集型任务中使用多进程比使用多线程节省资源,但是在IO密集型任务中,多线程比多进程更高效。所以其实各有各的优势。八、CPU密集型和IO密集型。上面说了,在CPU密集型和IO密集型使用多进程比较好。然后说一下CPU密集型和IO密集型的区别。.CPU密集型也叫计算密集型,就是说系统的硬盘和内存的性能比CPU要好很多。),I/O可以在很短的时间内完成,但是CPU还有很多操作要处理,CPULoading很高。IO密集型是指系统的CPU性能远远优于硬盘和内存。此时,系统运行时,大部分情况是CPU在等待I/O(硬盘/内存)读写操作。这时候,CPULoading不高了。简单来说就是CPU密集型:程序比较偏向于计算,需要频繁使用CPU进行计算。即CPU计算为主,CPU始终处于满负荷状态。I/O-intensive:顾名思义,程序需要频繁的输入输出操作。指以磁盘IO和网络IO为主,计算量很小的任务。python中的CPU密集型任务主要使用multiprocessing。例子:复杂的加减乘除、科学计算程序、圆周率的计算、视频高清解码等大型运算。IO密集型任务适合多线程。示例:文件处理、爬虫。九、Python多线程可能用到的库。学习多线程的基础知识使用threading和queuethread—一个较旧的模块,已被threading取代。Threading——多线程使用的库multiprocessing——多进程使用的库queue——提供一个同步的、线程安全的队列类time——用于控制时间下一章会详细讲解如何使用threading
