我对楼上的看法不敢苟同.理由如下
OS是Windows/Linux/Unix...)
线程的挂起是主线程发出的软中断还是要在被挂起的线程中自行处理?如果是软中断,显然
是在执行完任意一条指令后都有可能被挂起。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
线程的管理只是操作系统的任务,其他线程只能透过系统调用来挂起线程,不存在什么软中断的问题,的确是线程在执行完任意一条指令就被挂起的可能,但是是由操作系统来挂起的,比如等待事件,等待信号等等,或者是时间片用完...或者是另外一个比他优先级高的线程就绪........
线程的运行我们一般都是顺序的,也就是一个过程或函数,而不是面向事件和对象。也就是说,线程一旦运行,一般就只能从头到脚运行一遍,然后结束。我们为了让线程长时间的为我们服务,只能用while,repeat等循环,用逻辑变量开关线程。
阻塞模式的效率肯定要低于非阻塞模式,理由如下:
在系统中(不管是windows还是unix),软件系统管理硬件系统最主要的就是采用中断,试想,一个操作系统拼命的去询问每个硬件系统的状态,那效率...,惨!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
错,中断不是操作系统拼命的去询问硬件系统的状态,那叫做轮询,中断是说某个事件发生的时候,cpu更具一定的条件,放下手头的工作去处理中断事件.
socket也一样,当一个数据包到达的时候,网卡势必发生一个中断信号,软件接管,接收数据,放入系统缓冲区,清空网卡上的缓冲区。如果是阻塞模式,程序得无节制的尝试读取系统缓冲区,为了不造成“死机”还得采用线程,线程之间的轮循还得消耗大量的系统资源。但是目前非阻塞模式对流量等控制就很难,远不如阻塞方便。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket在系统中当驱动程序获得一个数据包后,操作系统会自动的使数据包的目的线程(就是调用socket函数的那个线程)上面的挂起计数减少1,从而目的线程(就是调用socket函数的那个线程)进入系统中和别的就绪线程竞争CPU资源.所以在一个线程在它等待数据的时候它不耗费cpu资源.