1、进程和线程
参考:http://blog.csdn.net/zheng548/article/details/54669908
回答这个问题的思路:为什么要有进程-->为什么要有线程-->进程与线程的区别,从定义、角色、资源共享、独立性和开销方面比较。
-
为什么要有进程?
最开始的计算机是串行运行程序的,只存在一个程序计数器,一个程序执行完毕,才会执行下一个程序。这样明显不能满足同时干很多事的需求,于是引入了进程的概念。
-
为什么要有线程?
为什么引入线程 有了进程这概念之后 应用程序可以并发地去执行了 那么为什么要在进程当中再派生出线程呢?进程有以下几个缺点:
- 进程切换的开销比较大。
- 有时候需要在一个进程中执行多个程序,实现不同的功能。
- 进程有时候性能比较低。
引入线程有哪些优点呢?
-
同一应用(进程)需要实现多个功能(线程)。
-
性能考虑,多个线程的功能不同,可以在多个处理器上同时执行。
-
开销考虑,在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)。
-
比较
- 定义上:进程是某个数据集合上的一次运行活动;线程是进程内的一个执行路径。
- 角色:进程是OS分配资源的基本单位;线程是CPU调度的基本单位。
- 资源共享方面:进程间无法共享资源,而线程共享所在进程的地址空间和其他资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
- 独立性:进程有自己的地址空间,线程没有,线程必须依附于进程而存在。
- 开销:进程切换的开销比骄大,线程现对较小。
2、进程间通信
- 管道,半双工的,数据只能单向流动,而且只能在父子进程间使用。
- 有名管道,也是半双工,但是允许无亲缘关系进程间的通信。
- 信号量,信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 消息队列,消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号, 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 共享内存,共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
- 套接字 ,套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间及其间的进程通信。
3、信号量的优缺点
- 优:PV操作能够实现对临界区的管理要求;实现简单;允许使用它的代码休眠,持有锁的时间可相对较。
- 缺:一个信号量只能置一次初值,以后只能对之进行p操作或v操作。
4、如何理解线程安全?
- 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的。
5. 进程间同步的方式
临界区、互斥量、事件、信号量四种方式。
- 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
- 2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
- 3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
- 4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .
总结:
1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。
6. 死锁原因
产生死锁的原因主要是:
1) 因为系统资源不足。
2) 进程运行推进的顺序不合适。
3) 资源分配不当等。
7. 导致死锁的必要条件
产生死锁的四个必要条件:
1) 互斥条件:一个资源每次只能被一个进程使用。
2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
8. 进程调度算法
- 先来先服务
- 时间片轮转法
- 最短进程优先
- 最短剩余时间优先
- 最高响应比优先
- 高优先权优先
- 多级反馈队列算法
9. Windows内存管理的方式
- 块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断载入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,但时易于管理。
- 页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
- 段式:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
- 段页式管理(现在常用):结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。
10. 页面置换算法
- 先进先出置换算法
- 最近最久未使用置换算法
- 时钟置换算法
- 最佳置换算法
网友评论