进程
工程师写完的程序是存放在系统的磁盘中的, CPU从硬盘中读取程序到内存中运行, 这个在内存中的可执行程序实例就叫做进程.
CPU将多个程序读取到内存中运行时, 也就创建了更多的进程. 每个进程在自己内部都有一个虚拟独立的地址空间, 每个进程都以为自己独占着整个内存, 不需要关心其他进程的实际位置, 这样就把进程很好的分隔开来了.
虽然每个进程都有自己虚拟独立的地址空间, 但是为了保障系统运行安全, 虚拟地址空间被划分为用户空间和内核空间:
操作系统运行在内核空间, 用户程序运行在用户空间, 内控空间由所有进程的地址空间共享, 但是用户程序不能直接访问内核空间, 需要系统调用来访问:
操作系统保持的进程控制信息存放在内核空间, 包括页目录, 进程ID 父进程Id, 状态等.
一个程序加载到内存中运行时, 就是一个进程, 在活动管理器中可以看到包括用户进程, 系统进程, 进程的PID, 进程中的子线程数量等
线程
一个进程至少要有一个线程, 要从这个线程开始执行, 这就是主线程, 一般由父进程或操作系统创建, 而进程中的其他线程都是由主线程创建的. 比较官方的说法就是线程是程序中的一段可执行序列, 是CPU调度的基本单位.
可以将比较耗时的操作放在子线程中去执行, 创建合适的子线程去执行任务, 可以充分利用CPU资源.
在创建线程时, 操作系统会在用户空间和内核空间分别分配两段栈, 就是用户栈和内核栈, 线程切换到内核态时, 会使用内核栈, 切换到用户态时, 会使用用户栈, 为的是不允许用户代码对其修改以保证安全.
CPU的执行权被划分为不用的时间片, 因为时间片很短, 用户感觉不到线程的切换过程, 因为cpu执行的很快 即使很短的时间也可以执行很多的指令, CPU在线程之间轮流调度.
线程的状态: **
线程等待cpu的时候为就绪状态, cpu调度的时候为运行状态**, 如果线程向硬盘发起访问请求, 然后等待, 线程就会进入阻塞状态, cpu空转, 就会去调度其他线程, 当线程对硬盘的访问请求结束回来后再次进入就绪状态, 等待CPU调度.