进程和线程

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。

    最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。

    1、计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

    

    2、假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

    

    3、进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

    

    4、一个车间里,可以有很多工人。他们协同完成一个任务。

    

    5、线程就好比车间里的工人。一个进程可以包括多个线程。

    

    6、车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

    

    7、可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

    

    8、一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

    

    9、还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

    

    10、这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

    

    11、操作系统的设计,因此可以归结为三点:
  (1)以多进程形式,允许多个任务同时运行;
  (2)以多线程形式,允许单个任务分成不同的部分运行;
  (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

    

    12、再举例:

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值