用户空间与内核空间
现在的操作系统都是基于虚拟存储器,对于32位OS来说,它的寻址空间(虚拟存储空间)为2^32=4G。操作系统的核心是内核(Kernel),独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,OS将虚拟空间划分成两部分,一部分为内核空间,一部分为用户空间。针对LinuxOS来说,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
进程切换
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
工作过程
一个运行的进程切换到另一个进程上运行,经历下面的这些变化:
- 保存处理机的上下文,包括程序计数器和其他寄存器。
- 更新PCB(process control block,进程控制块)信息。
- 把进程的PCB移入相应的队列,如就绪,在某事件阻塞等队列。
- 选择另一个进程 执行,并更新其PCB。
- 更新内存管理的数据结构。
- 恢复处理机上下文。
发生时机
- 阻塞式系统调用、虚拟地址异常,导致被中断进程进入等待态。
- 时间片中断、I/O中断后发现更改优先级进程,导致被中断进程进入就绪态。
- 终止用系统调用、不能继续执行的异常,导致被中断进程进入终止态。
进程状态
-
R(TASK_RUNNING) 可执行状态
-
S(TASK_INTERRUPTIBLE)可中断的睡眠状态
-
D(TASK_UNINTERRUPTIBLE)不可中断的睡眠状态
-
T(TASK_STOPPED or TASK_TRACED)暂停状态或跟踪状态
-
Z(TASK_DEAD - EXIT_ZOMBIE)退出状态,进程成为僵尸进程
-
X(TASK_DEAD - EXIT_DEAD)退出状态,进程即将被销毁
进程的阻塞
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作系统的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程,才可能将其转为阻塞状态。当进程进入阻塞状态后,就不再占用CPU资源。
缓存I/O
也称为标准I/O,大多数文件系统默认的I/O操作都是缓存I/O。Linux下的缓存I/O机制,操作系统会将I/O的数据缓存在文件系统的页缓存(PageCache),即数据会先拷贝到操作系统内核的缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间。这样做的缺点也显而易见,就是数据在传输过程中需要在应用程序地址空间和内核进行多次的数据拷贝,从而带来较大的CPU以及内存开销。