线程是进程的一个执行分支,是在进程内部(线程本质是在进程的地址空间内运行)运行的一个执行流。
(二)多线程程序的优缺点多线程程序作为一种多任务、并发的工作方式,有以下的优点:
1.提高应用程序响应。这对图形界面的程序尤其有意义,当一个 *** 作耗时很长时,整个系统都会等待这个 *** 作,此时程序不会响应键盘、鼠标、菜单的 *** 作,而使用多线程技术,将耗时长的 *** 作置于一个新的线程,可以避免这种尴尬的情况。
2.使多CPU系统更加有效。 *** 作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
3.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会有利于理解和修改。
LIBC中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。
创建线程 pthread_create( )
int pthread_create(
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void*),
void *arg
);
终止线程 pthread_exit( )
void pthread_exit(void *retval);
实验结果
线程可以分为分离线程(DETACHED)和非分离线程(JOINABLE)
线程分离
int pthread_detach(pthread_t thread);
线程连接
int pthread_join(pthread_t thread, void**retavl);
3.线程属性 pthread_attr
线程基本的线程属性包括:栈大小、调度策略和状态属性封装于属性结构体(pthread_attr_t结构体类型)中。
线程初始化
int pthread_attr_init(pthread_attr_t *attr);
线程销毁\
int pthread_attr_destroy(pthread_attr_t *attr);
创建与销毁函数原型静态初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态初始化
int pthread_mutex_init( );
销毁
int pthread_mutex_destroy( );
加锁
pthread_mutex_lock()
pthread_mutex_trylock()
解锁
pthread_mutex_unlock()
互斥量(Mutex),又称为互斥锁,是用来保护临界区的特殊变量,每个互斥锁内部有一个线程等待队列,保存等待该互斥锁的线程。有锁定(locked)和解锁(unlocked)状态:
(1)锁定状态,某个特定的线程正持有这个互斥锁,其他线程将阻塞在互斥锁的等待队列内;
(2)解锁状态,没有线程持有这个互斥锁,如果某个线程试图获取这个互斥锁,那么这个线程就可以得到这个互斥锁而不会阻塞。
例:
进程( process)是一个已经开始执行但还没终止的程序实例。Linux系统下使用ps命令可以查看到当前正在执行的进程。每个进程包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的执行控制流等资源。同一个程序可以实例化为多个进程实体。 *** 作系统中所有进程实体共享着计算机系统的CPU、外设等资源。
程序是个静态的文件,进程是一个动态的实体,进程的状态会在运行过程中改变,那么程序是如何变为一个进程的呢?
通常在 Shell中输入命令运行就包含了程序到进程转换的过程。整个转换过程主要包含以下3个步骤:
1.查找命令所对应程序文件的位置;
2.使用fork()函数为之创建一个新进程;
3.在新进程中调用exec族函数装载程序文件,并执行程序文件的main(函数。
Linux是一个多用户多任务的 *** 作系统,可以同时运行多个用户的多个程序,就必然会产生多进程,而每个进程都会有不同的状态。Linux的进程有以下6种状态:
D:不可中断的深度睡眠状态,处于这种状态的进程不能响应异步信号;
R:进程处于运行态或就绪状态,只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态;
S:可中断的睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂起。;
T:暂停状态或跟踪状态;
X:退出状态,进程即将被销毁;Z:退出状态,进程成为僵尸进程。
进程在运行过程中可以通过以下3种方式来获取运行环境的环境变量:
int main(int argc,char*argv[ ],char*env[ ]);
1.通过main()函数的第3个参数env获取;
3.系统信号
系统信号概念
信号(signal),即软中断,用来通知进程发生了异步事件。是较为复杂的通信方式。
一般方向:进程之间、内核给进程。
仅通知事件类型,不传递数据
收到信号后进程的处理方式
(1)忽略
(2)系统默认(大部分的信号使得进程被终止)
(3)类似中断,进程调用预先指定的、对应的函数
信号函数
(1)sigaction函数
改变信号的处理方法,SIGKILL和SIGSTO例外。
(2)Kill()函数
向指定的进程发送一个指定的信号,成功返回0,否则返回-1。
信号函数用法示例
一个线程只能是某一个进程的一部分,一个进程可以有多个线程(至少有一个主线程)
三、开发板的使用 (一)LCD屏幕/图像安装完开发板之后打开
$ ~/ubuntu-18.04_imx6ul_qemu_system/gui-qemu-imx6ull-gui.sh
输入下列命令打开LCD屏幕
$ fb-test
输入下列命令打开图像
$ ./myfb-test /dev/fb0
写入:
$ i2c_usr_test /dev/i2c-0 0x50 w 0x01 0xff #w = write
读取:
$ i2c_usr_test /dev/i2c-0 0x50 w 0x33
读取0x33位置的内容
(三)命令控制 LED打开LED控制以及安装LED驱动:
-
$ cd ~
-
$ cd led_driver_qemu/
-
$ insmod 100ask_led.ko
-
$ cd ~
-
$ cd button_driver_qemu/
-
$ insmod button_drv.ko
-
$ insmod board_100ask_qemu_imx6ull.ko
启动按钮控制:
$ ./button_led_test
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)