操作系统中进程和线程的概念理解
进程,是指可以在操作系统中独立运行并且作为资源分配的基本单位。多个进程之间可以并发执行(注意这里的并发执行和并行执行并不是一个概念)。
不同进程之间的切换会浪费较高的系统资源,为了提高系统资源利用率和吞吐量。人们又引入了线程的概念。
线程,是操作系统中作为调度和分派的基本单位,可以理解为轻量级进程。一个进程下可以拥有一个或多个线程,线程在系统中也不能独立于进程之外而存在。
所谓线程,比进程拥有更少的资源,并且同一进程下的不同线程之间可以共享该进程所拥有的资源。所以当进行线程切换时系统的开销明显小于进程切换。
线程的并发性比进程要高,这是由线程的基本属性决定的。线程能够更好的支持多处理机系统。
对于线程的理解可以联系程序中的函数,程序中入口函数main()便是主线程,至于多线程编程就是新建线程函数使得新的函数能和main()函数同时执行(注意这里的同时执行仅仅是我们将任务交付给系统,至于系统底层是并发执行还是并行执行并不是我们能决定的)。
注:
1、 并行执行和并发执行的区别:
a) 并行执行为多个处理机同时对不同的线程任务进行运算处理(现在好多电脑都是多核处理器,所以能进行真正意义上的并行运算)
b) 并发执行为单个处理机以时间片轮转的方式对多个线程进行处理,宏观上用户体验为同时发生的状态。(因为时间片很短通常以毫秒为单位)
c) 现在Hadoop框架便是建立在集群的基础上,通过对多个服务器的协调实现并行运算。
2、 系统底层执行方式与编程无关
a) 值得说明的是我们编程时还要考虑同步问题,这是因为系统底层的操作相对于我们是封装的,我们将多个线程交付给系统后,得到的只是顺序混乱的结果。就像我们将条理分明的猪肉放入碎肉机得到的是肥瘦混合的五花肉一样。
b) 对于这样的五花肉并不是我们想要的结果,这样没有保证程序在每次执行后的结果一致性。这样的程序是不可靠的。所以我们在编程时还要考虑多线程的同步问题。
c) 另一点要区别的是操作系统中的线程同步和编程中的线程同步。编程中的线程同步原因上面已经说明,而操作系统中的线程同步则是因为CPU将内存中的数据拷贝至寄存器时进行不同的运算后重新放入内存时产生冲突。这里可以类比下数据库中的并发控制中的“脏”数据问题。