请教关于进程和线程占用资源的问题

请教关于进程和线程占用资源的问题,第1张

线程是一种 *** 作系统对象,代表着一个进程中要被执行的代码的路径。每一个WIN32应用程序至少有一个线程--通常称为住线程或默认线程--但应用程序可以自由地创建其他线程来执行其他任务!

进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程

线程是比进程更小的执行单位。一个进程在其执行过程能够中,可以产生 多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡过程,也是一个动态的概念。

一个程序应该只有一个进程吧,但是可以拥有多个线程。

可以说,一个执文件被运行后,就可以称为是一个进程了。但是进程只是存在内存中,实际上他是不会做任何事情的。

这个时候,起作用的就是线程了。线程是程序的执行者,一个程序至少有一个线程,但是在多线程的 *** 作系统中,可以有一个以上的线程。

其实我们可以把线程看成是我们排队买肯德鸡吃(循环的排队,一直排下去,知道我不想买了,退出)。每人都有机会到达队伍的最前端去买东西,这个就好比是线程,都有机会被程序执行。但是线程真正起作用的时候,就是我们在队伍的最前端买东西到东西买完后,这一段时间,这是线程真正执行的阶段。进程与线程

进程和线程是两个相对的概念,通常来说,一个进程可以定义程序的一个实例(Instan

ce)。在Win32中,进程并不执行什么,它只是占据应用程序所使用的地址空间。为了让

进程完成一定的工作,进程必须至少占有一个线程,正是这个线程负责包含进程地址空

间中的代码。实际上,一个进程可以包含几个线程,它们可以同时执行进程地址空间中

的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。每个进程中至少有

一个线程在执行其地址空间中的代码。如果没有线程执行进程地址空间中的代码,进程

也就没有继续存在的理由,系统将自动清除进程及其地址空间。

多线程的实现原理

创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。

然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。

在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非

如此,为了运行所有的这些线程, *** 作系统为每个独立线程安排一些CPU时间。单CPU ***

作系统以轮转方式向线程提供时间片(Quantum),每个线程在使用完时间片后交出控制

,系统再将CPU时间片分配给下一个线程。由于每个时间片足够的短,这样就给人一种假

象,好像这些线程在同时运行。创建额外线程的唯一目的就是尽可能地利用CPU时间。

多线程的问题

使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决

的问题变得容易起来。但是,不应该人为地将编写的程序分成一些碎片,让这些碎片按

各自的线程执行,这不是开发应用程序的正确方法。

线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。例如要开发一

个字处理程序,并想让打印功能作为单独的线程自己执行。这听起来是很好的主意,因

为在打印时,用户可立即返回,开始编辑文档。但这样一来,在该文档被打印时文档中

的数据就有可能被修改,打印的结果就不再是所期望的内容。也许最好不要把打印功能

放在单独的线程中,不过如果一定要用多线程的话,也可以考虑用下面的方法解决:第

一种方法是锁定正在打印的文档,让用户编辑其他的文档,这样在结束打印之前,该文

档不会作任何修改;另一个方法可能更有效一些,即可以把该文档拷贝到一个临时文件

中,打印这个临时文件的内容,同时允许用户对原来的文档进行修改。当包含文档的临

时文件打印完成时,再删去这个临时文件。

通过上面的分析可以看出,多线程在帮助解决问题的同时也可能带来新问题。因此有必

要弄清楚,什么时候需要创建多线程,什么时候不需要多线程。总的来说,多线程往往

用于在前台 *** 作的同时还需要进行后台的计算或逻辑判断的情况,而对于GUI(图形用户

接口),除了开发MDI(多文档界面)应用程序外,应尽量不使用多线程。

线程的分类

在MFC中,线程被分为两类,即工作线程和用户界面线程。如果一个线程只完成后台计算

,不需要和用户交互,那么可以使用工作线程;如果需要创建一个处理用户界面的线程

,则应使用用户界面线程。这两者的主要区别在于,MFC框架会给用户界面线程增加一个

消息循环,这样用户界面线程就可以处理自己消息队列中的消息。这样看来,如果需要

在后台作一些简单的计算(如对电子表格的重算),则首先应考虑使用工作线程,而当

后台线程需要处理比较复杂的任务,确切地说,当后台线程的执行过程会随着实际情况

的不同而改变时,就应该使用用户界面线程,以便能对不同的消息作出响应。

线程的优先级

当系统需要同时执行多个进程或多个线程时,有时会需要指定线程的优先级。线程的优

先级一般是指这个线程的基优先级,即线程相对于本进程的相对优先级和包含此线程的

