首先,我们明确一个观点:程序的用线程来执行的。
同步执行序
如上图用户线程执行的一段时间片,线程从起点 A 开始执行,执行用户代码到终点 B 结束,执行到 C 点需要执行系统调用,用户线程就会在 C 点阻塞,执行序进入系统内核状态,剩下的时间片在系统内核执行。
执行系统调用是操作系统内核的异步调用,系统内核的时间片是由操作系统提供的内部时间片。系统调用不使用剩下的时间片,在用户线程阻塞,剩下的用户线程的时间片被阻塞造成浪费,根据阻塞的方式有两种处理时间片流程,一种方式阻塞什么都不干,一种方式是向操作系统交还剩下时间片给其他程序或者线程执行,但是这两种方式对进程执行都会造成性能损失。
异步执行序
还有一种模式,当线程执行到 C 点执行系统调用被阻塞,异步执行系统调用,剩下来的时间片不交还,执行调度把这段时间片交给其他线程执行。当系统调用完成后利用select
、epoll
机制实现线程唤醒,唤醒后把系统调用结果返还线程。这样在同一个线程执行多个并发任务,这些并发任务在用户态完成,和操作系统无关。
例如调用open
系统调用,重新实现openAsyn