进程和线程的区别

来源:互联网 发布:怎么用淘宝微淘 编辑:程序博客网 时间:2024/06/06 12:20

最近面试,总是被问到这个问题,以前觉得自己理解的很好,但是发现自己弄的很糟。
所以整理一下哈哈。

举个例子

一个小区里面有100坐规格大小一样的房子,每个房子就是一个个进程,虽然看起来都一样
但是里面的人or事物是不一样的,但是有一个共同点他们都有自己的空间,他们之间没有
影响。这就是进程的特点具有天然的独立空间。但是社会是由多人组成的,必然需要交流。
邻居之间如何交流呢,只能通过当面说话,写信或者打电话,或者在小区里面的公告版
上面写信息。这些方式对应到进程里面就是,管道(当面交流), FIFO(打电话),消息
队列(写信), 共享内存(公告板)。
现在住在该小区的小明一家准备做饭,小明的爸爸负责洗菜,小明的妈妈负责炒菜,小明
负责品尝。单线程最早的时候是爸爸洗完所有的菜,妈妈才炒菜,等妈妈炒完所有的菜,小
明才能吃。这样做明显浪费了很多时间,就是cpu指令流水一样,在爸爸洗好白菜的时候,
妈妈就可以做酸辣白菜了,妈妈做完酸辣白菜,小明就可以偿酸辣白菜。
这样的效率明显高于上面的。为了提高效率,多线程就出现了,但是问题同样出现了。
爸爸洗完白菜,必须告诉妈妈白菜洗好了,妈妈炒完菜,必须告诉小明可以品尝了,这个
就是线程同步问题,线程同步指的是协同、共同完成一件事情,不是同时做一件事情。
但是妈妈做的菜,有很多种,酸辣白菜只需要白菜就可以了,但是宫保鸡丁却需要多种
食材才可以,不同的菜,需要的食材不一样,妈妈就需要和爸爸协商好才行。这就是线程的
同步问题,为了解决同步问题,锁(读写锁、自旋锁),互斥量,信号量,屏障,不同的语言
不同的实现方式,不同的操作系统也有不同的实现方式。

进程

进程在操作系统中,通过虚拟内存,保证了每个进程的虚拟空间是一样的的,在32位操作系
统中,虚拟内存被设计成4G,高2G属于内核空间,低2G属于用户空间,我们的操作主要是在
用户空间中,虚拟内存分配是从高到低的。用户空间由不同的段组成,代码段,只读数据段
数据段,BSS段。这些东西就是进程空间,是由线程共享,但是进程独立的。所以进程需要
的是进程通信。

线程

由于每个进程都需要分配空间,为了节省空间,提高效率,所以出现了多线程,但是由于
cpu是线程调度,线程调度是无序的,所以同一块内存,可能多个进程都去读写,但是由于
无序的问题,就会导致脏数据,所以需要一个机制,来协调线程,让线程按照一定的序列来
读写同一块内存,保证数据的同步。这就是同步的由于吧。个人想法哈哈。

原创粉丝点击