进程的优先级的结合。 *** 作系统以优先级为基础安排所有的活动线程,系统的每一个线

程都被分配了一个优先级,优先级的范围从0到31。运行时,系统简单地给第一个优先级

为31的线程分配CPU时间,在该线程的时间片结束后,系统给下一个优先级为31的线程分

配CPU时间。当没有优先级为31的线程时,系统将开始给优先级为30的线程分配CPU时间

,以此类推。除了程序员在程序中改变线程的优先级外,有时程序在执行过程中系统也

会自动地动态改变线程的优先级,这是为了保证系统对终端用户的高度响应性。比如用

户按了键盘上的某个键时,系统就会临时将处理WM_KEYDOWN消息的线程的优先级提高2到

3。CPU按一个完整的时间片执行线程,当时间片执行完毕后,系统将该线程的优先级减

1。

线程的同步

在使用多线程编程时,还有一个非常重要的问题就是线程同步。所谓线程同步是指线程

之间在相互通信时避免破坏各自数据的能力。同步问题是由前面说到的Win32系统的CPU

时间片分配方式引起的。虽然在某一时刻,只有一个线程占用CPU(单CPU时)时间,但

是没有办法知道在什么时候,在什么地方线程被打断,这样如何保证线程之间不破坏彼

此的数据就显得格外重要。在MFC中,可以使用4个同步对象来保证多线程同时运行。它

们分别是临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CS

emaphore)和事件对象(CEvent)。在这些对象中,临界区对象使用起来最简单,它的

缺点是只能同步同一个进程中的线程。另外,还有一种基本的方法,本文称为线性化方

法,即在编程过程中对一定数据的写 *** 作都在一个线程中完成。这样,由于同一线程中

的代码总是按顺序执行的,就不可能出现同时改写数据的情况。

PING 指的是网速来的,和电脑影像不是很大。Ping简单明了越小越好想仔弄明白------

Ping命令的工作过程:

假定主机A的IP地址是19216811,主机B的IP地址是19216812,都在同一子网内,则当你在主机A上运行“Ping 19216812”后,都发生了些什么呢

首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“19216812”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“19216812”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表中查找出IP地址19216812所对应的物理地址(也叫MAC地址,熟悉网卡配置的朋友不会陌生,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。

从Ping的工作过程,我们可以知道,主机A收到了主机B的一个应答包,说明两台主机之间的去、回通路均正常。也就是说,无论从主机A到主机B,还是从主机B到主机A,都是正常的。那么,是什么原因引起只能单方向Ping通的呢

一、安装了个人防火墙

在共享上网的机器中,出于安全考虑,大部分作为服务器的主机都安装了个人防火墙软件,而其他作为客户机的机器则一般不安装。几乎所有的个人防火墙软件,默认情况下是不允许其他机器Ping本机的。一般的做法是将来自外部的ICMP请求报文滤掉,但它却对本机出去的ICMP请求报文,以及来自外部的ICMP应答报文不加任何限制。这样,从本机Ping其他机器时,如果网络正常,就没有问题。但如果从其他机器Ping这台机器,即使网络一切正常,也会出现“超时无应答”的错误。

大部分的单方向Ping通现象源于此。解决的办法也很简单,根据你自己所用的不同类型的防火墙,调整相应的设置即可。

二、错误设置IP地址

正常情况下,一台主机应该有一个网卡,一个IP地址,或多个网卡,多个IP地址(这些地址一定要处于不同的IP子网)。但对于在公共场所使用的电脑,特别是网吧,人多手杂,其中不泛有“探索者”。曾有一次两台电脑也出现了这种单方向Ping通的情况,经过仔细检查,发现其中一台电脑的“拨号网络适配器”(相当于一块软网卡)的TCP/IP设置中,设置了一个与网卡IP地址处于同一子网的IP地址,这样,在IP层协议看来,这台主机就有两个不同的接口处于同一网段内。当从这台主机Ping其他的机器时,会存在这样的问题:

(1)主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段;

  (2)主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去Ping其他机器,IP层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机Ping这台主机时,请求包从特定的网卡来,ICMP只须简单地将目的、源地址互换,并更改一些标志即可,ICMP应答包能顺利发出,其他主机也就能成功Ping通这台机器了。

网络测试基础:ping 命令的用法大全

ping的高级用法对于Windows下ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,当然我也并不是说我可以让ping发挥最大的功能,我也只不过经常用ping这个工具,也总结了一些小经验,现在和大家分享一下。

现在我就参照ping命令的帮助说明来给大家说说我使用ping时会用到的技巧,ping只有在安装了TCP/IP协议以后才可以使用:

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] │ [-k computer-list] [-w timeout] destination-list

