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

移动端网站建设的尺寸电商手机网站开发

移动端网站建设的尺寸,电商手机网站开发,电子商务seo实训总结,网页设计师考试内容文章目录 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.hkea.cn/news/14361109/

相关文章:

  • 怎么写网站微信公众号文章wordpress
  • 网站备案申请模板网站开发会计处理
  • 论文网站建设怎么网站搜索排名优化
  • 专门更新最新设计的网站网站做ulr跳转
  • 网站城市切换代码互联网时代
  • 网站建设合同需注意什么品牌网站建设有什么作用
  • 沧州网站优化列表主题wordpress
  • 网站服务器建设价格市城乡规划建设局网站
  • 新的网站建设一般多少钱昆山做网站找文博
  • 湖南省长沙建设工程造价站网站隆昌市住房和城乡建设厅网站
  • 网站建设用什么软件做十大资本投资公司
  • 网站建设首页模板下载网站群建设成本分析
  • 人网站建站seo网站策划书
  • 网站建设人员分布wordpress默认的后台账号密码
  • 天津企业网站建站模板网站欢迎界面设计
  • 建设银行网站网页丢失烟台网站的优化
  • 老鹰网网站建设广州本地做网站
  • 有没有学做蛋糕的网站和视频深圳交易服务中心官网
  • 重庆网站制作设计公司免费推广网站2022
  • wordpress网站实例网络工程师培训班哪里
  • 企业中英文网站建设网站开发用户名不存在
  • 发布一个网站要多少钱电子商务网站建设核心是
  • 找人建设网站如何把做的网站发布到网上
  • 深圳免费网站排名优化中国网站建设市场分析报告
  • 海口网站建设价格怎么在百度上做推广上首页
  • 邢台市网站制作 网站建设网站开发的软件有哪些
  • 现在网站开发和软件开发天津经济持续恢复
  • 关于建设工程资质网站苏宁易购网站建设 的定位
  • 协会网站建设方案书网站设计一般多少钱一个页面
  • 扬州开发区建设局网站html网站设计作品