多线程,多进程使用过程中的问题和解决方案
次作,只是摘录,组合而成,只能参考
多线程:
一个进程中可以有多条执行路径同时执行,一个线程就是进程中的一条执行路径。
在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。它相当于一个进程里只有一个线程,进程本身就是线程。所以线程有时被称为轻量级进程(Lightweight Process,LWP)。后来,随着计算机的发展,对多个任务之间上下文切换的效率要求越来越高,就抽象出一个更小的概念——线程,一般一个进程会有多个线程。
多线程原理:线程是分配CPU资源的最小单位,单CPU多线程是时间轮片的切换,多CPU可以真正的做到多CPU同时工作。
多线程编程为程序开发带来了很多的方便,但是也带来了一些问题,这些问题是在程序开发过程中必须进行处理的问题。
这些问题的核心是,如果多个线程同时访问一个资源,例如变量、文件等,时如何保证访问安全的问题。在多线程编程中,这种会被多个线程同时访问的资源叫做临界资源。
使用互斥解决多线程问题是一种简单有效的解决办法,但是由于该方法比较简单,所以只能解决一些基本的问题,对于复杂的问题就无法解决了。
解 决多线程问题的另外一种思路是同步。同步是另外一种解决问题的思路,结合前面卫生间的示例,互斥方式解决多线程的原理是,当一个人进入到卫生间内部时,别 的人只
能在外部时刻等待,这样就相当于别的人虽然没有事情做,但是还是要占用别的人的时间,浪费系统的执行资源。而同步解决问题的原理是,如果一个人进入 到卫生间内部时,则别的人可以去睡觉,不占用系统资源,而当这个人从卫生间出来以后,把这个睡觉的人叫醒,则它就可以使用临界资源了。所以使用同步的思路 解决多线程问题更加有效,更加节约系统的资源。
多进程:
同一个时间里,同一个计算机系统中允许两个或两个以上的进程处于并行状态,这是多进程。多进程带来的好处是你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。但并行需要解决的问题是通常并行的进程比CPU数量多得多,而原则上一个CPU只能分配给一个进程,以便运行这个进程。而要让CPU同时运行多个进程,就必须使用并发技术,实现并发技术最常见的就是时间片轮转调度算法,即在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如1毫秒),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样,给用户的感觉就是并行。但实际上在任何一个时间内有且仅有一个进程占有CPU。
1、因为干活时的需求要多个进程同时访问某个文件并进行读写操作的需求因为文件并不是被同一个进程访问,而且极大可能会发生多进程争抢文件的情况,如果在同一个进程里不同的线程访问,或许还能使用线程锁的方法控制,但是跨进程时就无法解决。网上解决方法基本上都像Linux里日志文件服务一样,建立一个独立的文件操作服务,由文件操作服务来控制不同进程对同一个文件的访问。但是这样改动量就比较大,不同的程序可能用的编写的语言不同。
为了解决不同开发工具开发和效率带来的问题。
每次读写文件前先改文件的扩展名,在程序访问文件前,都必须用原文件名改名为包含签出扩展名的新文件名(现实中会将文件扩展名改为.ck),其他进程只会访问那些不是.ck为扩展名的文件。
方法:
第一、程序首先得到需要访问的原文件名(比如Test.xml)
第二、使用原文件名作为基础,改名为签出文件名(比如Test.ck)
第三、因为同一时间只可能有一个进程能够修改文件名,所以当一个进程抢先与另一个进程修改了文件,那另一个进程再次使用原文件名(Test.xml)将无法访问到这个文件(因为文件名已经被修改为Test.ck)而报错(可以屏蔽这个错误),如果修改成功则表示文件已经被你签出。你可以继续使用新的文件名对文件进行修改。其他进程如果使用原文件名将无法访问这个文件。
第四、处理完数据后将文件扩展名改回原文件名(Test.xml)原理和写数据库时抢锁类似,每次访问文件前都必须首先改名(抢锁),只有抢到锁的进程才能进行后续操作。否则则等待其他进程释放锁。
2、操作系统中多进程并行时的死锁问题,死锁是多个进程循环等待它占有的资源而无限期的僵持下去的局面。计算机产死锁的根本原因是资源有限切操作不当。操作系统进程产生的死锁的原因为两点:
1、竞争资源。当系统中提供多个进程共享的资源,不足以满足他们的需求时,引起它们的竞争而产生死锁。
2、进程推进顺序非法。进程在运行的过程中,请求和释放资源顺序不当,导致了进程死锁。
处理方法:
1、方法一
2、方法二