Options:

-t Ping the specified host until stoppedTo see statistics and continue - type Control-Break;To stop - type Control-C

不停的ping地方主机,直到你按下Control-C。

此功能没有什么特别的技巧,不过可以配合其他参数使用,将在下面提到。

-a Resolve addresses to hostnames

解析计算机NetBios名。

示例:C:\>ping -a 192168121

Pinging icebloodyoforcom [192168121] with 32 bytes of data:

Reply from 192168121: bytes=32 time<10ms TTL=254

Reply from 192168121: bytes=32 time<10ms TTL=254

Reply from 192168121: bytes=32 time<10ms TTL=254

Reply from 192168121: bytes=32 time<10ms TTL=254

Ping statistics for 192168121:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 0ms, Average = 0ms

从上面就可以知道IP为192168121的计算机NetBios名为icebloodyoforcom。

-n count Number of echo requests to send

发送count指定的Echo数据包数。

在默认情况下,一般都只发送四个数据包,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助,比如我想测试发送50个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少就可以通过以下获知:

C:\>ping -n 50 2021039668

Pinging 2021039668 with 32 bytes of data:

Reply from 2021039668: bytes=32 time=50ms TTL=241

Reply from 2021039668: bytes=32 time=50ms TTL=241

Reply from 2021039668: bytes=32 time=50ms TTL=241

Request timed out

………………

Reply from 2021039668: bytes=32 time=50ms TTL=241

Reply from 2021039668: bytes=32 time=50ms TTL=241

Ping statistics for 2021039668:

Packets: Sent = 50, Received = 48, Lost = 2 (4% loss),Approximate round trip times in milli-seconds:

Minimum = 40ms, Maximum = 51ms, Average = 46ms

从以上我就可以知道在给2021039668发送50个数据包的过程当中,返回了48个,其中有两个由于未知原因丢失,这48个数据包当中返回速度最快为40ms,最慢为51ms,平均速度为46ms。

-l size Send buffer size

定义echo数据包大小。

在默认的情况下windows的ping发送的数据包大小为32byt,我们也可以自己定义它的大小,但有一个大小的限制,就是最大只能发送65500byt,也许有人会问为什么要限制到65500byt,因为Windows系列的系统都有一个安全漏洞(也许还包括其他系统)就是当向对方一次发送的数据包大于或等于65532时,对方就很有可能挡机,所以微软公司为了解决这一安全漏洞于是限制了ping的数据包大小。虽然微软公司已经做了此限制,但这个参数配合其他参数以后危害依然非常强大,比如我们就可以通过配合-t参数来实现一个带有攻击性的命令:(以下介绍带有危险性,仅用于试验,请勿轻易施于别人机器上,否则后果自负)

C:\>ping -l 65500 -t 192168121

Pinging 192168121 with 65500 bytes of data:

Reply from 192168121: bytes=65500 time<10ms TTL=254

Reply from 192168121: bytes=65500 time<10ms TTL=254

………………

这样它就会不停的向192168121计算机发送大小为65500byt的数据包,如果你只有一台计算机也许没有什么效果,但如果有很多计算机那么就可以使对方完全瘫痪,我曾经就做过这样的试验,当我同时使用10台以上计算机ping一台Win2000Pro系统的计算机时,不到5分钟对方的网络就已经完全瘫痪,网络严重堵塞,>

进程与程序的重要区别之一是

A程序有状态而进程没有

B程序可占有资源而进程不能

C进程有状态而程序没有

D进程能占有资源而程序不能

正确答案:进程有状态而程序没有

你的程序计算量越大,cpu负荷就越重,调度器会不断地把时间片给你的程序,但是程序还是不可能独占处理器资源,因为windows是个多任务系统。如果要独占处理器资源,需要换到类似dos这样的单任务系统中。

试试下面的方法:打开“我对电脑”,点“工具”-“文件夹选项”-“查看”,去掉“隐藏受保护的 *** 作系统文件”前面的勾,点“确定”。在C:\WINDOWS\system32\dllcache目录下查找cmdexe并将其删除,然后在C:\WINDOWS\system32目录下将cmdexe删除。之后打开注册表,分别定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run和HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run项下,查看有无cmdexe键值,有的话将其删除。看看经过以上 *** 作是否能够解决问题。

以上就是关于请教关于进程和线程占用资源的问题全部的内容,包括:请教关于进程和线程占用资源的问题、系统里占用资源比较大的程序有哪些、进程与程序的重要区别之一是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9742955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存