根据现实中一个实例--线程和进程的理解


   进程(process)和线程(thread) 是所有学习计算机行业人员绕不过去的两个基本概念,但是它们却十分的抽象,十分不容易理解.

    最近总结了一个例子来解释一下,可能要好一点.

    1.我们知道,CUP是一个计算机的核心,它就像一个工厂一样,只要启动计算机,它就会一刻不停的运动.我这样假设,这个工厂的名字是xxx工厂,这个工厂里面有5个车间,车间门牌号是,"1","2","3","4","5",每个车间的标准配置(注意,是一个车间的配置)是有10个工人,有一个厕所,有一个三个床位的卧室,一个一次性可以容纳5个人的餐厅.

    2.我们假设,这个工厂只能自己发电使用,这样电量就十分有限,每次只能供工厂内的一个车间正常运行.(cpu一次只能执行一个任务)(任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。)

    3.我们假设,

  星期一:

           给车间"1"供电,现在"车间1"正常运行,这个车间生产的是茶叶蛋,它里面只有一个工人

 这时候我们就可以这样认为:

            一个车间就是一个进程.(一个任务至少有一个进程,每个进程都是拥有空间的或者说资源)

           一个工人就是一个线程(线程不具有空间或者说资源) ,这个车间有一个工人,煮茶叶蛋他一个人就可以搞定.(一个进程中至少要有一个线程).

4.

  星期二:

           给车间"2"供电,现在"车间2"正常运行,这个车间生产的是国产红旗轿车,它里面有10个工人

 这时候我们就可以这样认为:

            一个车间就是一个进程.(一个任务至少有一个进程)

           一个工人就是一个线程 ,这个车间有10个工人,生产一辆红旗轿车,需要多人共同合作才能完成.(一个进程可以包含多个线程)

           生产一辆汽车是一件很累的事情,谁累了,就可以到卧室中躺一会休息一下.因为这个卧室是车间的,也就是说这件这10个工人都可以进去--------------(一个进程的内存空间是共享的,每个线程都是可以访问这些共有的内存的)
          工作的时候,大家肯定有要上厕所的时候,可是厕所的空间是有限的呀,每次只能容纳一个人,只有你用完出来之后别人才能用.----------------(一个线程使用某些共享的内存是时,其他线程必须等待它使用完了,才能使用)
        我们都知道,上厕所的时候,内部都会有一把锁.在计算机中,这把锁是在外边的.
         我要蹲坑,于是进入厕所,然后锁上门(别问我怎么把外面的锁锁起来的),后来的人看到厕所上锁了,就会知道里面有人,就会在门口排队,等锁打开了我出来,才能再进去.--------------------这就是"互斥锁"(Mutual exclusion)缩写-Mutex,作用是防止多个线程同时读写某一块共享的内存区域.
         而卧室,一次只能容纳3个人,如果有5个人想休息,那么只能进去3个人,剩下的2个就只能在外面等待.(一些内存,只能给固定数目的线程使用).但是剩下的2个人也很想休息,于是也进去,这时候就会产生多个线程互相冲突.怎么解决呢?
    很简单:我们给这个卧室的门口放三个门卡(算是一个标志吧),进去一个人,就取走一个门卡,出来的时候放回原处.这样,后面来的人,如果发现门卡没有了,就会排队.------------------------这样的方法就是"信号量"(Semaphore)
    其实,互斥锁也是信号量的一种特殊情况,因为互斥锁简单,效率高.所以当保证资源独占的时候,采用这种设计.
  

       

    线程,是进程的一个具体实例.程序运行的最小单位,是被系统独立调度和CPU的基本运行单元

    进程是操作系统中可以并行工作的基本单元,一个应用程序有一个进程,一个进程中至少有一个线程

    多线程开发:

   就是在一个进程中,有多个线程共同存在,每个线程都在执行各自的任务,互不干扰.比如网络请求这个操作比较耗费时间,可以单独开辟线程来做这个操作.主线程继续执行其他操作,这样就会提高进程的运行效率.但是会造成系统资源的消耗,而且,万一有一个线程死掉,就会造成整个进程崩溃,而且容易引起安全问题.

   比如一个单例的访问,两个线程同时访问一个单例的实例,就会造成冲突,安全问题,所以才会在外边加上一个修饰关键字.保证安全

  iOS中的实现多线程的方法:

  NSThread: 类方法,需要开辟空间,需要手动管理.比如页面推送的时候,pop页面消失,则销毁的页面内的线程必须关闭,否则程序会崩溃

  CGD: 是4.0版本后出的,效率很高,只关心内部block的实现.含有主队列,和全局队列.也可以自己定义队列.它是基于C的API

   

使用NSOperationQueue(GCD的封装)2.0 最大并发数为1

   

你可能感兴趣的:(线程,设计,实例)