一 概述
二 类型
三 语句
四 函数
五 数据
六 内存
七 代码
附录
2. 操作系统
操作系统管理硬件资源,装载并执行程序,提供编程接口。
体系结构
+---> Application | 硬件 -- driver -> 操作系统 -- syscall -> 运行库 -- api --+ | +---> Development Tool
应用程序编程接口(API)
libc 提供 POSIX API。
libc 是 ANSI C 定义的 C 标准库,glibc 是 GNU 的实现版本(libc.so)。
POSIX 可移植操作系统接口,IEEE(电机电子工程师协会) 为 UNIX 系统定义的一套 API 标准。Linux 基本实现了 POSIX 兼容,Windows 部分实现。使用 ltrace 跟踪标准库调用。
$ ldd ./test # 查看链接库 linux-vdso.so.1 (0x00007ffc273ba000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9c06b000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b9c268000) $ /lib/x86_64-linux-gnu/libc.so.6 # 查看 glibc 版本 GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31.
进程调度
应用程序以进程(process)方式运行在系统权限更低的级别。
Intel CPU 将特权级别分成 4 个等级:ring0、ring1、ring2、ring3。通常 ring0 操作系统内核,ring1/2 驱动程序,ring3 应用程序。CPU Rings 是一种计算机安全设计方式,分级保护。特权等级从高往低依次是:0、1、2、3。内层(比如 ring0)可以随时访问外层(ring3)资源,反之会被阻止。
CPU 资源由操作系统统一分配,每个进程按优先级获取一定量时间片(timeslice)。一旦进程执行时间超出时间片,就被操作系统暂停,转而交替执行其他进程。可以实现单核多进程并发执行,这种方式称做抢占式调度(preemptive)。
系统调用
普通进程无权访问内核数据和资源,操作系统内核通过中断为应用程序提供编程接口。
系统调用运行在内核态(kernal mode),通过中断(interrupt)从用户态(user mode)切换到内核态。中断由硬件或软件发出,要求 CPU 暂停当前工作,转而从中断向量表中查找指定中断号,并指定中断处理程序。
使用 strace 跟踪系统调用。使用 time 查看进程执行时间,其中包括内核态和用户态。
$ time command real 0m0.002s ; 命令执行耗时(wall clock)。 user 0m0.000s ; 用户态(CPU clock,多核累计)。 sys 0m0.002s ; 内核态(CPU clock)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论