当前位置: 首页 > news >正文

移动端网站建设的尺寸汕头网站设计价格

移动端网站建设的尺寸,汕头网站设计价格,网上银行,网站建设开发有限公司文章目录 1、可重入函数2、volatile关键字3、如何理解编译器的优化4、SIGCHLD信号 1、可重入函数 两个执行流都执行一个函数时#xff0c;这个函数就被重入了。比如同一个函数insert#xff0c;在main中执行时#xff0c;这个进程时间片到了#xff0c;嵌入了内核#xf… 文章目录 1、可重入函数2、volatile关键字3、如何理解编译器的优化4、SIGCHLD信号 1、可重入函数 两个执行流都执行一个函数时这个函数就被重入了。比如同一个函数insert在main中执行时这个进程时间片到了嵌入了内核然后再执行另一个函数这个函数里也调用了insert当它执行完代码后又回到main继续刚才的位置这就相当于insert被重复进入了会导致一些问题。这也就说明insert是不可重入函数如果重入后没有问题那就是可重入函数。可重入是函数的一个特性。 如果一个函数内部使用了全局性的数据结构那么这个函数通常是不可重入的比如malloc标准IO库的大多数函数都是不可重入含糊。如果一个函数里只有一些局部变量那就可以重入 2、volatile关键字 #include stdio.h #include signal.hint quit 0;void handler(int signo) {printf(change quit from 0 to 1\n);quit 1; }int main() {signal(2, handler);while(!quit);//这里故意没有携带while的代码块故意让编译器认为在main中quit只会被检测printf(man quit 正常\n);return 0; } 像这样的代码可以发现如果如果不执行handlerwhile那里就会死循环而执行handler后while就结束就打印正常的语句。 但是实际上gcc编译的时候是有一些编译级别的它就做优化。 mysignal:mysignal.cgcc -o mysignal mysignal.cc -O2 .PHONY:clean clean:rm -f mysignal每个编译器做的优化不一样分别试试O1 O2 O3 O0等这些选项运行起来后当我们发送2号信号也就是Ctrl C如果能退出打印man quit正常那就说明你的编译器优化级别是当前设置的这个级别。 这怎么优化得这样一份简单的代码为什么要做优化呀如果按Ctrl C没有退出的时候一直按一直会打印change quit from 0 to 1但quit貌似没有变成1要不然就退出了。所以现在有很多问题慢慢来。 CPU的运算有两种算术运算和逻辑运算这两个顾名思义。所有的运算都要在CPU里那么到了while循环这里存在物理内存的quit全局变量要load到CPU的寄存器交给CPU去做逻辑判断把结果告知whileCPU里还有PC指针指向这个程序的代码和数据如果while条件成立那就继续执行while的代码如果不成立PC指针就指向下一行代码也就是printf那里。 改了信号处理动作后收到信号quit就变成1了然后再次load到内存再判断就会退出了。 对于这个代码编译器对它的优化在于main函数块里只是判断quit每一次while判断判断完后又回到代码然后再次将quit放到寄存器中再去判断所以编译器就在编译代码时把quit放进寄存器后就只在寄存器判断不再回到内存中再次load了。这也就是编译器对它的优化以后只需要看寄存器中的数据就好了。所以quit即使在内存中被改变了寄存器也看不到。 所以编译器优化不一定好CPU只看到寄存器的数据而看不到内存的这就是内存位置不可见。那么为了让CPU每一次都从内存中读取数据不用寄存器的数据就得用volatile关键字。 volatile int quit 0; 这个关键字的作用就是保证内存可见性。 3、如何理解编译器的优化 编译器的本质是在代码上动手脚。 CPU其实很笨用户给什么就执行什么代码。相反操作系统才是很聪明的。 刚才的代码中如果没优化代码在转为汇编代码前先把内存的某个数据先放到寄存器中再放到另一个寄存器中然后逻辑反一下再检测后面放的那个寄存器中的数据即可条件满足就跳转到循环继续检测如果不满足就运行后面的代码如果优化了那么循环就从逻辑反开始而不是load内存数据开始所以重复循环它只能看到最一开始的那个数据即使后面数据改了也看不到了因为会发现在循环中不需要改数据改数据是在内存中改的所以就直接这样优化了。 4、SIGCHLD信号 在之前我们知道父进程会阻塞式等待或者非阻塞式轮询来得知子进程退出这两个方法都需要父进程主动检测这是因为子进程退出了父进程不知道。但是这可不是因为子进程只管自己什么也不说地退出了。 子进程会在结束进程后给父进程发送SIGCHLD信号只不过父进程默认忽略这个信号。 waitpid的第一个参数也可以这样写。 测试代码 #include stdio.h #include stdlib.h #include sys/types.h #include uhistd.h #include signal.h pid_t id;void handler(int signo) {sleep(5);printf(捕捉到一个信号: %d, who: %d\n, signo. getpid());pid_t res waitpid(-1, NULL, 0);if(res 0){printf(wait success, res: %d, id: %d\n, res, id);} }int main() {signal(SIGCHLD, handler);id fork();if(id 0){int cnt 5;while(cnt){printf(我是子进程我的pid: %d, ppid: %d\n, getpid(), getppid());sleep(1);--cnt;}exit(1);}while(1){sleep(1);}return 0; } 另开一个窗口用这行命令while :; do ps axj | head -1 ps axj | grep mysignal; echo “################”; sleep 1; done每隔一行检查一下ehco后双引号的内容可自定义。 但是这个代码有问题如果说子进程是循环创建了10个那么这10个子进程依次退出退出的时候第一个把父进程的pending位对应位置变为1但是父进程忽略然后第二个也重复置为1这就相当于第一个的信号丢失了这个代码运行起来后就会发现只有几个被回收了。所以handler里面的回收也要有循环。 while(1){pid_t res waitpid(-1, NULL, 0);if(res 0){printf(wait success, res: %d, id: %d\n, res, id);}else break;}int i 1;for(; i 10; i){id fork();if(id 0){int cnt 5;while(cnt){printf(我是子进程我的pid: %d, ppid: %d\n, getpid(), getppid());sleep(1);--cnt;}exit(1);}}-1的意思就是等待任意一个子进程直到没有可回收的就结束了。但如果不是所有的进程都会退呢比如每个进程的运行时间不一样有5个退了5个没退回收5个后第6个还会继续回收吗还会继续回收这样就变回了阻塞式等待。把waitpid的0换成WNOHANG也就是非阻塞式。 要想不产生僵尸进程还有另外一种方法父进程调用sigaction将SIGCHLD的处理动作置为SIG_IGN这样fork出来的子进程在终止时会自动清理掉。 整体代码 #include stdio.h #include stdlib.h #include sys/types.h #include uhistd.h #include signal.h pid_t id;void handler(int signo) {printf(捕捉到一个信号: %d, who: %d\n, signo. getpid());sleep(5);while(1){pid_t res waitpid(-1, NULL, WNOHANG);if(res 0){printf(wait success, res: %d, id: %d\n, res, id);}else break;}printf(handler done\n); }int main() {//signal(SIGCHLD, handler);signal(SIGCHLD, SIG_IGN);int i 1;for(; i 10; i){id fork();if(id 0){int cnt 5;while(cnt){printf(我是子进程我的pid: %d, ppid: %d\n, getpid(), getppid());sleep(1);--cnt;}exit(1);}}while(1){sleep(1);}return 0; }本身父进程就会忽略这个信号那为什么还要这样写出来如果这样写的话会修改父进程pcb的状态位子进程继承过去然后按照这个办法就执行了因为这相当于系统调用会修改pcb。但是这个只在Linux中有效不保证其他Unix系统上可用。 结束。
http://www.ho-use.cn/article/10819607.html

