深入理解计算机操作系统(随记 比较混乱中,最好别浪费时间看)

   这本书买了挺久了,但却一直没认真看过。最近花费在游戏上的时间相对比较多。不过暂时也告一段落了,开始把一些时间转移到看书上面来。周末看了 优化的部分,书里主要举的是一个循环的取值运算的例子,确实也有不少的性能瓶颈在循环迭代上面。

 

  简单的例如:

  for(int i ; i < Max; i++)

  {

      float f = f * f * f  ;  (1)

     

      float sum += j[i] + f;

 

 }

 

相对于 把(1)提到循环外面,很明显的性能浪费。这是比较明显的优化

 

还有就是从汇编角度去分析寄存器的读写次数来观察。例如:

 

  fun(int * p)

{

   int sum;

   for(int i ; i < Max; i++)

   {

       sum = i + *p;        // 这里每次都需要对指针p取值,会发生多一次读寄存器的操作

  }

}

 

相对于:

  fun(int * p)

{

   int sum;

   int temp = *p;

   for(int i ; i < Max; i++)

   {

       sum = i + temp ;        //这样节省了操作

  }

}

 

 

现代新的cpu都是乱序执行指令的,就是说cpu从译码成指令,放到指令高速缓冲区,再发送多对应的执行单元处理并非一定是顺序的

 

 

<2>进程控制

获得进程ID: getpid

获得父进程ID:getppid

退出进程: exit

创建子进程:fork 比较有意思一次调用返回两次,在子进程中返回0,父进程则返回子进程的ID

 

等待子进程终止: waitpid  :通过status可以判断出子进程的退出状态了(是正常退出,或者因为异常等:例子:

while( pid = waitpid(-1, &status, 0)) >0)

   if(WIFEXITED(status))  //如果子进程是正常终止返回真

     ....

 

接下来是让执行中的进程休眠:调用常用的 sleep(x) 可以让进程挂起一段时间:或者直接调用pause让进程一直休眠,直到收到一个信号为止

 

*加载并运行程序: execve(filename, argv, envp);

 

*信号:更高层形式的异常,允许进程中断其它进程。不同于之前的 上下文切换(建立在以前说的:中断 故障 终止等较底层的异常之上的,操作系统利用上下文来实现多任务,就是保留一个进程的状态,切换处理另外的进程再回来)

 

linux系统有30种不同类型的信号:SIGHUP  挂起

 

*发送信号: kill -9 15213 发送信号9到进程ID:15213

alarm(x)每隔一段时间发送一个 SIGALRM信号给调用进程。如何接收信号呢:

看下面这个函数就明白了:

typedef void handler_t(int);

handler_t* signal(int signum, handler_t* handler);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值