操作系统存在的意义
与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境
计算机如何通过操作系统管理硬件
1.
描述起来,用
struct
结构体
2.
组织起来,用链表或其他高效的数据结构
操作系统干的事:
内存管理,进程管理,文件管理,驱动管理
进程描述-PCB-
Process Control Block(进程控制块)
Linux
操作系统下的
PCB
是
:
task_struct
PCB的功能
- 进程状态:如运行、等待、停止等。
- 进程ID(PID):唯一标识进程的标识符。
- 程序计数器:指示进程当前正在执行的指令地址。
- CPU寄存器:保存进程运行时的CPU寄存器内容。
- 内存管理信息:包括进程的基地址、界限寄存器、页表等。
- I/O状态信息:如分配给进程的I/O设备、打开的文件列表等。
- 调度信息:如优先级、调度队列指针等。
- 会计信息:如CPU使用时间、实际使用时间、限制等。
fork(),创建子进程,并用不同的返回值标识父进程与子进程
父进程返回值为正,子进程为0,返回值为负说明出现了错误
进程的状态status:
R,运行状态,一般挺难观测,因为CPU运行很快,运行一段时间就把他溢出CPU进行等待
tips:
操作系统的进程调度
现代操作系统(如Linux)使用高效的进程调度算法(如时间片轮转或优先级调度),这些算法在多个进程间公平地分配CPU时间。这意味着即使你的进程处于活跃状态,它在CPU上的执行时间也是与其他进程共享的。进程在获取CPU时间片运行时会处于 R
状态,一旦时间片用完,就会被调度器移出CPU,等待下一次调度。这种快速的切换使得在任意给定的瞬间捕捉到进程处于 R
状态变得困难。
要想观测到R状态,需要将监视器的刷新频率调短,就可以看见进程在R与S两者反复横跳
S
睡眠状态:手动调sleep()或者等待其他的进程就会进这个状态,非常常见极容易看见
D
磁盘休眠状态:由于大量调用I/O资源进程等待出现的状态,与S状态不同,这个等待无法被中断
tips:
持续调用printf(),或者scanf()无法看见此状态。
printf(),由于缓存机制存在,其本质是先向用户空间的缓冲区中,等待缓冲区满了,或者遇到刷新符号才会输出
scanf(),运行后,进程会进入S状态,不会进行D状态
要想进入D状态,就简单的方法是使用fread或则fwrite进行大量的文件读写
T状态:按ctrl+z或者发送SIGCONT信号就行了
僵尸进程:子进程结束了,但父进程没有结束,由于父进程没有使用wait(),导致父进程不知道子进程结束了,导致子进程明明已经结束了,但依旧在父进程中有一条信息
孤儿进程:父亲完事了,子进程还没完事,父进程退出,子进程便成为了孤儿。孤儿进程会被1号进程init回收,危害不大。
PRI and NI
PRI
也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被
CPU
执行的先后顺序,此值越小
进程的优先级别越高
那
NI
呢
?
就是我们所要说的
nice
值了,其表示进程可被执行的优先级的修正数值
PRI
值越小越快被执行,那么加入
nice
值后,将会使得
PRI
变为:
PRI(new)=PRI(old)+nice
这样,当
nice
值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在
Linux
下,就是调整进程
nice
值
nice
其取值范围是
-20
至
19
,一共
40
个级别。