本文目录1、嵌入式系统设计基础这门课程怎么学?2、线程中sleep方法和yeild方法的区别?3、c语言sleep用法是什么?4、怎么解决mysqlsleep线程过多的问题?5、tail 命令详解?1、嵌入式系统设计基础这门课程怎么学?1、Linux 基础安装Linux操作系统:Linux文件系统 ,Linux常用命令,Linux启动过程详解,熟悉Linux服务能够独立安装Linux操作系统,能够
嵌入式系统设计基础这门课程怎么学?
1、Linux 基础安装Linux**作系统:Linux文件系统 ,Linux常用命令,Linux启动过程详解,熟悉Linux服务能够**安装Linux**作系统,能够熟练使用Linux系统的基本命令,认识Linux系统的常用服务安装Linux**作系统,Linux基本命令实践,设置Linux环境变量,定制Linux的服务,Shell 编程基础使用vi编辑文件,使用Emacs编辑文件,使用其他编辑器。
2、Shell 编程基础
Shell简介:认识后台程序Bash编程熟悉Linux系统下的编辑环境,熟悉Linux下的各种Shell,熟练进行shell编程熟悉vi基本**作,熟悉Emacs的基本**作,比较不同shell的区别,编写一个测试服务器是否连通的shell脚本程序,编写一个查看进程是否存在的shell脚本程序,编写一个带有循环语句的shell脚本程序。
3、Linux下的 C 编程基础
linux C语言环境概述:Gcc使用方法:Gdb调试技术,Autoconf Automake Makefile,代码优化,熟悉Linux系统下的开发环境,熟悉Gcc编译器,熟悉Makefile规则编写Hello,World程序,使用make命令编译程序,编写带有一个循环的程序,调试一个有问题的程序。
4、系统开发基础
系统概述:交叉编译配置TFTP服务,配置NFS服务,下载Bootloader和内核,Linux应用软件开发流程熟悉系统概念以及开发流程,建立系统开发环境制作cross_gcc工具链,编译并下载U-boot 编译并下载Linux内核编译并下载Linux应用程序。
5、系统移植
Linux内核代码:平台相关代码分析,ARM平台介绍,平台移植的关键技术,移植Linux内核到ARM平台,了解移植的概念,能够移植Linux内核移植Linux2.6内核到arm9开发板。
6、 Linux 下串口通信
串行I/O的基本概念:Linux应用软件开发流程,Linux系统的文件和设备,与文件相关的系统调用,配置超级终端和minicom能够熟悉进行串口通信,熟悉文件I/O,编写串口通信程序,编写多串口通信程序。
7、系统中多进程程序设计
Linux系统进程概述:系统的进程特点,进程**作,守护进程,相关的系统调用了解Linux系统中进程的概念,能够编写多进程程序编写多进程程序,编写一个守护进程程序,sleep系统调用任务管理、同步与通信Linux任务概述任务调度管道、信号共享内存,任务管理 API,了解Linux系统任务管理机制,熟悉进程间通信的几种方式,熟悉Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输,编写一个使用共享内存的程序信盈达嵌入式企鹅要妖气呜呜吧久零就要。
8、系统中多线程程序设计
线程的基础知识:多线程编程方法,线程应用中的同步问题了解线程的概念,能够编写简单的多线程程序编写一个多线程程序。
9、 Linux 网络编程
网络基础知识:Linux中TCP/IP网络结构,socket编程 ,常用API函数,分析Ping命令的实现,基本UDP套接口编程,许可证管理 PPP协议GPRS,了解Linux网络体系结构,能够进行Linux环境下的socket编程,熟悉UDP协议、PPP协议,熟悉GPRS使用socket编写**服务器,使用socket编写路由器,编写许可证服务器,指出TCP和UDP的优缺点,编写一个web服务器,编写一个运行在 arm平台的网络播放器。
线程中sleep方法和yeild方法的区别?
1.sleep()方**给其他线程运行的机会,而不管其他线程的优先级,因此会给较低优先级的线程运行的机会;yeild()方法只会给优先级相同的或者比自己高的线程运行的机会.
2.sleep()方法声明抛出InterruptionException异常,而yeild()方法没有声明抛出任何异常.
3.sleep()方法比yeild()方法具有更高的可移植性.
4.sleep()方法使线程进入阻塞状态,而yeild()方法使线程进入就绪状态.
5.sleep可以指定睡眠的时间,而yeild不行。也就是说yeild调用之后,很可能马上又会回到运行状态
c语言sleep用法是什么?
使用要带上头文件:
#include <windows.h>
Sleep函数:
功 能: 执行挂起一段时间
用 法: unsigned sleep(unsigned seconds);
注意:
1.在VC中使用带上头文件#include <windows.h>,在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#include <unistd.h>
2.在VC中,Sleep中的第一个英文字符为大写的”S” ,在linux下不要大写,在标准C中是sleep, 不要大写,简单的说VC用Sleep, 别的一律使用sleep。
3.在VC中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000); 在Linux下,sleep()里面的单位是秒,而不是毫秒。
代码示例:
#include<stdio.h>
#include <windows.h>
int main()
{
int a=100;
Sleep(3000);
printf(“%d”,a);
return 0;
}
usleep函数:
功能: usleep功能把进程挂起一段时间, 单位是微秒us(百万分之一秒)。
语法: void usleep(int micro_seconds);
返回值: 无
怎么解决mysqlsleep线程过多的问题?
在MySQL 8.0 之前, 我们假设一下有一条烂SQL,
mysqlselect * from t1 order by rand() ;
以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办?
大概有以下几种解决办法:
设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。
那能不能不要杀掉而让他正常运行,但是又不影响其他的请求呢?
那mysql 8.0 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。
比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了。
为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。
那我来演示下如何使用RG。
创建一个资源组user_ytt. 这里解释下各个参数的含义,
type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。thread_priority 设置优先级。user 级优先级设置大于0。mysqlmysql> create resource group user_ytt type = user vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)
RG相关信息可以从 information_schema.resource_groups 系统表里检索。
mysqlmysql> select * from information_schema.resource_groups;+———————+———————+————————+———-+—————–+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+———————+———————+————————+———-+—————–+| USR_default | USER | 1 | 0-3 | 0 || SYS_default | SYSTEM | 1 | 0-3 | 0 || user_ytt | USER | 1 | 0-1 | 19 |+———————+———————+————————+———-+—————–+3 rows in set (0.00 sec)
我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。
mysql> show processlist;+—–+—————–+———–+——+———+——-+————————+———————————————————–+| Id | User | Host | db | Command | Time | State | Info |+—–+—————–+———–+——+———+——-+————————+———————————————————–+| 4 | event_scheduler | localhost | NULL | Daemon | 10179 | Waiting on empty queue | NULL || 240 | root | localhost | ytt | Query | 101 | Creating sort index | select guid from t1 group by left(guid,8) order by rand() || 245 | root | localhost | ytt | Query | 0 | starting | show processlist |+—–+—————–+———–+——+———+——-+————————+———————————————————–+3 rows in set (0.00 sec)
找到连接240对应的thread_id。
mysqlmysql> select thread_id from performance_schema.threads where processlist_id = 240;+———–+| thread_id |+———–+| 278 |+———–+1 row in set (0.00 sec)
给这个线程278赋予RG user_ytt。没报错就算成功了。
mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)
当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:
mysqlmysql> select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()….8388602 rows in set (4 min 46.09 sec)
RG的限制:
Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICEmysql 线程池开启后RG失效。freebsd,solaris 平台thread_priority 失效。目前只能绑定CPU,不能绑定其他资源。
tail 命令详解?
tail是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然就是看档案的结尾。
Linux命令:显示文件结尾
命令格式;
tail[必要参数][选择参数][文件]
命令功能:
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
功能,用法
标准语法
tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]
命令参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
–pid=PID 与-f合用,表示在进程ID,PID**掉之后结束.
-q, –quiet, –silent 从不输出给出文件名的首部
-s, –sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
其他信息
Head/Tail
显示文件前部
displays the first 6 lines of a file:
$ head -6 readme.txt
显示文件后部
displays the last 25 lines of a file:
$ tail -25 mail.txt
范例一是显示档案的前 6 行,范例二则是显示档案最后的 25 行。
而下面的范别,结合了 head 与 tail 的指令,显示档案的第 11 行到第 20 行:
文件信息
$ head -20 file | tail -10
在 tail 的使用手册页中显示了比 head 还多的可用参数,其中有一个很好用的参数 " -f ",使用此参数时,tail 不会回传结束信号,除非我们去自行去中断它;相反的,它会一直等待一段时间,一直到他发现资料自它最后一次被读取后,又被加入新的一行时:
display ongoing updates to the given log file:
$ tail -f /usr/tmp/logs/daemon_log.txt
上述范例可以动态显示该 log 文件的动态更新。
假设该服务程序是一直不断的加入动态资料到/usr/adm/logs/daemon_log.txt的 log 文件里,在命令列控制窗口中使用 tail -f,它将会以一定的时间实时**该档的所有更新。
( -f 的只有在其输入为档案时才能使用 )。
假如你在 tail 后下了多个档案参数,你便能在同一个窗口内一次**数个 log 档:
track the mail log and the server error log at the same time:
原创文章,作者:小编,如若转载,请注明出处:http://www.wangguangwei.com/1138.html