《Unix/Linux系统编程》第八周学习笔记
《Unix/Linux系统编程》第八周学习笔记
时钟服务函数
gettimeodfay() 获取系统时间
settimeofday() 设置系统时间
time() 以秒为单位返回当前时间
times() 获取进程执行时间
间隔定时器
gettitimer() 获取间隔定时器状态
setitimer()设置并创建定时器
三种模式
实践
gettimeofday()
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main()
{
struct timeval t;
gettimeofday(&t,NULL);
printf("sec = %ld , usec = %d\n",t.tv_sec,t.tv_usec);
printf((char*)ctime(&t.tv_sec));
return 0;
}
settimeofday()
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main()
{
struct timeval t;
t.tv_sec = 123456789;
t.tv_usec = 0;
int r = settimeofday(&t,NULL);
if(!r){
printf("settimeofdat() failed\n");
return -1;
}
gettimeofday(&t,NULL);
printf("sec = %ld , usec = %ld\n",t.tv_sec,t.tv_usec);
printf("%s",ctime(&t.tv_sec));
return 0;
}
time()
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t start , end;
start = time(NULL);
printf("start = %ld\n",start);
for(int i=0;i<123456789;i++);
end = time(NULL);
printf("end = %ld\n",end);
printf("time = %ld\n",end-start);
return 0;
}
setitimer()
#include <signal.h>
#include <stdio.h>
#include <sys/time.h>
int count = 0;
struct itimerval t;
void timer_handler(int sig)
{
printf("timer_handler: signal=%d count=%d\n", sig, ++count);
if (count>=8)
{
printf("cancel timer\n");
t.it_value.tv_sec = 0;
t.it_value.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &t, NULL);
}
}
int main()
{
struct itimerval timer;
signal(SIGVTALRM, timer_handler);
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100000; // 100000 nsec
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &timer, NULL);
printf("looping: enter Control-C to terminate\n");
while(1);
}
问题
- 中断是如何实现的?
中断的本质是处理器对外开放的实时受控接口。
一个没有中断的计算机体系是决定论的:得知某个时刻CPU和内存的全部数据状态,就可以推衍出未来的全部过程。这样的计算机无法交互,只是个加速器。
添加中断后,计算机指定了会兼容哪些外部命令,并设定服务程序,这种服务可能打断当前任务。这使得CPU“正在执行的程序”与“随时可能发生的服务”,二者形成了异步关系,外界输入的引入使得计算机程序不再是决定论。由人实时控制的中断输入,是无法预测的。再将中断响应规则化,推广开,非计算机科学人群就能控制计算机,发挥创造力。
既然硬件能干扰到CPU的正常的指令执行,那么CPU就必须能感知到干扰信号,所谓的干扰信号就是这里所说的中断信号。
CPU的工作粒度是机器指令级别,那么在每条机器指令执行结束后都会检查一下是否中断信号产生。
这里的实现可能是轮询。这就好比你在玩游戏,此时如果有人喊你的名字(中断信号)干扰你玩游戏那么你立刻就能听到
但人的大脑里有一直在轮询“有没有人喊我的名字?有没有人喊我的名字?有没有人喊我的名字?”了吗?并没有。人脑的中断检查机制是及其高效的。
CPU的硬件特性决定中断处理机制也及其高效。
当那个管脚电平变低(或者变高)的时候,cpu就会被打断,并从特定地址开始执行。
就像cpu的reset被拉低的时候一定会复位并从0地址开始执行一样,都是硬件的结构决定的。
《Unix/Linux系统编程》第八周学习笔记的更多相关文章
- Linux 内核分析第八周学习笔记
Linux 内核分析第八周学习笔记 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...
- Linux内核分析——第八周学习笔记
实验作业:进程调度时机跟踪分析进程调度与进程切换的过程 20135313吴子怡.北京电子科技学院 [第一部分]理解Linux系统中进程调度的时机 1.Linux的调度程序是一个叫schedule()的 ...
- Linux内核分析——第八周学习笔记20135308
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...
- LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程
LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- LINUX内核分析第八周学习总结
LINUX内核分析第八周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
- 《Linux内核分析》第一周学习笔记
<Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- 《Linux内核分析》第二周学习笔记
<Linux内核分析>第二周学习笔记 操作系统是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第三周学习笔记
linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
随机推荐
- [NepCTF2022]中学数学
中学数学 p.q挣扎很久没分解出来,wp出来了赶紧复现试试. 题目 from gmpy2 import * from Crypto.Util.number import * from secret i ...
- LaTex【六】表格排版—表格标题位置
LaTex中表格排版--表格描述位置调整 LaTex模板大多默认将表格描述置于表格下方,可通过修改 \caption 的位置调整. 1. 位于表格下方(默认) \begin{table}[h] \be ...
- drf从入门到飞升仙界 07
认证组件 ## 认证组件逻辑 # 1.登录认证的限制: - 访问接口,有的需要登陆后才能访问,有的接口,不登录就能访问 # 2.准备: -User表 : 存储用户名,密码 -UserToken表:存储 ...
- 基础篇之Markdown基础语法
标题 1. # + 空格 + 标题名字 → 一级标题 2. ## + 空格 + 标题名字 → 二级标题 3. ### + 空格 + 标题名字 → 三级标题 ...... 6.###### + 空格 + ...
- Docker--搭建 Gitlab 容器并上传本地项目代码
本文参考:https://www.cnblogs.com/poloyy/p/13969756.html 搭建 Gitlab 容器 搜索 gitlab 镜像 docker search gitlab 创 ...
- glibc被卸载恢复过程
问题描述:升级软件包时,rpm -e glibc --nodeps 卸载了glibc软件,glibc是系统命令库,之后一些命令不能使用,系统几近奔溃恢复步骤: 1). 挂载装系统光盘,设置从光盘启动, ...
- golang json化时允许赋予默认值
演示omitempty 代码: package main import ( "encoding/json" "fmt" ) func main() { type ...
- c#在代码中再次调用按钮点击事件
在一个按钮事件中调用另一个按钮(button1)的点击事件,可以直接如下: button1.PerformClick() 也称之为 以编程方式调用按钮的click事件
- centos-7部署kafka-v2.13.3.0.1集群
1.部署测试机器规划 ip kafka 版本 zookeeper 版本 192.168.113.132 v2.13.3.0.1 v3.6.3 192.168.113. ...
- Authentication is required to set the network proxy
在使用VNC访问集群的时候,总是弹出"Authentication is required to set the network proxy used for downloading pac ...