相关文章:

  • 推荐郑州网站建设公司优秀vi设计网站
  • 公司网站建设外包流程图湖南宁乡建设局网站
  • 电子商务网站建设培训课件中国最新军事新闻最新消息视频
  • 外贸营销网站建设介绍在哪进入网站后台
  • 天津营销类网站设计做fpga的网站
  • 网站搭建实训总结知乎怎么申请关键词推广
  • 青海省wap网站建设公司网站建设需要哪些条件
  • 台州网站制作 外贸邢台网站建设的公司
  • 深圳分销网站设计无锡企业网站制作一般多少钱
  • 做直播网站用什么程序江苏建设网站
  • 深圳福田区区住房和建设局网站黑龙江做网站
  • 网站建设技术规范及要求抖音搜索seo排名优化
  • 哪个网站好项目建设综述
  • 做网站需要掌握的软件制作官网的公司推荐
  • 台州建设信息港网站北京网站推广优化公司
  • 百度站长验证网站失败网站优化建设桂林
  • 如何查询网站后台地址外贸做那种网站
  • 网站建设与维护 pdf旺道seo怎么优化网站
  • 亦庄网站建设公司网站搜索排名查询
  • 网站建设 麻烦吗网页设计工资一般多少钱一小时
  • 备案ip 查询网站查询网站查询广告图案大全图片
  • 建设网站专业360的网站怎么做
  • 九江网站建设排行榜深圳高端品牌网站建设
  • 陕西富通建设有限公司网站山西省财政厅网站三基建设专栏
  • 迷你主机做网站服务器北京高端网站制作
  • 网站 技术广州最好的网站建设
  • 怎样做站长建网站seo关键词的优化技巧
  • 公司网站空间怎么续费小程序多用户商城源码
  • 漯河城乡建设管理局网站怎样做免费网站
  • 甘肃省住房建设厅户网站制作招商加盟网站