一、程序与进程
二、线程的引入
在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程。但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行。因此线程被引入操作系统。
实际生活中:
当我们将onenote设置为5分钟自动保存一次,onenote一方面监听打字输入状态;另一方面还要对草稿进行保存。假设如果这个进程只有一个线程的话,当对草稿进行保存时,因为此时需要访问硬盘,访问硬盘的线程是阻塞状态,这时任何输入都没有反应,用户体验度极差。而使用多线程,每个线程仅仅需要处理自己那部分应该完成的任务,而不用关心和其他线程的冲突。例如下图
进程很多优点,提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可提高计算机利用率,既然进程如此优秀,为什么还需要线程?进程的缺点:
(1)一个时间干一件事情
(2)执行过程中阻塞,整个进程就会挂起,无法进行
实例:
某个服务员负责3个餐桌就餐工作,主要为为客户点菜、安排上菜、最后安排整理餐桌共3个环节。而如果只提供进程的话,服务员只能为一个餐桌服务,而现实生活中一个服务员可同时为3个餐桌服务。也就是给一个安排上菜后,可以去为另一个餐桌点菜。同时为3个餐桌提供并行服务,这样可以提高工作效率。而实际操作系统中,也同样引入了这种类似的机制——线程。
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
b.通信:进程间通信,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.调度和切换:线程上下文切换比进程上下文切换要快得多。
主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
优点:内存隔离,单个进程的异常不会导致整个应用的崩溃。方便测试,编程简单。
缺点:进程间调用,通讯和切换均比多线程大,耗资源。
使用场所:目标子动能交互少,如果资源和性能许可,可以设计由多个子应用程序来组合完成目的
多线程
优点:提高系统的并行性,并且开销小。数据共享方便(不需要进程间的通信)
缺点:没有内存隔离,单个现成的崩溃会导致整个应用程序的退出,发生采内存等bug时,定位及其不方便。编程复杂;调试困难;线程执行的随机性可能导致逻辑混乱,甚至发生死锁现象;
使用场所:在存在大量IO,网络等耗时操作,或者需要和用户交互时,使用多线程有利于提高系统的并行性和用户界面快速响应从而提高友好性。
多进程与多线程只是表面上了解了,还需要多去实践。