完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、信号
(1)信号: 信号是一种向进程发送通知,告诉其某件事情发生了的一种简单通信机制。 (2)信号的产生: ①另一个进程发送信号; ②内核发送信号; ③底层硬件发送信号。 (3)信号列表:常用信号。 信号宏名 信号编号 说明系统 默认处理方式 SIGABRT 6 终止进程,调abort函数是产生 终止,产生cre文件 SIGALRM 14 超时,调用alarm函数时产生 终止 SIGBUS 7 硬件故障 终止,产生core文件 SIGCHLD 17 子进程状态改变 忽略 SIGINT 2 终止进程(ctrl+c) 终止 SIGIO 29 异步通知信号 终止 SIGKILL 9 无条件终止一个进程,不可以被捕获或忽略 终止 SIGPIPE 13 写没有读权限的管道文件时 终止 SIGPOLL 8 轮询事件,涉及POLL机制 终止 SIGQUIT 3 终止进程(ctrl+) 终止,产生core文件 SIGSEGV 11 无效存储访问(指针错误) 终止,产生core文件 SIGTERM 15 终止,kill PID时,默认发送的就是这个信号 终止 SIGUSR1 10 用户自定义信号1 终止 SIGUSR2 12 用户自定义信号2 终止 (4)信号发送: int kill(pid_t pid, int sig); int raise(int sig); unsigned int alarm(unsigned int seconds); void abort (); (5)进程挂起pause (6)信号处理的方式: ①忽略; ②执行用户需要执行的动作(捕获); ③默认处理。 (7)信号处理API:sighandler_t signal(int signum, sighandler_t handler); 二、线程概述: (1)线程是任务调度和执行的基本单位。 (2)为什么会有线程? ①进程实现多任务的缺点: a.进程间切换的计算机资源开销很大,切换效率非常低; OS是通过虚拟内存机制来实现进程空间独立的,进程在并发运行时需要相互间的切换,切换时必然需要涉及虚拟内存机制的控制,但是虚拟内存机制比较复杂,所以在进行进程间切换时,会耗费高昂的cpu、缓存(cache)、内存等计算机资源,也非常耗费切换时间。 b.进程间数据共享的开销也很大。 当程序涉及多进程时,往往会涉及到进程间的通信,但是由于进程空间的独立性,OS提供了各种各样的通信机制,这些通信机制共同原理就是,通过OS来转发进程间的数据,但是调用OS提供的这些通信机制的函数时,这些OS函数的运行也是需要消耗相当cpu、内存等计算机资源的,同时也很耗费时间。 ②线程和进程的关系: a.线程是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程; b.同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间; c.进程退出,进程中所有线程全部退出; d.一个进程崩溃后,不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉,所以多进程要比多线程健壮; e.线程不可能完全替代进程; f. 线程拥有独立的属性: 每个线程拥有自己独立的线程ID 每个线程有独立的切换状态; 调度优先级; 有自己独立的函数栈; 自己独立的错误号; 每一个线程有自己独立的信号屏蔽字和未决信号集; 每个线程有自已独立的tack struct结构体。 (3)线程的特点: ①线程切换的开销很低(实质是函数的切换); ②线程通信机制简单(全局变量)。 (4)线程操作: ①线程函数是由谁提供的? 非OS,而是线程库libpthread.a/.so B 线程控制函数有: pthread_create、pthread_join、pthread_detach、pthread_cancel、pthread_ exit等。 ②线程库和函数手册的安装: sudo apt-get install glibc-doc 安装线程库 sudo apt get install manpages posix dev: 安装线程库的函数手册 ③线程创建 : int pthread_create(pthread_t*thread,const pthread_attr_t * attr,void *(*start_ routine)(void *),void *arg); 代码实例:创建两个次线程,主线程和两个次线程一起的向同一个文件中写"hello”“worldn” ④线程退出: 被动退出: int pthread_.cancel(pthread_t thread); 主动退出:void pthread_ exit(void retval); return返回。 注册线程退出处理函数: void pthread_ cleanup_ push(void ( routine)(void *), void * arg); void pthread_ cleanup_ pop(int execute); 单线程退出处理函数的几种条件: 如果线程是调用pthread_ exit函数退出的,也会弹栈 如果线程是被别人调用pthread_.canceI取消的,也会弹栈 注: return退出的话,是不会自动弹栈的,要弹栈的话,必须主动调动thread_ cleanup_ pop(!0)。 ⑤线程等待: 等待线程的目的: 保证线程的退出顺序:保证一个线程退出并 且回收资源后允许下一个进程退出; 回收线程退出时的资源情况:保证当前线程退出后,创建的新线程不会复用刚才退出线程的地址空间; 获得新线程退出时的结果是否正确的退出返回值,这个有点类似回收僵尸进程的wait,保证不会发生内存泄露等问题。 int pthread_join(pthread_t thread, void **retval);线程资源为什么不采用进程退出之后一起回收? ⑥线程状态: 可结合态:这种状态下的线程是能够被其他进程回收其资源或杀死的; 分离态:这种状态下的线程是不能够被其他线程回收或杀死的:它的存储资源在它终止时由系统自动释放; 默认情况下,线程被创建成可结合的! 如何避免多线程退出导致的内存泄漏? 每个可结合线程需要显示的调用pthread_join回收 将其变成分离态的线程;线程分离函数–pthread_ detach。 |
|
|
|
只有小组成员才能发言,加入小组>>
793 浏览 0 评论
1152 浏览 1 评论
2528 浏览 5 评论
2861 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2711 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1071浏览 3评论
194浏览 2评论
456浏览 2评论
369浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
454浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 19:04 , Processed in 1.187903 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号