进程和程序的本质区别是动态和静态特征,进程和程序的本质区别是前者为动态的后者为静态的?

进程:是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 每个进程有独立的代码和数据空间,程序之间切换会有较大的开销。操作系统能同时运行多个进程(程序)。

线程:是任务调度和执行的基本单位。线程可以看在轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈(局部变量)和程序计数器(PC),无单独地址空间,线程之间切换的开销小。同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行),线程共享进程的内存空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮。对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

一、问题:如果程序或系统比做一栋住宅,进程比作此栋楼中一套房子,会是怎么样?

进程和程序的本质区别是动态和静态特征,进程和程序的本质区别是前者为动态的后者为静态的?

楼、房间与进程、线程关系


1、一栋楼好比一个程序,业主的房间好比一个进程,不同业主的房间对应不同的进程,也就是说一个程序可以有多个进程。

2、房间里的居住者就像线程,他们的活动,对应线程执行的内容。如果只有1人,则为单线程,如果多人,则为多线程

3、同一房间里的不同人,可以做同样的事,看电视、洗澡、做饭等。比如我们常用的 telnet,可以多人同时登陆设备,也比如WEB服务器访问。 同时登陆的用户操作可以不一样,但可操作范围一致,因为在同一个房间里,大家可使用的东西一样,也正如多个同类线程执行的代码段一样,它们共享进程内存空间,即共享房间里任何物品和空间。

二、问题: 多线程之间会存在什么关系?

1、同居室的居住者们,由于他们共享房间内所有,所以不会像单人居住那样,无论什么时候都可以干自己想做的事。 比如如果卫生间有人,有人在洗澡,另外的人必须要等待,等待当前在用的人释放出卫生间,大家想想如果同时一起用会存在什么后果?正如线程一样,如果同时操作全局变量或其它动态内存空间,需要信号量来解决互斥问题,只有等当前线程释放出资源,其它线程才能使用。

2、比如同居室的两位居住者,共同完成今天中午的饭菜。线程是A和B两人,执行的程序是做饭和吃饭,局部变量有食材、水、燃气等,A买的食材为肉和其它辅材、B买的食材为鱼和其它辅材,可以看出他们定义的局部变量值不完全一样,于是他们进行按代码流程,同时执行做菜,A产出了一道酸菜鱼,B产出了一道回锅肉。 A和B输出的饭菜是共享的(可以理解为全局变量),然后一起吃饭,如果A看中了鱼头,那B就得让出,因为只有一个鱼头,存在竞争关系。

3、一个进程也会存在两个或多个执行程序不一样的线程。同样拿做饭菜来说,比如A、B、C、D四人协同完成,A主要负责炒菜和炖汤,B、C分别准备两道菜的食材,D准备汤的食材,如果B、C、D谁先准备好,A就先炒他的菜。 对应我们程序中,创建4个线程,用消息队列方式来完成上述处理流程,A线程为收消息并处理消息,B、C、D线程运行准备食材程序,完成后用消息方式发送给A。

三、问题: 多进程之间会存在什么关系?

1、不同楼室的业主,对应不同进程。它们拥有各自不同的家具、设备、人物。不同业主之间的活动轨迹、信息等都是互相无关,且隐秘。对应不同进程应该执行不同的动作和代码,且拥有各自的内存空间,且互不影响,即使一个进程挂死了,也不影响另外一个进程。比如A业主是长沙的,B业主是武汉的,他们的房子装修等很多信息不一样。

2、同一栋的业主们,他们使用的照明灯、应急灯、楼道等,属于大家共享,类似于进程之间的共享内存。一般共享内存的使用由某个固定进程来写,其它进程为只读。比如应急灯、照明灯由物业来开和关,业主们可以享受其作用。楼道有专门的人来打扫,由专人来负责晒被子等,其它进程也想晒,就发给专门的负责人来代做。 如果没有这个机制会怎样? 如果同时来且想晒同一处,怎么处理,如果后面的人把前面的人的被子覆盖了怎么办? 专人处理,可以知道当前被子晒的时间,状况,以及来自于谁,谁优先,目的达到了让出资源等好处。

3、当然不同进程之间也会存在信息交互,比如A业主楼上漏水,那他就找楼上业主B协商处理,于是他通过坐电梯或楼梯到B,类似进程之间、用户空间和内核通信的NETLINK协议,此协议是socket IPC机制,但区别于TCP/IP通信,具有效率高特点,因为A无需问路或查找就能找到B。 但如果A要去其它栋或别的小区某业主C,讨论事情。那就需要通过 TCP/IP通信机制,因为A和C运行在不同的系统或物理设备上,A去C需要根据C的地址,来交换和路由,一步一步按照路径才能达到C。

四、问题:多进程之间通信还有哪些方式?

1、管道:无名和有名管道。无名管道是半双工,只能有血缘关系,不能反复读,用得少。 有名FIFO,可以多端读和写,无血缘关系要求,一般用于小数据量通信,管道的应用较少。

2、消息队列:进程之间通信一般不用消息队列。 没有容灾机制,没有弹性收缩。比如队列,一般处理完后,不提供返回结果给发送端,因为是异步操作。且队列容易满,一旦某个消息处理时间过长或进入死循环,会导致后面的消息都无法处理。

五、留给大家的几个思考问题,欢迎留言。

1、不同进程可以运行同一个函数吗? 还可以定义同一函数名的函数吗?

2、不同进程可以定义同样的全局变量吗?

3、如果一个全局的变量(比如设备端口数)需要在系统中所有进程中运转使用,应该怎么来设计代码较好?

4、我们一个大型系统中的代码,为什么有些文件中的函数不能直接调用,而有些文件中的函数在大部分进程中都能直接调用?

5、父子进程之间的关系? 对照代码判断Vfork和fork区别?

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.dasum.com/226981.html