使用fork函数创建新进程时,子进程会复制父进程的所有资源,包括程序代码、数据、堆栈等,然后在子进程中执行从fork函数开始的下一条语句。由于子进程与父进程是完全独立的,它们可以同时执行不同的任务,这就可以实现多进程并发。
使用vfork函数时,子进程并不会复制父进程的资源,而是与父进程共享同一块地址空间,直到子进程调用了exec或exit函数。因此,vfork函数比fork函数更加高效,但也更加危险,因为子进程可能会改变父进程的资源。
无论是使用fork还是vfork函数,都需要仔细设计进程之间的通信方式,以确保进程能够正确地协作工作,并避免竞争条件和死锁等问题。 *** 作系统有四个基本特征 , 如下:
1并发(concurrence)
并行性与并发性这两个概念是既相似又区别的两个概念。并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事件是同时发生的;而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。 应当指出,通常的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每个程序建立进程。进程,又称任务,简单来说,是指在系统中能独立运行并作为资源分配的基本单位,它是一个活动的实体。多个进程之间可以并发执行和交换信息。一个进程在运行时需要运行时需要一定的资源,如 cpu,存储空间,及i/o设备等。在 *** 作系统中引入进程的目的是使程序能并发执行。
2共享 (sharing)
所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。由于资源的属性不同,故多个进程对资源的共享方式也不同,可以分为:互斥共享方式 和 同时访问方式
3虚拟 (virtual)
是指通过技术吧一个物理实体变成若干个逻辑上的对应物。在 *** 作系统中虚拟的实现主要是通过分时的使用方法。显然,如果n是某一个物理设备所对应的虚拟逻辑设备数,则虚拟设备的速度必然是物理设备速度的1/n。
4异步 (asynchronism)
在多道程序设计环境下,允许多个进程并发执行,由于资源等因素的限制,通常,进程的执行并非“一气呵成”,而是以“走走停停”的方式运行。内存中每个进程在何时执行,何时暂停,以怎样的方式向前推进,每道程序总共需要多少时间才能完成,都是不可预知的。或者说,进程是以一步的方式运行的。尽管如此,但只要运行环境相同,作业经过多次运行,都会获得完全相同的结果,因此,异步运行方式是运行的。
可见, *** 作系统为了使程序并发执行而产生了进程。
进程的定义:可并发执行的程序在一个数据集合上的运行过程。
进程的特征:
1动态性 进程既然是进程实体的执行过程,因此进程是有一定的生命期。而程序只是一组有序指令的集合,并放在某种介质上,本身无运行的含义,因此程序是个静态的实体。
2并发性
3独立性 这是指进程实体是一个能独立运行的基本单位,同时也是系统种独立获得资源和调度的基本单位。
4异步性
5结构特征 从结构上看,进程实体是由程序段、数据段及进程控制块三部分组成。
(进程控制块(PCB):进程控制块是进程实体的一部分,它记录了 *** 作系统所需要的、用于描述进程情况及控制进程运行所需的全部信息。os 是根据PCB来对并发执行的进程进行控制和管理的)
关于进程的总结:
定义:可并发执行的程序在一个数据集合上的运行过程,每个进程有一个自己的地址空间以及一个单一的控制流程。
要解决的问题:为了使程序能并发执行,(要并发执行就要隔离进程,使进程独立,即每个进程有属于自己的数据段、程序段、进程控制块)
线程的出现:
我们首先回顾进程的两个基本属性:(1)进程使一个可拥有资源的独立单位 (2)进程同时又是一个可以独立调度和分派的基本单位。正是由于这两个基本属性,才使进程成为一个能独立运行的基本单位,从而构成了进程并发执行的基础。
为了使程序能并发执行,系统必须进行以下 *** 作:
(1) 创建进程。创建一个进程时必须为之人、分配所必需的、除处理器以外的所有资源,如内存空间、I/O设备以及建立相应的PCB
(2) 撤消进程。系统在撤消进程时,需要先对这这些资源进行回收,然后再撤销PCB
(3) 进程切换。在对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中的进程的CPU环境,为此须花费不少处理器时间。
简言之,由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,也正因为如此,在系统中设置的进程的数目不宜过多,进程的切换的频率也不宜过高,但这也就限制了并发程度的进一步提高。为了解决这个问题,不少 *** 作系统的学者们想到:将进程的两个属性分开,由 *** 作系统分开处理。即对作为调度和分派的基本单位,不同时作为独立分配资源的单位,以使之轻装运行;而对拥有资源的基本单位,又不频繁地对之进行切换,在这种思想的指导下,产生了线程的概念。
线程引入的原因: 为了减少程序并发执行所付出的时空开销,使os具有更好的并发性。
在引入线程的os 中,线程是进程中的一个实体(进程中的一个或多个指令执行流),是被系统独立调度和分派的基本单位。线程基本上不再拥有系统资源,(只拥有一点在运行中必不可少的资源,如程序计数器、寄存器和栈),但它可与同属一个进程的其他线程功能共享进程所拥有的全部资源。线一个线程可以创建和撤销另一个线程;同一进程中的多个线程之间可以并发执行。
线程与进程的比较:
线程具有许多传统进程所具有的特征,故又称为轻型线程或进程元;而把传统的进程称为重型进程。在引入了线程的os中,通常一个进程拥有若干个线程。下面从四个方面来比较线程与进程。
1调度
在“原始”的OS中,拥有资源的基本单位和独立调度、分配的基本单位都是进程。而在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位,使传统进程的两个属性分开,线程便能轻装运行,从而可以显著的提高系统并发程度。在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。
2并发性
在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可以并发执行,因而使OS具有更好的并发性,从而能更有效的使用系统资源和提高系统吞吐量。
3拥有资源
不论是“原始”的OS,还是设有线程的 *** 作系统,进程都是拥有资源的一个独立单位,它可以拥有自己的资源。线程自己基本不再拥有系统资源,但它可以访问其隶属进程的资源。
4系统开销
由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间,I/O设备等。因为,OS所付出的开销将显著地大于在创建或撤销线程时的开销。类似的,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU 环境设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的 *** 作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现变得比较容易。
这个机制在现代 *** 作系统的实现主要可分为两大类。即根据 *** 作系统内核是否对线程可感知,分为内核线程和用户线程。
1内核线程 无论是用户进程中的线程还是系统进程中的线程,它们的创建、撤销和切换都是由内核实现的。在内核中保留了一张线程控制块,内核根据该控制块而感知线程的存在并对线程进行控制。
2用户线程 它仅存在于用户级中,对于这种线程的创建、撤销和切换,都不利用系统调用实现,因而这种线程与内核无关。相应地,内核也并不知道用户级线程的存在。( 调度的实现方式是采用在用户空间增加运行库,这些运行库被称为“线程包”,每当用户进程获得CPU控制权,线程运行库决定该从哪里开始运行)
( 实际上,上面所说的线程是 *** 作系统调度的基本单位,实际上指的只是内核线程。 *** 作系统在调度时,参考各进程内的线程运行情况做出调度决定,如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU
在Windows 2000中, *** 作系统进行调度时根本就不理采线程是属于哪个进程的,只是将所有的就绪线程统一排成若干个优先级队列,然后进行调度。在这个情况下,线程的确成了调度的最小单位)。
关于线程的总结:
出现的背景:由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高。
要解决的问题:解决进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销的问题
解决的方法:将进程的两个属性分开,由 *** 作系统分开处理。把“独立调度、分配的基本单位”这个属性分离出来作为线程;而把进程作为资源拥有的基本单位,线程作为进程中的一个实体而存在。
应用程序域的出现:
(来自msdn)
在net出现以前,一个进程下,只能运行一个应用程序,而在,net出现后,一个进程下,可以运行多个应用程序,这都是因为应用程序域的出现。
以前使用进程边界来隔离在同一台计算机上运行的应用程序。每一个应用程序被加载到单独的进程中,这样就将该应用程序与在同一台计算机上运行的其他应用程序相隔离。
隔离这些应用程序的原因在于内存地址是与进程相关的;在目标进程中,不能通过任何有意义的方式使用从一个进程传递到另一个进程的内存指针。此外,您不能在两个进程间进行直接调用。您必须代之以使用代理,它提供一定程度的间接性。
应用程序域提供安全而通用的处理单元,公共语言运行库可使用它来提供应用程序之间的隔离。您可以在具有同等隔离级别(存在于单独的进程中)的单个进程中运行几个应用程序域,而不会造成进程间调用或进程间切换等方面的额外开销。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。
隔离应用程序对于应用程序安全也是十分重要的。例如,您可以在单个浏览器进程中运行几个 Web 应用程序中的控件,同时使这些控件不能访问彼此的数据和资源。
应用程序域所提供的隔离具有以下优点(引入原因):
在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。
能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。
应用程序域形成了托管代码的隔离、卸载和安全边界。线程是公共语言运行库用来执行代码的 *** 作系统构造。在运行时,所有托管代码均加载到一个应用程序域中,由特定的 *** 作系统线程来运行。
应用程序域和线程之间不具有一对一的相关性。在任意给定时间,在单个应用程序域中可以执行几个线程,而且特定线程并不局限在单个应用程序域内。也就是说,线程可以自由跨越应用程序域边界;不为每个应用程序域创建新线程。
在任意给定时间,每一线程都在一个应用程序域中执行。运行库会跟踪在哪些应用程序域中有哪些线程正在运行。如果同时并发3000人,那么日ip数量至少是10万以上。如果又是查询,提交等 *** 作,对数据库的压力非常大,对服务器的压力自然要求会很高,比那种单纯的html只浏览,没有互动性的网页在服务器硬件的cpu性能和磁盘性能上要求高很多。
你可以看看国产品牌正睿的这款双路四核服务器。标配一颗至强E5620四核八线程处理器(24GHz/586GT/12M缓存),英特尔5500服务器芯片组主板,2G DDR3 REG ECC 1333MHz内存,SSD 120G固态硬盘,双千兆网卡,性能可以说是非常不错。如果以后随着业务量的增长,网站并发数量更多了,觉得性能不够用了,还可以扩展到两颗处理器,达成8颗处理核心,16条处理线程(在任务管理器处能看到16个处理核心的格子- -~很NB),最大支持24GB DDR3 REG ECC高速容错校验内存。
产品型号:I2496194S-H
产品类型:双路四核机架式服务器
处 理 器:Xeon E5620
内 存:2G DDR3 REG ECC
硬 盘:SSD 120G
机 构:1U机架式
价 格:¥8999
银牌服务
重庆五年免费上门服务,全国三年免费上门服务,关键部件三年以上免费质保。
给你推荐的是国产品牌正睿的服务器产品,他们的产品性价比很高,做工很专业,兼容性,质量之类的都有保障,售后也很完善,3年免费质保,3年免费上门服务,在业界口碑很不错。大家都知道各类网络服务器程序的编写步骤,并且都知道网络服务器就两大类:循环服务和并发服务。这里附上源代码来个小结吧。
一、 循环服务
循环网络服务器编程实现的步骤是这样的:
建立socket(这里用到socket()函数及函数setsockopt())
|
|
\|/
把socket和IP地址及端口绑定(这里用到bind函数)
|
|
\|/
开始监听(这里用到listen()函数)
|
|
/\
/ \
\ / \
----------------------- | 有连接|
| / \ /
| \ /
| \ /
| |
| 接受新的连接(这里用到accept()函数)
| | /___________________________________________________
| | \ |
| \|/ |
| 从连接里读取数据(这里用到recv()系统函数,当然也可以是read()函数) |
| | |
| | |
| \|/ |
| 返回信息给连接(这里用到send()系统函数,当然也可以是write()函数) |
| | |
| | |
| /\ |
| / \ |
| / \ |
| | 还有数据 |-Y-------------------------------------------------------
| \ /
| \ /
| \ /
|_______________________________|
这种服务器模型是典型循环服务,如果不加上多进程/线程技术,此种服务吞吐量有限,大家都可以看到,如果前一个连接服务数据没有收发完毕后面的连接没办法处理。所以一般有多进程技术,对一个新连接启用一个新进程去处理,而监听socket继续监听。
/区别:
1、并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。
2、并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。
并发和并行的区别:①程序与计算不再一一对应,一个程序副本可以有多个计算。
②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、缓冲区等。
③并发程序在执行中是走走停停,断续推进的。
网站有时候报错:“>两个程序并发的判断通常需要考虑以下几个方面:
1 是否共享资源:如果两个程序需要同时访问同一个资源,比如文件、数据库、网络连接等,那么它们就可能会产生并发。如果两个程序没有共享资源,它们就不会产生并发。
2 是否存在竞争条件:如果两个程序在访问共享资源的过程中,它们的 *** 作顺序会影响最终的结果,那么它们就可能会产生竞争条件,从而产生并发。
3 是否具有时间重叠性:如果两个程序的执行时间有重叠部分,那么它们就可能会产生并发。
4 是否交替执行:如果两个程序的执行顺序没有固定的规律,或者它们会在不同的时间片上交替执行,那么它们就可能会产生并发。
综上所述,如果两个程序共享资源、存在竞争条件、具有时间重叠性或者交替执行,那么它们就可能会产生并发。可以通过观察它们的执行过程、分析它们的代码逻辑等方式来判断它们是否并发。
它们分别为:
使用new Thread()和new Thread(Runnable)形式
第一种直接调用thread的run方法,所以,往往使用Thread子类,即new SubThread()。
第二种调用
Runnable的run方法。
第一种:
new Thread(){}start();这表示调用Thread子类对象的run方法,new Thread(){}表示一个Thread的匿名子类的实例对象,子类加上run方法后的代码如下:
new Thread(){
public void run(){
}
}start();
第二种:
new Thread(
new Runnable(){}
)start();
这表示调用Thread对象接受的Runnable对象的run方法,new Runnable(){}表示一个Runnable的匿名子类的实例对象,
runnable的子类加上run方法后的代码如下:
new Thread(new Runnable(){
public void run(){
}
}
)start();TCP在真正的读写 *** 作之前,server与client之间必须建立一个连接,
当读写 *** 作完成后,双方不再需要这个连接时它们可以释放这个连接,
连接的建立通过三次握手,释放则需要四次握手,
所以说每个连接的建立都是需要资源消耗和时间消耗的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)