您的位置:首页 > 其它

线程进程/同步异步

2013-10-01 13:22 351 查看
1.线程 VS 进程

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。

一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,在多线程OS中,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体,在多线程OS中,进程不是可执行的实体。

 区别:(1)划分尺度:线程粒度更小,所以多线程程序并发行更高。(2)资源分配(包括地址空间):进程是资源分配的最小单位,进程间相互独立,子进程和父进程拥有不同的代码和数据空间,而同一进程的各线程间共享其资源,某进程内的线程在其它进程不可见。(3)处理器调度:线程是CPU调度的基本单位(4)执行:每个线程有一个程序运行的入口,顺序执行序列和程序的出口,但是线程不能单独执行,必须组成进程。(5)调度和切换:线程上下文切换要比进程快的多。一个程序必须至少有一个进程,一个进程必须至少有一个线程(主线程)。

2.同步 VS 异步

同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制

同步:同步的情况下,是由待处理消息者自己去等待消息是否被触发,同步是阻塞模式。是发送方发出数据后,等接接收方发回响应以后才发送下一个数据包的通讯方式

异步:由触发机制来通知处理消息者,等待过程中待处理消息者可以去完成其它的事情,直到事件触发。是发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式

举个例子:普通B/S模式(同步)AJAX技术(异步)
同步:提交请求->等待服务器处理->处理完返回 这个期间客户端浏览器不能干任何事
异步请求通过事件触发->服务器处理(这时浏览器仍然可以作其他事情)->处理完毕
参考链接:http://www.cppblog.com/converse/archive/2009/05/13/82879.html http://blog.csdn.net/lovejavaydj/article/details/4645439

3.异步 VS 多线程

异步是目的,多线程是实现异步的手段,除了多线程的方式,异步还可以通过将任务交给其他的进程处理来实现。

4.同步 VS 互斥

相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。
显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!
总结:互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

同步互斥实现方法:(参考文章)

1.事件(Event):用来通知线程有一些事件已发生,从而启动后继任务的开始。核心态

2.信号量(Semaphore):为控制一个具有有限数量用户资源而设计。 核心态

3.临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。用户态

4.互斥量(Mutex):为协调共同对一个共享资源的单独访问而设计的。核心态

核心态可以跨进程,用户态不行

http://www.cppblog.com/suiaiguo/archive/2009/07/24/91045.html http://blog.csdn.net/morewindows/article/details/7445233

5.Linux进程/线程通信

参考文章:http://zongtongyi.blogbus.com/logs/2660173.html

Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal),套接字(Socket).
(1) 管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间进行通信;
(2) 命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建;
(3) 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD即能实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数的功能);信号实现同主机进程异步通信。
(4) 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它;
(5) 消息队列(message queue):消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能传输无格式字节流以及缓冲区大小受限等缺点;
(6) 信号量(semaphore):信号量主要作为进程间以及同进程不同线程之间的同步手段;
(7) 共享内存 (shared memory):它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥;
(8) 套接字(Socket):它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信。起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